Version in base suite: 131.0.6778.139-1~deb12u1 Version in overlay suite: 132.0.6834.110-1~deb12u1 Base version: chromium_132.0.6834.110-1~deb12u1 Target version: chromium_132.0.6834.159-1~deb12u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/c/chromium/chromium_132.0.6834.110-1~deb12u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/c/chromium/chromium_132.0.6834.159-1~deb12u1.dsc /srv/release.debian.org/tmp/KMaXv81MMw/chromium-132.0.6834.159/chromecast/app/resources/shell_speaker_icon.png |binary /srv/release.debian.org/tmp/KMaXv81MMw/chromium-132.0.6834.159/chromecast/browser/android/apk/res/drawable-hdpi/ic_notification_cast.png |binary /srv/release.debian.org/tmp/KMaXv81MMw/chromium-132.0.6834.159/chromecast/browser/android/apk/res/drawable-hdpi/ic_settings_cast.png |binary /srv/release.debian.org/tmp/KMaXv81MMw/chromium-132.0.6834.159/chromecast/browser/android/apk/res/drawable-mdpi/ic_notification_cast.png |binary /srv/release.debian.org/tmp/KMaXv81MMw/chromium-132.0.6834.159/chromecast/browser/android/apk/res/drawable-mdpi/ic_settings_cast.png |binary /srv/release.debian.org/tmp/KMaXv81MMw/chromium-132.0.6834.159/chromecast/browser/android/apk/res/drawable-xhdpi/ic_notification_cast.png |binary /srv/release.debian.org/tmp/KMaXv81MMw/chromium-132.0.6834.159/chromecast/browser/android/apk/res/drawable-xhdpi/ic_settings_cast.png |binary /srv/release.debian.org/tmp/KMaXv81MMw/chromium-132.0.6834.159/chromecast/browser/android/apk/res/drawable-xxhdpi/ic_notification_cast.png |binary /srv/release.debian.org/tmp/KMaXv81MMw/chromium-132.0.6834.159/chromecast/browser/android/apk/res/drawable-xxhdpi/ic_settings_cast.png |binary /srv/release.debian.org/tmp/KMaXv81MMw/chromium-132.0.6834.159/chromecast/browser/android/apk/res/drawable-xxxhdpi/ic_notification_cast.png |binary /srv/release.debian.org/tmp/KMaXv81MMw/chromium-132.0.6834.159/chromecast/browser/android/apk/res/drawable-xxxhdpi/ic_settings_cast.png |binary chromium-132.0.6834.159/DEPS | 4 chromium-132.0.6834.159/ash/strings/ash_strings_de.xtb | 2 chromium-132.0.6834.159/ash/strings/ash_strings_es-419.xtb | 2 chromium-132.0.6834.159/ash/strings/ash_strings_es.xtb | 6 chromium-132.0.6834.159/ash/strings/ash_strings_iw.xtb | 54 chromium-132.0.6834.159/ash/strings/ash_strings_nl.xtb | 6 chromium-132.0.6834.159/ash/strings/ash_strings_pt-BR.xtb | 2 chromium-132.0.6834.159/ash/strings/ash_strings_ru.xtb | 4 chromium-132.0.6834.159/ash/strings/ash_strings_sr-Latn.xtb | 8 chromium-132.0.6834.159/ash/strings/ash_strings_sr.xtb | 8 chromium-132.0.6834.159/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb | 2 chromium-132.0.6834.159/build/util/LASTCHANGE | 2 chromium-132.0.6834.159/build/util/LASTCHANGE.committime | 2 chromium-132.0.6834.159/chrome/VERSION | 2 chromium-132.0.6834.159/chrome/app/resources/chromium_strings_iw.xtb | 6 chromium-132.0.6834.159/chrome/app/resources/chromium_strings_ru.xtb | 2 chromium-132.0.6834.159/chrome/app/resources/generated_resources_ar.xtb | 4 chromium-132.0.6834.159/chrome/app/resources/generated_resources_as.xtb | 2 chromium-132.0.6834.159/chrome/app/resources/generated_resources_bs.xtb | 4 chromium-132.0.6834.159/chrome/app/resources/generated_resources_ca.xtb | 2 chromium-132.0.6834.159/chrome/app/resources/generated_resources_de.xtb | 4 chromium-132.0.6834.159/chrome/app/resources/generated_resources_en-GB.xtb | 2 chromium-132.0.6834.159/chrome/app/resources/generated_resources_es-419.xtb | 2 chromium-132.0.6834.159/chrome/app/resources/generated_resources_es.xtb | 8 chromium-132.0.6834.159/chrome/app/resources/generated_resources_et.xtb | 2 chromium-132.0.6834.159/chrome/app/resources/generated_resources_eu.xtb | 2 chromium-132.0.6834.159/chrome/app/resources/generated_resources_fa.xtb | 6 chromium-132.0.6834.159/chrome/app/resources/generated_resources_fr.xtb | 4 chromium-132.0.6834.159/chrome/app/resources/generated_resources_gl.xtb | 2 chromium-132.0.6834.159/chrome/app/resources/generated_resources_id.xtb | 2 chromium-132.0.6834.159/chrome/app/resources/generated_resources_it.xtb | 8 chromium-132.0.6834.159/chrome/app/resources/generated_resources_iw.xtb | 148 chromium-132.0.6834.159/chrome/app/resources/generated_resources_ja.xtb | 4 chromium-132.0.6834.159/chrome/app/resources/generated_resources_kn.xtb | 2 chromium-132.0.6834.159/chrome/app/resources/generated_resources_mk.xtb | 2 chromium-132.0.6834.159/chrome/app/resources/generated_resources_or.xtb | 2 chromium-132.0.6834.159/chrome/app/resources/generated_resources_pl.xtb | 2 chromium-132.0.6834.159/chrome/app/resources/generated_resources_pt-BR.xtb | 14 chromium-132.0.6834.159/chrome/app/resources/generated_resources_ru.xtb | 6 chromium-132.0.6834.159/chrome/app/resources/generated_resources_sl.xtb | 4 chromium-132.0.6834.159/chrome/app/resources/generated_resources_ur.xtb | 2 chromium-132.0.6834.159/chrome/app/resources/generated_resources_vi.xtb | 6 chromium-132.0.6834.159/chrome/app/resources/generated_resources_zh-TW.xtb | 16 chromium-132.0.6834.159/chrome/app/resources/google_chrome_strings_iw.xtb | 6 chromium-132.0.6834.159/chrome/app/resources/google_chrome_strings_pt-BR.xtb | 6 chromium-132.0.6834.159/chrome/app/resources/google_chrome_strings_ru.xtb | 2 chromium-132.0.6834.159/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_iw.xtb | 60 chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb | 2 chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb | 2 chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb | 6 chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb | 2 chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb | 2 chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb | 2 chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb | 12 chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb | 2 chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb | 10 chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb | 2 chromium-132.0.6834.159/chrome/chrome_branch_deps.json | 31 chromium-132.0.6834.159/chromecast/DEPS | 14 chromium-132.0.6834.159/chromecast/DIR_METADATA | 6 chromium-132.0.6834.159/chromecast/OWNERS | 20 chromium-132.0.6834.159/chromecast/README.md | 24 chromium-132.0.6834.159/chromecast/activity/queryable_data_host.h | 28 chromium-132.0.6834.159/chromecast/android/DEPS | 4 chromium-132.0.6834.159/chromecast/android/OWNERS | 5 chromium-132.0.6834.159/chromecast/android/lint-baseline.xml | 55 chromium-132.0.6834.159/chromecast/android/lint-suppressions.xml | 67 chromium-132.0.6834.159/chromecast/app/DEPS | 21 chromium-132.0.6834.159/chromecast/app/android/DEPS | 7 chromium-132.0.6834.159/chromecast/app/android/OWNERS | 1 chromium-132.0.6834.159/chromecast/app/android/cast_browser_module_entrypoint.cc | 18 chromium-132.0.6834.159/chromecast/app/android/cast_crash_reporter_client_android.cc | 86 chromium-132.0.6834.159/chromecast/app/android/cast_crash_reporter_client_android.h | 45 chromium-132.0.6834.159/chromecast/app/android/cast_crash_uploader_android.cc | 129 chromium-132.0.6834.159/chromecast/app/android/cast_crash_uploader_android.h | 54 chromium-132.0.6834.159/chromecast/app/android/cast_jni_loader.cc | 22 chromium-132.0.6834.159/chromecast/app/cast_crash_uploader.h | 24 chromium-132.0.6834.159/chromecast/app/cast_crash_uploader_default.cc | 22 chromium-132.0.6834.159/chromecast/app/cast_crash_uploader_default.h | 21 chromium-132.0.6834.159/chromecast/app/cast_main.cc | 14 chromium-132.0.6834.159/chromecast/app/cast_main_delegate.cc | 363 chromium-132.0.6834.159/chromecast/app/cast_main_delegate.h | 75 chromium-132.0.6834.159/chromecast/app/cast_test_launcher.cc | 66 chromium-132.0.6834.159/chromecast/app/linux/cast_crash_reporter_client.cc | 68 chromium-132.0.6834.159/chromecast/app/linux/cast_crash_reporter_client.h | 38 chromium-132.0.6834.159/chromecast/app/linux/cast_crash_reporter_client_unittest.cc | 152 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_am.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ar.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_bg.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_bn.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ca.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_cs.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_da.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_de.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_el.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_en-GB.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_es-419.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_es.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_et.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_fa.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_fi.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_fil.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_fr.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_gu.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_he.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_hi.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_hr.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_hu.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_id.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_it.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ja.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_kn.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ko.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_lt.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_lv.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ml.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_mr.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ms.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_nb.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_nl.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_pl.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_pt-BR.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_pt-PT.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ro.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ru.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_sk.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_sl.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_sr.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_sv.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_sw.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ta.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_te.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_th.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_tr.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_uk.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_vi.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_zh-CN.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_zh-TW.xtb | 5 chromium-132.0.6834.159/chromecast/app/resources/shell_devtools_discovery_page.html | 57 chromium-132.0.6834.159/chromecast/app/verify_cast_locales.py | 61 chromium-132.0.6834.159/chromecast/base/DEPS | 4 chromium-132.0.6834.159/chromecast/base/OWNERS | 1 chromium-132.0.6834.159/chromecast/base/alarm_manager.cc | 104 chromium-132.0.6834.159/chromecast/base/alarm_manager.h | 132 chromium-132.0.6834.159/chromecast/base/alarm_manager_unittest.cc | 497 chromium-132.0.6834.159/chromecast/base/android/OWNERS | 1 chromium-132.0.6834.159/chromecast/base/android/dumpstate_writer.cc | 24 chromium-132.0.6834.159/chromecast/base/android/dumpstate_writer.h | 26 chromium-132.0.6834.159/chromecast/base/android/system_time_change_notifier_android.cc | 32 chromium-132.0.6834.159/chromecast/base/android/system_time_change_notifier_android.h | 34 chromium-132.0.6834.159/chromecast/base/bind_to_task_runner.h | 54 chromium-132.0.6834.159/chromecast/base/bitstream_audio_codecs.cc | 85 chromium-132.0.6834.159/chromecast/base/bitstream_audio_codecs.h | 46 chromium-132.0.6834.159/chromecast/base/cast_constants.cc | 11 chromium-132.0.6834.159/chromecast/base/cast_constants.h | 14 chromium-132.0.6834.159/chromecast/base/cast_features.cc | 357 chromium-132.0.6834.159/chromecast/base/cast_features.h | 80 chromium-132.0.6834.159/chromecast/base/cast_features_internal.cc | 13 chromium-132.0.6834.159/chromecast/base/cast_features_unittest.cc | 306 chromium-132.0.6834.159/chromecast/base/cast_paths.cc | 117 chromium-132.0.6834.159/chromecast/base/cast_paths.h | 40 chromium-132.0.6834.159/chromecast/base/cast_resource.cc | 23 chromium-132.0.6834.159/chromecast/base/cast_resource.h | 105 chromium-132.0.6834.159/chromecast/base/cast_sys_info_android.cc | 128 chromium-132.0.6834.159/chromecast/base/cast_sys_info_android.h | 55 chromium-132.0.6834.159/chromecast/base/cast_sys_info_android_factory.cc | 16 chromium-132.0.6834.159/chromecast/base/cast_sys_info_dummy.cc | 202 chromium-132.0.6834.159/chromecast/base/cast_sys_info_dummy.h | 79 chromium-132.0.6834.159/chromecast/base/cast_sys_info_shlib.cc | 27 chromium-132.0.6834.159/chromecast/base/cast_sys_info_util.h | 19 chromium-132.0.6834.159/chromecast/base/cast_sys_info_util_shlib.cc | 20 chromium-132.0.6834.159/chromecast/base/cast_sys_info_util_simple.cc | 18 chromium-132.0.6834.159/chromecast/base/chromecast_switches.cc | 343 chromium-132.0.6834.159/chromecast/base/chromecast_switches.h | 156 chromium-132.0.6834.159/chromecast/base/component/component.cc | 426 chromium-132.0.6834.159/chromecast/base/component/component.h | 327 chromium-132.0.6834.159/chromecast/base/component/component_internal.h | 118 chromium-132.0.6834.159/chromecast/base/component/component_unittest.cc | 387 chromium-132.0.6834.159/chromecast/base/device_capabilities.h | 257 chromium-132.0.6834.159/chromecast/base/device_capabilities_impl.cc | 418 chromium-132.0.6834.159/chromecast/base/device_capabilities_impl.h | 123 chromium-132.0.6834.159/chromecast/base/device_capabilities_impl_unittest.cc | 649 chromium-132.0.6834.159/chromecast/base/error_codes.cc | 84 chromium-132.0.6834.159/chromecast/base/error_codes.h | 44 chromium-132.0.6834.159/chromecast/base/error_codes_unittest.cc | 71 chromium-132.0.6834.159/chromecast/base/hash_util.cc | 149 chromium-132.0.6834.159/chromecast/base/hash_util.h | 34 chromium-132.0.6834.159/chromecast/base/hash_util_test.cc | 59 chromium-132.0.6834.159/chromecast/base/init_command_line_shlib.cc | 30 chromium-132.0.6834.159/chromecast/base/init_command_line_shlib.h | 32 chromium-132.0.6834.159/chromecast/base/java/OWNERS | 1 chromium-132.0.6834.159/chromecast/base/legacy_app_id_mapper.h | 20 chromium-132.0.6834.159/chromecast/base/legacy_app_id_mapper_dummy.cc | 19 chromium-132.0.6834.159/chromecast/base/metrics/cast_histograms.h | 44 chromium-132.0.6834.159/chromecast/base/metrics/cast_metrics_helper.cc | 360 chromium-132.0.6834.159/chromecast/base/metrics/cast_metrics_helper.h | 197 chromium-132.0.6834.159/chromecast/base/metrics/cast_metrics_helper_unittest.cc | 191 chromium-132.0.6834.159/chromecast/base/metrics/grouped_histogram.cc | 190 chromium-132.0.6834.159/chromecast/base/metrics/grouped_histogram.h | 25 chromium-132.0.6834.159/chromecast/base/metrics/mock_cast_metrics_helper.cc | 15 chromium-132.0.6834.159/chromecast/base/metrics/mock_cast_metrics_helper.h | 50 chromium-132.0.6834.159/chromecast/base/observer.h | 431 chromium-132.0.6834.159/chromecast/base/observer_unittest.cc | 352 chromium-132.0.6834.159/chromecast/base/path_utils.cc | 55 chromium-132.0.6834.159/chromecast/base/path_utils.h | 31 chromium-132.0.6834.159/chromecast/base/path_utils_unittest.cc | 56 chromium-132.0.6834.159/chromecast/base/pref_names.cc | 42 chromium-132.0.6834.159/chromecast/base/pref_names.h | 24 chromium-132.0.6834.159/chromecast/base/process_types.h | 17 chromium-132.0.6834.159/chromecast/base/process_utils.cc | 45 chromium-132.0.6834.159/chromecast/base/process_utils.h | 22 chromium-132.0.6834.159/chromecast/base/process_utils_unittest.cc | 52 chromium-132.0.6834.159/chromecast/base/reactive_java.md | 1293 - chromium-132.0.6834.159/chromecast/base/scoped_temp_file.cc | 37 chromium-132.0.6834.159/chromecast/base/scoped_temp_file.h | 48 chromium-132.0.6834.159/chromecast/base/statistics/weighted_mean.cc | 35 chromium-132.0.6834.159/chromecast/base/statistics/weighted_mean.h | 45 chromium-132.0.6834.159/chromecast/base/statistics/weighted_moving_average.cc | 56 chromium-132.0.6834.159/chromecast/base/statistics/weighted_moving_average.h | 62 chromium-132.0.6834.159/chromecast/base/statistics/weighted_moving_average_unittest.cc | 148 chromium-132.0.6834.159/chromecast/base/statistics/weighted_moving_linear_regression.cc | 120 chromium-132.0.6834.159/chromecast/base/statistics/weighted_moving_linear_regression.h | 93 chromium-132.0.6834.159/chromecast/base/statistics/weighted_moving_linear_regression_unittest.cc | 155 chromium-132.0.6834.159/chromecast/base/system_time_change_notifier.cc | 96 chromium-132.0.6834.159/chromecast/base/system_time_change_notifier.h | 94 chromium-132.0.6834.159/chromecast/base/system_time_change_notifier_unittest.cc | 213 chromium-132.0.6834.159/chromecast/base/task_runner_impl.cc | 34 chromium-132.0.6834.159/chromecast/base/task_runner_impl.h | 44 chromium-132.0.6834.159/chromecast/base/thread_health_checker.cc | 112 chromium-132.0.6834.159/chromecast/base/thread_health_checker.h | 82 chromium-132.0.6834.159/chromecast/base/thread_health_checker_unittest.cc | 106 chromium-132.0.6834.159/chromecast/base/version.h.in | 17 chromium-132.0.6834.159/chromecast/bindings/DEPS | 18 chromium-132.0.6834.159/chromecast/bindings/OWNERS | 1 chromium-132.0.6834.159/chromecast/bindings/bindings_manager.h | 20 chromium-132.0.6834.159/chromecast/bindings/bindings_manager_cast.cc | 67 chromium-132.0.6834.159/chromecast/bindings/bindings_manager_cast.h | 59 chromium-132.0.6834.159/chromecast/bindings/bindings_manager_cast_browsertest.cc | 280 chromium-132.0.6834.159/chromecast/bindings/bindings_manager_fuchsia.cc | 61 chromium-132.0.6834.159/chromecast/bindings/bindings_manager_fuchsia.h | 53 chromium-132.0.6834.159/chromecast/bindings/public/mojom/OWNERS | 2 chromium-132.0.6834.159/chromecast/bindings/public/mojom/api_bindings.mojom | 29 chromium-132.0.6834.159/chromecast/bindings/shared/proto_serializer.h | 52 chromium-132.0.6834.159/chromecast/browser/DEPS | 113 chromium-132.0.6834.159/chromecast/browser/OWNERS | 11 chromium-132.0.6834.159/chromecast/browser/android/DEPS | 8 chromium-132.0.6834.159/chromecast/browser/android/OWNERS | 2 chromium-132.0.6834.159/chromecast/browser/android/apk/AndroidManifest.xml.jinja2 | 96 chromium-132.0.6834.159/chromecast/browser/android/apk/CastBrowserAndroidManifest.xml.jinja2 | 108 chromium-132.0.6834.159/chromecast/browser/android/apk/res-values/values-v17/styles.xml | 12 chromium-132.0.6834.159/chromecast/browser/android/apk/res-values/values/colors.xml | 4 chromium-132.0.6834.159/chromecast/browser/android/apk/res-values/values/strings.xml | 13 chromium-132.0.6834.159/chromecast/browser/android/apk/res/drawable-anydpi-v26/ic_settings_cast.xml | 7 chromium-132.0.6834.159/chromecast/browser/android/apk/res/drawable-nodpi/ic_cast_vector.xml | 18 chromium-132.0.6834.159/chromecast/browser/android/apk/res/layout/cast_web_contents_activity.xml | 18 chromium-132.0.6834.159/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/IDeviceLogsProvider.aidl | 33 chromium-132.0.6834.159/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/OWNERS | 2 chromium-132.0.6834.159/chromecast/browser/android/apk/src/org/chromium/chromecast/shell/logs_provider_service.aidl | 5 chromium-132.0.6834.159/chromecast/browser/android/cast_content_window_android.cc | 145 chromium-132.0.6834.159/chromecast/browser/android/cast_content_window_android.h | 60 chromium-132.0.6834.159/chromecast/browser/android/cast_metrics_helper_android.cc | 22 chromium-132.0.6834.159/chromecast/browser/android/cast_web_service_android.cc | 18 chromium-132.0.6834.159/chromecast/browser/application_media_capabilities.cc | 41 chromium-132.0.6834.159/chromecast/browser/application_media_capabilities.h | 50 chromium-132.0.6834.159/chromecast/browser/application_media_info_manager.cc | 110 chromium-132.0.6834.159/chromecast/browser/application_media_info_manager.h | 74 chromium-132.0.6834.159/chromecast/browser/application_media_info_manager_unittest.cc | 104 chromium-132.0.6834.159/chromecast/browser/audio_socket_broker.cc | 193 chromium-132.0.6834.159/chromecast/browser/audio_socket_broker.h | 93 chromium-132.0.6834.159/chromecast/browser/audio_socket_broker_unittest.cc | 162 chromium-132.0.6834.159/chromecast/browser/bluetooth/cast_bluetooth_chooser.cc | 89 chromium-132.0.6834.159/chromecast/browser/bluetooth/cast_bluetooth_chooser.h | 68 chromium-132.0.6834.159/chromecast/browser/bluetooth/cast_bluetooth_chooser_unittest.cc | 186 chromium-132.0.6834.159/chromecast/browser/bluetooth/public/mojom/OWNERS | 2 chromium-132.0.6834.159/chromecast/browser/bluetooth/public/mojom/web_bluetooth.mojom | 29 chromium-132.0.6834.159/chromecast/browser/cast_browser_context.cc | 145 chromium-132.0.6834.159/chromecast/browser/cast_browser_context.h | 66 chromium-132.0.6834.159/chromecast/browser/cast_browser_interface_binders.cc | 139 chromium-132.0.6834.159/chromecast/browser/cast_browser_interface_binders.h | 24 chromium-132.0.6834.159/chromecast/browser/cast_browser_main_parts.cc | 774 chromium-132.0.6834.159/chromecast/browser/cast_browser_main_parts.h | 168 chromium-132.0.6834.159/chromecast/browser/cast_browser_main_parts_simple.cc | 17 chromium-132.0.6834.159/chromecast/browser/cast_browser_process.cc | 120 chromium-132.0.6834.159/chromecast/browser/cast_browser_process.h | 116 chromium-132.0.6834.159/chromecast/browser/cast_content_browser_client.cc | 911 chromium-132.0.6834.159/chromecast/browser/cast_content_browser_client.h | 374 chromium-132.0.6834.159/chromecast/browser/cast_content_browser_client_receiver_bindings.cc | 211 chromium-132.0.6834.159/chromecast/browser/cast_content_gesture_handler.cc | 123 chromium-132.0.6834.159/chromecast/browser/cast_content_gesture_handler.h | 50 chromium-132.0.6834.159/chromecast/browser/cast_content_gesture_handler_test.cc | 238 chromium-132.0.6834.159/chromecast/browser/cast_content_window.cc | 68 chromium-132.0.6834.159/chromecast/browser/cast_content_window.h | 100 chromium-132.0.6834.159/chromecast/browser/cast_content_window_aura.cc | 201 chromium-132.0.6834.159/chromecast/browser/cast_content_window_aura.h | 71 chromium-132.0.6834.159/chromecast/browser/cast_display_configurator.cc | 302 chromium-132.0.6834.159/chromecast/browser/cast_display_configurator.h | 94 chromium-132.0.6834.159/chromecast/browser/cast_download_manager_delegate.cc | 57 chromium-132.0.6834.159/chromecast/browser/cast_download_manager_delegate.h | 40 chromium-132.0.6834.159/chromecast/browser/cast_feature_list_creator.cc | 76 chromium-132.0.6834.159/chromecast/browser/cast_feature_list_creator.h | 57 chromium-132.0.6834.159/chromecast/browser/cast_feature_update_observer.cc | 52 chromium-132.0.6834.159/chromecast/browser/cast_feature_update_observer.h | 47 chromium-132.0.6834.159/chromecast/browser/cast_http_user_agent_settings.cc | 54 chromium-132.0.6834.159/chromecast/browser/cast_http_user_agent_settings.h | 31 chromium-132.0.6834.159/chromecast/browser/cast_media_blocker.cc | 173 chromium-132.0.6834.159/chromecast/browser/cast_media_blocker.h | 114 chromium-132.0.6834.159/chromecast/browser/cast_media_blocker_browsertest.cc | 104 chromium-132.0.6834.159/chromecast/browser/cast_media_blocker_unittest.cc | 392 chromium-132.0.6834.159/chromecast/browser/cast_navigation_ui_data.cc | 58 chromium-132.0.6834.159/chromecast/browser/cast_navigation_ui_data.h | 43 chromium-132.0.6834.159/chromecast/browser/cast_network_contexts.cc | 374 chromium-132.0.6834.159/chromecast/browser/cast_network_contexts.h | 154 chromium-132.0.6834.159/chromecast/browser/cast_overlay_manifests.cc | 47 chromium-132.0.6834.159/chromecast/browser/cast_overlay_manifests.h | 27 chromium-132.0.6834.159/chromecast/browser/cast_permission_manager.cc | 214 chromium-132.0.6834.159/chromecast/browser/cast_permission_manager.h | 71 chromium-132.0.6834.159/chromecast/browser/cast_permission_user_data.cc | 50 chromium-132.0.6834.159/chromecast/browser/cast_permission_user_data.h | 61 chromium-132.0.6834.159/chromecast/browser/cast_renderer_block_data.cc | 72 chromium-132.0.6834.159/chromecast/browser/cast_renderer_block_data.h | 48 chromium-132.0.6834.159/chromecast/browser/cast_resource_bundle_unittest.cc | 49 chromium-132.0.6834.159/chromecast/browser/cast_session_id_map.cc | 185 chromium-132.0.6834.159/chromecast/browser/cast_session_id_map.h | 109 chromium-132.0.6834.159/chromecast/browser/cast_session_id_map_unittest.cc | 115 chromium-132.0.6834.159/chromecast/browser/cast_system_memory_pressure_evaluator.cc | 196 chromium-132.0.6834.159/chromecast/browser/cast_system_memory_pressure_evaluator.h | 75 chromium-132.0.6834.159/chromecast/browser/cast_system_memory_pressure_evaluator_adjuster.cc | 20 chromium-132.0.6834.159/chromecast/browser/cast_system_memory_pressure_evaluator_adjuster.h | 29 chromium-132.0.6834.159/chromecast/browser/cast_touch_device_manager.cc | 83 chromium-132.0.6834.159/chromecast/browser/cast_touch_device_manager.h | 45 chromium-132.0.6834.159/chromecast/browser/cast_touch_device_manager_unittest.cc | 128 chromium-132.0.6834.159/chromecast/browser/cast_web_contents.cc | 81 chromium-132.0.6834.159/chromecast/browser/cast_web_contents.h | 321 chromium-132.0.6834.159/chromecast/browser/cast_web_contents_browsertest.cc | 1177 - chromium-132.0.6834.159/chromecast/browser/cast_web_contents_impl.cc | 1070 chromium-132.0.6834.159/chromecast/browser/cast_web_contents_impl.h | 226 chromium-132.0.6834.159/chromecast/browser/cast_web_contents_observer.cc | 23 chromium-132.0.6834.159/chromecast/browser/cast_web_contents_observer.h | 87 chromium-132.0.6834.159/chromecast/browser/cast_web_preferences.cc | 31 chromium-132.0.6834.159/chromecast/browser/cast_web_preferences.h | 47 chromium-132.0.6834.159/chromecast/browser/cast_web_service.cc | 176 chromium-132.0.6834.159/chromecast/browser/cast_web_service.h | 131 chromium-132.0.6834.159/chromecast/browser/cast_web_service_aura.cc | 19 chromium-132.0.6834.159/chromecast/browser/cast_web_view.cc | 16 chromium-132.0.6834.159/chromecast/browser/cast_web_view.h | 60 chromium-132.0.6834.159/chromecast/browser/cast_web_view_default.cc | 302 chromium-132.0.6834.159/chromecast/browser/cast_web_view_default.h | 94 chromium-132.0.6834.159/chromecast/browser/cast_web_view_factory.cc | 26 chromium-132.0.6834.159/chromecast/browser/cast_web_view_factory.h | 44 chromium-132.0.6834.159/chromecast/browser/default_navigation_throttle.cc | 31 chromium-132.0.6834.159/chromecast/browser/default_navigation_throttle.h | 28 chromium-132.0.6834.159/chromecast/browser/devtools/cast_devtools_manager_delegate.cc | 73 chromium-132.0.6834.159/chromecast/browser/devtools/cast_devtools_manager_delegate.h | 50 chromium-132.0.6834.159/chromecast/browser/devtools/cast_devtools_manager_delegate_unittest.cc | 81 chromium-132.0.6834.159/chromecast/browser/devtools/cast_ui_devtools.cc | 50 chromium-132.0.6834.159/chromecast/browser/devtools/cast_ui_devtools.h | 43 chromium-132.0.6834.159/chromecast/browser/devtools/remote_debugging_server.cc | 248 chromium-132.0.6834.159/chromecast/browser/devtools/remote_debugging_server.h | 53 chromium-132.0.6834.159/chromecast/browser/display_configurator_observer.cc | 32 chromium-132.0.6834.159/chromecast/browser/display_configurator_observer.h | 41 chromium-132.0.6834.159/chromecast/browser/general_audience_browsing/mojom/OWNERS | 2 chromium-132.0.6834.159/chromecast/browser/general_audience_browsing/mojom/general_audience_browsing.mojom | 14 chromium-132.0.6834.159/chromecast/browser/general_audience_browsing_navigation_throttle.cc | 92 chromium-132.0.6834.159/chromecast/browser/general_audience_browsing_navigation_throttle.h | 60 chromium-132.0.6834.159/chromecast/browser/general_audience_browsing_service.cc | 110 chromium-132.0.6834.159/chromecast/browser/general_audience_browsing_service.h | 73 chromium-132.0.6834.159/chromecast/browser/gesture_router.cc | 238 chromium-132.0.6834.159/chromecast/browser/gesture_router.h | 110 chromium-132.0.6834.159/chromecast/browser/lru_renderer_cache.cc | 123 chromium-132.0.6834.159/chromecast/browser/lru_renderer_cache.h | 81 chromium-132.0.6834.159/chromecast/browser/lru_renderer_cache_test.cc | 297 chromium-132.0.6834.159/chromecast/browser/media/media_caps_impl.cc | 61 chromium-132.0.6834.159/chromecast/browser/media/media_caps_impl.h | 47 chromium-132.0.6834.159/chromecast/browser/media/supported_codec_finder.cc | 38 chromium-132.0.6834.159/chromecast/browser/media/supported_codec_finder.h | 24 chromium-132.0.6834.159/chromecast/browser/memory_pressure_controller_impl.cc | 36 chromium-132.0.6834.159/chromecast/browser/memory_pressure_controller_impl.h | 45 chromium-132.0.6834.159/chromecast/browser/metrics/DEPS | 5 chromium-132.0.6834.159/chromecast/browser/metrics/DIR_METADATA | 1 chromium-132.0.6834.159/chromecast/browser/metrics/OWNERS | 2 chromium-132.0.6834.159/chromecast/browser/metrics/cast_browser_metrics.cc | 140 chromium-132.0.6834.159/chromecast/browser/metrics/cast_browser_metrics.h | 53 chromium-132.0.6834.159/chromecast/browser/metrics/cast_metrics_prefs.cc | 19 chromium-132.0.6834.159/chromecast/browser/metrics/cast_metrics_prefs.h | 18 chromium-132.0.6834.159/chromecast/browser/metrics/cast_stability_metrics_provider.cc | 128 chromium-132.0.6834.159/chromecast/browser/metrics/cast_stability_metrics_provider.h | 86 chromium-132.0.6834.159/chromecast/browser/metrics/external_metrics.cc | 185 chromium-132.0.6834.159/chromecast/browser/metrics/external_metrics.h | 90 chromium-132.0.6834.159/chromecast/browser/metrics/metrics_helper_impl.cc | 31 chromium-132.0.6834.159/chromecast/browser/metrics/metrics_helper_impl.h | 40 chromium-132.0.6834.159/chromecast/browser/migration/migration_utils.cc | 52 chromium-132.0.6834.159/chromecast/browser/migration/migration_utils.h | 19 chromium-132.0.6834.159/chromecast/browser/migration/migration_utils_test.cc | 68 chromium-132.0.6834.159/chromecast/browser/mojom/OWNERS | 4 chromium-132.0.6834.159/chromecast/browser/mojom/README.md | 18 chromium-132.0.6834.159/chromecast/browser/mojom/cast_content_window.mojom | 105 chromium-132.0.6834.159/chromecast/browser/mojom/cast_web_contents.mojom | 174 chromium-132.0.6834.159/chromecast/browser/mojom/cast_web_service.mojom | 181 chromium-132.0.6834.159/chromecast/browser/mojom/visibility_mojom_traits.h | 99 chromium-132.0.6834.159/chromecast/browser/mojom/web_mojom_traits.h | 56 chromium-132.0.6834.159/chromecast/browser/named_message_port_connector_cast.cc | 78 chromium-132.0.6834.159/chromecast/browser/named_message_port_connector_cast.h | 43 chromium-132.0.6834.159/chromecast/browser/pref_service_helper.cc | 139 chromium-132.0.6834.159/chromecast/browser/pref_service_helper.h | 46 chromium-132.0.6834.159/chromecast/browser/pref_service_helper_simple.cc | 17 chromium-132.0.6834.159/chromecast/browser/renderer_prelauncher.cc | 52 chromium-132.0.6834.159/chromecast/browser/renderer_prelauncher.h | 54 chromium-132.0.6834.159/chromecast/browser/renderer_prelauncher_test.cc | 74 chromium-132.0.6834.159/chromecast/browser/service/cast_service_simple.cc | 84 chromium-132.0.6834.159/chromecast/browser/service/cast_service_simple.h | 47 chromium-132.0.6834.159/chromecast/browser/service_connector.cc | 85 chromium-132.0.6834.159/chromecast/browser/service_connector.h | 67 chromium-132.0.6834.159/chromecast/browser/service_manager_connection.cc | 230 chromium-132.0.6834.159/chromecast/browser/service_manager_connection.h | 87 chromium-132.0.6834.159/chromecast/browser/service_manager_context.cc | 354 chromium-132.0.6834.159/chromecast/browser/service_manager_context.h | 64 chromium-132.0.6834.159/chromecast/browser/system_connector.cc | 65 chromium-132.0.6834.159/chromecast/browser/system_connector.h | 25 chromium-132.0.6834.159/chromecast/browser/test/DEPS | 5 chromium-132.0.6834.159/chromecast/browser/test/cast_browser_test.cc | 92 chromium-132.0.6834.159/chromecast/browser/test/cast_browser_test.h | 59 chromium-132.0.6834.159/chromecast/browser/test/cast_features_browsertest.cc | 320 chromium-132.0.6834.159/chromecast/browser/test/cast_navigation_browsertest.cc | 116 chromium-132.0.6834.159/chromecast/browser/test/data/dynamic_title.html | 12 chromium-132.0.6834.159/chromecast/browser/test/data/interface_binding.html | 17 chromium-132.0.6834.159/chromecast/browser/test/data/load_cancel.html | 8 chromium-132.0.6834.159/chromecast/browser/test/data/location_redirect.html | 8 chromium-132.0.6834.159/chromecast/browser/test/data/message_port.html | 36 chromium-132.0.6834.159/chromecast/browser/test/data/missing_resource.html | 6 chromium-132.0.6834.159/chromecast/browser/test/data/title1.html | 4 chromium-132.0.6834.159/chromecast/browser/test/data/title2.html | 4 chromium-132.0.6834.159/chromecast/browser/test/data/window_post_message.html | 10 chromium-132.0.6834.159/chromecast/browser/test/mock_cast_web_view.cc | 45 chromium-132.0.6834.159/chromecast/browser/test/mock_cast_web_view.h | 108 chromium-132.0.6834.159/chromecast/browser/test_interfaces.test-mojom | 13 chromium-132.0.6834.159/chromecast/browser/visibility_types.h | 81 chromium-132.0.6834.159/chromecast/browser/web_types.cc | 26 chromium-132.0.6834.159/chromecast/browser/web_types.h | 33 chromium-132.0.6834.159/chromecast/browser/webui/cast_resource_data_source.cc | 133 chromium-132.0.6834.159/chromecast/browser/webui/cast_resource_data_source.h | 56 chromium-132.0.6834.159/chromecast/browser/webui/cast_webui.cc | 76 chromium-132.0.6834.159/chromecast/browser/webui/cast_webui.h | 73 chromium-132.0.6834.159/chromecast/browser/webui/cast_webui_controller_factory.cc | 61 chromium-132.0.6834.159/chromecast/browser/webui/cast_webui_controller_factory.h | 46 chromium-132.0.6834.159/chromecast/browser/webui/cast_webui_default.cc | 16 chromium-132.0.6834.159/chromecast/browser/webui/cast_webui_message_handler.cc | 34 chromium-132.0.6834.159/chromecast/browser/webui/cast_webui_message_handler.h | 39 chromium-132.0.6834.159/chromecast/browser/webui/constants.cc | 13 chromium-132.0.6834.159/chromecast/browser/webui/constants.h | 17 chromium-132.0.6834.159/chromecast/browser/webui/mojom/OWNERS | 2 chromium-132.0.6834.159/chromecast/browser/webui/mojom/webui.mojom | 54 chromium-132.0.6834.159/chromecast/cast_core/DEPS | 6 chromium-132.0.6834.159/chromecast/cast_core/OWNERS | 5 chromium-132.0.6834.159/chromecast/cast_core/README.md | 63 chromium-132.0.6834.159/chromecast/cast_core/cast_core_switches.h | 21 chromium-132.0.6834.159/chromecast/cast_core/cast_runtime_main.cc | 14 chromium-132.0.6834.159/chromecast/cast_core/cast_starboard_runtime_main.cc | 153 chromium-132.0.6834.159/chromecast/cast_core/child_log_process.cc | 100 chromium-132.0.6834.159/chromecast/cast_core/child_log_process.h | 26 chromium-132.0.6834.159/chromecast/cast_core/core_runtime_starboard.sym | 4 chromium-132.0.6834.159/chromecast/cast_core/grpc/DEPS | 4 chromium-132.0.6834.159/chromecast/cast_core/grpc/cancellable_reactor.h | 166 chromium-132.0.6834.159/chromecast/cast_core/grpc/grpc_call.h | 83 chromium-132.0.6834.159/chromecast/cast_core/grpc/grpc_call_options.cc | 59 chromium-132.0.6834.159/chromecast/cast_core/grpc/grpc_call_options.h | 40 chromium-132.0.6834.159/chromecast/cast_core/grpc/grpc_client_reactor.h | 71 chromium-132.0.6834.159/chromecast/cast_core/grpc/grpc_handler.cc | 20 chromium-132.0.6834.159/chromecast/cast_core/grpc/grpc_handler.h | 42 chromium-132.0.6834.159/chromecast/cast_core/grpc/grpc_server.cc | 118 chromium-132.0.6834.159/chromecast/cast_core/grpc/grpc_server.h | 128 chromium-132.0.6834.159/chromecast/cast_core/grpc/grpc_server_reactor.h | 155 chromium-132.0.6834.159/chromecast/cast_core/grpc/grpc_server_streaming_call.h | 134 chromium-132.0.6834.159/chromecast/cast_core/grpc/grpc_server_streaming_handler.h | 142 chromium-132.0.6834.159/chromecast/cast_core/grpc/grpc_server_streaming_test.cc | 290 chromium-132.0.6834.159/chromecast/cast_core/grpc/grpc_server_test.cc | 57 chromium-132.0.6834.159/chromecast/cast_core/grpc/grpc_status_or.cc | 63 chromium-132.0.6834.159/chromecast/cast_core/grpc/grpc_status_or.h | 127 chromium-132.0.6834.159/chromecast/cast_core/grpc/grpc_status_or_test.cc | 112 chromium-132.0.6834.159/chromecast/cast_core/grpc/grpc_stub.h | 79 chromium-132.0.6834.159/chromecast/cast_core/grpc/grpc_unary_call.h | 147 chromium-132.0.6834.159/chromecast/cast_core/grpc/grpc_unary_handler.h | 125 chromium-132.0.6834.159/chromecast/cast_core/grpc/grpc_unary_test.cc | 326 chromium-132.0.6834.159/chromecast/cast_core/grpc/server_reactor_tracker.cc | 58 chromium-132.0.6834.159/chromecast/cast_core/grpc/server_reactor_tracker.h | 38 chromium-132.0.6834.159/chromecast/cast_core/grpc/status_matchers.cc | 20 chromium-132.0.6834.159/chromecast/cast_core/grpc/status_matchers.h | 248 chromium-132.0.6834.159/chromecast/cast_core/grpc/test_service.proto | 28 chromium-132.0.6834.159/chromecast/cast_core/grpc/test_service_extra.proto | 18 chromium-132.0.6834.159/chromecast/cast_core/grpc/test_service_messages.proto | 19 chromium-132.0.6834.159/chromecast/cast_core/grpc/test_utils.cc | 29 chromium-132.0.6834.159/chromecast/cast_core/grpc/test_utils.h | 24 chromium-132.0.6834.159/chromecast/cast_core/grpc/trackable_reactor.h | 38 chromium-132.0.6834.159/chromecast/cast_core/runtime/DEPS | 3 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/DEPS | 33 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/cast_core_switches.h | 17 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/cast_runtime_action_recorder.cc | 51 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/cast_runtime_action_recorder.h | 41 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/cast_runtime_content_browser_client.cc | 165 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/cast_runtime_content_browser_client.h | 98 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/cast_runtime_content_browser_client_simple.cc | 27 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/cast_runtime_content_browser_client_starboard.cc | 127 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/cast_runtime_content_browser_client_starboard.h | 61 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/cast_runtime_content_browser_client_starboard_factory.cc | 31 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/cast_runtime_histogram_flattener.cc | 77 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/cast_runtime_histogram_flattener.h | 19 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/cast_runtime_histogram_flattener_unittest.cc | 166 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/cast_runtime_metrics_recorder.cc | 326 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/cast_runtime_metrics_recorder.h | 91 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/cast_runtime_metrics_recorder_service.cc | 104 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/cast_runtime_metrics_recorder_service.h | 59 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/cast_runtime_metrics_test_helpers.cc | 28 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/cast_runtime_metrics_test_helpers.h | 27 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/core_conversions.cc | 86 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/core_conversions.h | 21 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/core_streaming_config_manager.cc | 240 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/core_streaming_config_manager.h | 58 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/core_streaming_config_manager_unittest.cc | 141 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/message_port_handler.cc | 268 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/message_port_handler.h | 113 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/message_port_service_grpc.cc | 111 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/message_port_service_grpc.h | 75 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/runtime_application_service_impl.cc | 754 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/runtime_application_service_impl.h | 178 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/runtime_service_impl.cc | 547 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/runtime_service_impl.h | 142 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/url_rewrite/DEPS | 6 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/url_rewrite/OWNERS | 2 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/url_rewrite/url_request_rewrite_type_converters.cc | 233 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/url_rewrite/url_request_rewrite_type_converters.h | 33 chromium-132.0.6834.159/chromecast/cast_core/runtime/browser/url_rewrite/url_request_rewrite_type_converters_unittest.cc | 288 chromium-132.0.6834.159/chromecast/cast_core/runtime/renderer/DEPS | 9 chromium-132.0.6834.159/chromecast/cast_core/runtime/renderer/cast_runtime_content_renderer_client.cc | 21 chromium-132.0.6834.159/chromecast/cast_core/runtime/renderer/cast_runtime_content_renderer_client.h | 45 chromium-132.0.6834.159/chromecast/cast_core/runtime/renderer/cast_runtime_content_renderer_client_simple.cc | 18 chromium-132.0.6834.159/chromecast/cast_core/test/cast_core_screenshot_test.py | 170 chromium-132.0.6834.159/chromecast/cast_core/test/cast_project_config.py | 17 chromium-132.0.6834.159/chromecast/cast_core/test/data/screenshot.html | 25 chromium-132.0.6834.159/chromecast/cast_core/test/run_cast_integration_test.py | 17 chromium-132.0.6834.159/chromecast/common/DEPS | 19 chromium-132.0.6834.159/chromecast/common/OWNERS | 4 chromium-132.0.6834.159/chromecast/common/activity_filtering_url_loader_throttle.cc | 49 chromium-132.0.6834.159/chromecast/common/activity_filtering_url_loader_throttle.h | 53 chromium-132.0.6834.159/chromecast/common/activity_url_filter.cc | 31 chromium-132.0.6834.159/chromecast/common/activity_url_filter.h | 38 chromium-132.0.6834.159/chromecast/common/activity_url_filter_unittest.cc | 27 chromium-132.0.6834.159/chromecast/common/cast_content_client.cc | 220 chromium-132.0.6834.159/chromecast/common/cast_content_client.h | 50 chromium-132.0.6834.159/chromecast/common/cast_resource_delegate.cc | 114 chromium-132.0.6834.159/chromecast/common/cast_resource_delegate.h | 73 chromium-132.0.6834.159/chromecast/common/cors_exempt_headers.cc | 54 chromium-132.0.6834.159/chromecast/common/cors_exempt_headers.h | 25 chromium-132.0.6834.159/chromecast/common/cors_exempt_headers_unittest.cc | 19 chromium-132.0.6834.159/chromecast/common/feature_constants.cc | 41 chromium-132.0.6834.159/chromecast/common/feature_constants.h | 64 chromium-132.0.6834.159/chromecast/common/global_descriptors.h | 23 chromium-132.0.6834.159/chromecast/common/media/DEPS | 5 chromium-132.0.6834.159/chromecast/common/media/OWNERS | 2 chromium-132.0.6834.159/chromecast/common/media/cast_media_drm_bridge_client.cc | 30 chromium-132.0.6834.159/chromecast/common/media/cast_media_drm_bridge_client.h | 36 chromium-132.0.6834.159/chromecast/common/mojom/OWNERS | 4 chromium-132.0.6834.159/chromecast/common/mojom/activity_url_filter.mojom | 20 chromium-132.0.6834.159/chromecast/common/mojom/activity_window.mojom | 20 chromium-132.0.6834.159/chromecast/common/mojom/application_media_capabilities.mojom | 30 chromium-132.0.6834.159/chromecast/common/mojom/application_media_capabilities_traits.h | 35 chromium-132.0.6834.159/chromecast/common/mojom/assistant_messenger.mojom | 49 chromium-132.0.6834.159/chromecast/common/mojom/audio_socket.mojom | 15 chromium-132.0.6834.159/chromecast/common/mojom/cast_demo.mojom | 80 chromium-132.0.6834.159/chromecast/common/mojom/constants.mojom | 12 chromium-132.0.6834.159/chromecast/common/mojom/feature_manager.mojom | 24 chromium-132.0.6834.159/chromecast/common/mojom/feature_update.mojom | 23 chromium-132.0.6834.159/chromecast/common/mojom/gesture.mojom | 69 chromium-132.0.6834.159/chromecast/common/mojom/js_channel.mojom | 27 chromium-132.0.6834.159/chromecast/common/mojom/media_caps.mojom | 24 chromium-132.0.6834.159/chromecast/common/mojom/memory_pressure.mojom | 14 chromium-132.0.6834.159/chromecast/common/mojom/metrics_helper.mojom | 15 chromium-132.0.6834.159/chromecast/common/mojom/queryable_data_store.mojom | 15 chromium-132.0.6834.159/chromecast/common/mojom/service_connector.mojom | 19 chromium-132.0.6834.159/chromecast/common/mojom/settings_ui.mojom | 53 chromium-132.0.6834.159/chromecast/common/queryable_data.cc | 51 chromium-132.0.6834.159/chromecast/common/queryable_data.h | 55 chromium-132.0.6834.159/chromecast/common/user_agent.cc | 23 chromium-132.0.6834.159/chromecast/common/user_agent.h | 20 chromium-132.0.6834.159/chromecast/common/user_agent_android.cc | 26 chromium-132.0.6834.159/chromecast/common/user_agent_default.cc | 20 chromium-132.0.6834.159/chromecast/common/user_agent_unittest.cc | 56 chromium-132.0.6834.159/chromecast/crash/DEPS | 5 chromium-132.0.6834.159/chromecast/crash/OWNERS | 1 chromium-132.0.6834.159/chromecast/crash/app_state_tracker.cc | 81 chromium-132.0.6834.159/chromecast/crash/app_state_tracker.h | 42 chromium-132.0.6834.159/chromecast/crash/build_info.cc | 59 chromium-132.0.6834.159/chromecast/crash/build_info.h | 27 chromium-132.0.6834.159/chromecast/crash/build_info_unittest.cc | 51 chromium-132.0.6834.159/chromecast/crash/cast_crash_keys.cc | 19 chromium-132.0.6834.159/chromecast/crash/cast_crash_keys.h | 23 chromium-132.0.6834.159/chromecast/crash/cast_crash_storage.cc | 17 chromium-132.0.6834.159/chromecast/crash/cast_crash_storage.h | 37 chromium-132.0.6834.159/chromecast/crash/cast_crash_storage_fuchsia.cc | 19 chromium-132.0.6834.159/chromecast/crash/cast_crash_storage_impl.cc | 58 chromium-132.0.6834.159/chromecast/crash/cast_crash_storage_impl.h | 34 chromium-132.0.6834.159/chromecast/crash/cast_crashdump_uploader.cc | 139 chromium-132.0.6834.159/chromecast/crash/cast_crashdump_uploader.h | 65 chromium-132.0.6834.159/chromecast/crash/cast_crashdump_uploader_unittest.cc | 181 chromium-132.0.6834.159/chromecast/crash/fuchsia/cast_crash_storage_impl_fuchsia.cc | 85 chromium-132.0.6834.159/chromecast/crash/fuchsia/cast_crash_storage_impl_fuchsia.h | 45 chromium-132.0.6834.159/chromecast/crash/fuchsia/cast_crash_storage_impl_fuchsia_unittest.cc | 142 chromium-132.0.6834.159/chromecast/crash/fuchsia/constants.cc | 15 chromium-132.0.6834.159/chromecast/crash/fuchsia/constants.h | 18 chromium-132.0.6834.159/chromecast/crash/libcurl_wrapper.cc | 227 chromium-132.0.6834.159/chromecast/crash/libcurl_wrapper.h | 71 chromium-132.0.6834.159/chromecast/crash/linux/DEPS | 6 chromium-132.0.6834.159/chromecast/crash/linux/crash_testing_utils.cc | 167 chromium-132.0.6834.159/chromecast/crash/linux/crash_testing_utils.h | 51 chromium-132.0.6834.159/chromecast/crash/linux/crash_uploader.cc | 78 chromium-132.0.6834.159/chromecast/crash/linux/crash_util.cc | 165 chromium-132.0.6834.159/chromecast/crash/linux/crash_util.h | 52 chromium-132.0.6834.159/chromecast/crash/linux/dummy_minidump_generator.cc | 34 chromium-132.0.6834.159/chromecast/crash/linux/dummy_minidump_generator.h | 37 chromium-132.0.6834.159/chromecast/crash/linux/dummy_minidump_generator_unittest.cc | 78 chromium-132.0.6834.159/chromecast/crash/linux/dump_info.cc | 229 chromium-132.0.6834.159/chromecast/crash/linux/dump_info.h | 91 chromium-132.0.6834.159/chromecast/crash/linux/dump_info_unittest.cc | 221 chromium-132.0.6834.159/chromecast/crash/linux/minidump_generator.h | 26 chromium-132.0.6834.159/chromecast/crash/linux/minidump_params.cc | 55 chromium-132.0.6834.159/chromecast/crash/linux/minidump_params.h | 68 chromium-132.0.6834.159/chromecast/crash/linux/minidump_uploader.cc | 384 chromium-132.0.6834.159/chromecast/crash/linux/minidump_uploader.h | 75 chromium-132.0.6834.159/chromecast/crash/linux/minidump_uploader_unittest.cc | 469 chromium-132.0.6834.159/chromecast/crash/linux/minidump_writer.cc | 118 chromium-132.0.6834.159/chromecast/crash/linux/minidump_writer.h | 78 chromium-132.0.6834.159/chromecast/crash/linux/minidump_writer_unittest.cc | 135 chromium-132.0.6834.159/chromecast/crash/linux/synchronized_minidump_manager.cc | 492 chromium-132.0.6834.159/chromecast/crash/linux/synchronized_minidump_manager.h | 155 chromium-132.0.6834.159/chromecast/crash/linux/synchronized_minidump_manager_unittest.cc | 509 chromium-132.0.6834.159/chromecast/crypto/signature_cache.cc | 47 chromium-132.0.6834.159/chromecast/crypto/signature_cache.h | 44 chromium-132.0.6834.159/chromecast/crypto/signature_cache_unittest.cc | 58 chromium-132.0.6834.159/chromecast/device/bluetooth/DEPS | 3 chromium-132.0.6834.159/chromecast/device/bluetooth/bluetooth_util.cc | 125 chromium-132.0.6834.159/chromecast/device/bluetooth/bluetooth_util.h | 58 chromium-132.0.6834.159/chromecast/device/bluetooth/bluetooth_util_test.cc | 112 chromium-132.0.6834.159/chromecast/device/bluetooth/le/DEPS | 3 chromium-132.0.6834.159/chromecast/device/bluetooth/le/ble_notification_logger.cc | 72 chromium-132.0.6834.159/chromecast/device/bluetooth/le/ble_notification_logger.h | 59 chromium-132.0.6834.159/chromecast/device/bluetooth/le/ble_types.h | 24 chromium-132.0.6834.159/chromecast/device/bluetooth/le/gatt_client_manager.h | 140 chromium-132.0.6834.159/chromecast/device/bluetooth/le/gatt_client_manager_impl.cc | 629 chromium-132.0.6834.159/chromecast/device/bluetooth/le/gatt_client_manager_impl.h | 202 chromium-132.0.6834.159/chromecast/device/bluetooth/le/gatt_client_manager_impl_test.cc | 1381 - chromium-132.0.6834.159/chromecast/device/bluetooth/le/instantiate_mocks.cc | 36 chromium-132.0.6834.159/chromecast/device/bluetooth/le/le_scan_manager.h | 102 chromium-132.0.6834.159/chromecast/device/bluetooth/le/le_scan_manager_impl.cc | 264 chromium-132.0.6834.159/chromecast/device/bluetooth/le/le_scan_manager_impl.h | 88 chromium-132.0.6834.159/chromecast/device/bluetooth/le/le_scan_manager_impl_test.cc | 347 chromium-132.0.6834.159/chromecast/device/bluetooth/le/le_scan_result.cc | 314 chromium-132.0.6834.159/chromecast/device/bluetooth/le/le_scan_result.h | 78 chromium-132.0.6834.159/chromecast/device/bluetooth/le/le_scan_result_fuzzer.cc | 13 chromium-132.0.6834.159/chromecast/device/bluetooth/le/le_scan_result_test.cc | 406 chromium-132.0.6834.159/chromecast/device/bluetooth/le/mock_gatt_client_manager.cc | 16 chromium-132.0.6834.159/chromecast/device/bluetooth/le/mock_gatt_client_manager.h | 83 chromium-132.0.6834.159/chromecast/device/bluetooth/le/mock_le_scan_manager.cc | 14 chromium-132.0.6834.159/chromecast/device/bluetooth/le/mock_le_scan_manager.h | 65 chromium-132.0.6834.159/chromecast/device/bluetooth/le/mock_remote_characteristic.cc | 17 chromium-132.0.6834.159/chromecast/device/bluetooth/le/mock_remote_characteristic.h | 82 chromium-132.0.6834.159/chromecast/device/bluetooth/le/mock_remote_descriptor.cc | 14 chromium-132.0.6834.159/chromecast/device/bluetooth/le/mock_remote_descriptor.h | 39 chromium-132.0.6834.159/chromecast/device/bluetooth/le/mock_remote_device.cc | 16 chromium-132.0.6834.159/chromecast/device/bluetooth/le/mock_remote_device.h | 102 chromium-132.0.6834.159/chromecast/device/bluetooth/le/mock_remote_service.cc | 16 chromium-132.0.6834.159/chromecast/device/bluetooth/le/mock_remote_service.h | 42 chromium-132.0.6834.159/chromecast/device/bluetooth/le/remote_characteristic.h | 99 chromium-132.0.6834.159/chromecast/device/bluetooth/le/remote_characteristic_impl.cc | 347 chromium-132.0.6834.159/chromecast/device/bluetooth/le/remote_characteristic_impl.h | 104 chromium-132.0.6834.159/chromecast/device/bluetooth/le/remote_descriptor.cc | 22 chromium-132.0.6834.159/chromecast/device/bluetooth/le/remote_descriptor.h | 72 chromium-132.0.6834.159/chromecast/device/bluetooth/le/remote_descriptor_impl.cc | 118 chromium-132.0.6834.159/chromecast/device/bluetooth/le/remote_descriptor_impl.h | 70 chromium-132.0.6834.159/chromecast/device/bluetooth/le/remote_device.h | 116 chromium-132.0.6834.159/chromecast/device/bluetooth/le/remote_device_impl.cc | 729 chromium-132.0.6834.159/chromecast/device/bluetooth/le/remote_device_impl.h | 201 chromium-132.0.6834.159/chromecast/device/bluetooth/le/remote_service.h | 51 chromium-132.0.6834.159/chromecast/device/bluetooth/le/remote_service_impl.cc | 77 chromium-132.0.6834.159/chromecast/device/bluetooth/le/remote_service_impl.h | 66 chromium-132.0.6834.159/chromecast/device/bluetooth/le/scan_filter.cc | 54 chromium-132.0.6834.159/chromecast/device/bluetooth/le/scan_filter.h | 41 chromium-132.0.6834.159/chromecast/device/bluetooth/le/scan_filter_test.cc | 122 chromium-132.0.6834.159/chromecast/device/bluetooth/shlib/gatt_client.h | 58 chromium-132.0.6834.159/chromecast/device/bluetooth/shlib/le_scanner.h | 26 chromium-132.0.6834.159/chromecast/device/bluetooth/shlib/mock_gatt_client.h | 74 chromium-132.0.6834.159/chromecast/device/bluetooth/shlib/mock_le_scanner.h | 31 chromium-132.0.6834.159/chromecast/external_mojo/DEPS | 6 chromium-132.0.6834.159/chromecast/external_mojo/OWNERS | 1 chromium-132.0.6834.159/chromecast/external_mojo/README.md | 17 chromium-132.0.6834.159/chromecast/external_mojo/broker_service/broker_service.cc | 157 chromium-132.0.6834.159/chromecast/external_mojo/broker_service/broker_service.h | 92 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/DEPS | 8 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/README.md | 22 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/chromium_service.cc | 97 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/chromium_service.h | 89 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/crash_reporter_builtin.cc | 72 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/crash_reporter_client.h | 18 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/crash_reporter_system.cc | 29 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/external_connector.h | 126 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/external_connector_impl.cc | 327 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/external_connector_impl.h | 93 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/external_service.cc | 32 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/external_service.h | 82 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/fake_external_connector.cc | 105 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/fake_external_connector.h | 87 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/perfetto_tracing_client.cc | 36 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/perfetto_tracing_client.h | 37 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/process_setup.cc | 62 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/process_setup.h | 18 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/reconnecting_remote.h | 112 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/service_process.h | 28 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/standalone_mojo_broker.cc | 56 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/standalone_service_main.cc | 103 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/tracing_client.h | 32 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/tracing_client_dummy.cc | 19 chromium-132.0.6834.159/chromecast/external_mojo/external_service_support/tracing_client_dummy.h | 26 chromium-132.0.6834.159/chromecast/external_mojo/public/cpp/common.cc | 51 chromium-132.0.6834.159/chromecast/external_mojo/public/cpp/common.h | 20 chromium-132.0.6834.159/chromecast/external_mojo/public/cpp/external_mojo_broker.cc | 481 chromium-132.0.6834.159/chromecast/external_mojo/public/cpp/external_mojo_broker.h | 57 chromium-132.0.6834.159/chromecast/external_mojo/public/mojom/OWNERS | 2 chromium-132.0.6834.159/chromecast/external_mojo/public/mojom/connector.mojom | 59 chromium-132.0.6834.159/chromecast/external_mojo/public/mojom/test_connector.mojom | 13 chromium-132.0.6834.159/chromecast/fuchsia/DEPS | 4 chromium-132.0.6834.159/chromecast/fuchsia/queryable_data_host_fuchsia.cc | 23 chromium-132.0.6834.159/chromecast/fuchsia/queryable_data_host_fuchsia.h | 32 chromium-132.0.6834.159/chromecast/gpu/DEPS | 11 chromium-132.0.6834.159/chromecast/gpu/cast_content_gpu_client.cc | 39 chromium-132.0.6834.159/chromecast/gpu/cast_content_gpu_client.h | 36 chromium-132.0.6834.159/chromecast/graphics/DEPS | 28 chromium-132.0.6834.159/chromecast/graphics/cast_display_util.cc | 23 chromium-132.0.6834.159/chromecast/graphics/cast_display_util.h | 20 chromium-132.0.6834.159/chromecast/graphics/cast_display_util_unittest.cc | 30 chromium-132.0.6834.159/chromecast/graphics/cast_egl_platform_default.cc | 38 chromium-132.0.6834.159/chromecast/graphics/cast_focus_client_aura.cc | 254 chromium-132.0.6834.159/chromecast/graphics/cast_focus_client_aura.h | 83 chromium-132.0.6834.159/chromecast/graphics/cast_focus_client_aura_test.cc | 198 chromium-132.0.6834.159/chromecast/graphics/cast_screen.cc | 88 chromium-132.0.6834.159/chromecast/graphics/cast_screen.h | 63 chromium-132.0.6834.159/chromecast/graphics/cast_screen_unittest.cc | 59 chromium-132.0.6834.159/chromecast/graphics/cast_touch_activity_observer.h | 24 chromium-132.0.6834.159/chromecast/graphics/cast_touch_event_gate.cc | 57 chromium-132.0.6834.159/chromecast/graphics/cast_touch_event_gate.h | 47 chromium-132.0.6834.159/chromecast/graphics/cast_touch_event_gate_test.cc | 116 chromium-132.0.6834.159/chromecast/graphics/cast_views_test.cc | 51 chromium-132.0.6834.159/chromecast/graphics/cast_window_manager.h | 108 chromium-132.0.6834.159/chromecast/graphics/cast_window_manager_aura.cc | 346 chromium-132.0.6834.159/chromecast/graphics/cast_window_manager_aura.h | 90 chromium-132.0.6834.159/chromecast/graphics/cast_window_manager_aura_test.cc | 186 chromium-132.0.6834.159/chromecast/graphics/cast_window_manager_default.cc | 45 chromium-132.0.6834.159/chromecast/graphics/cast_window_manager_default.h | 45 chromium-132.0.6834.159/chromecast/graphics/cast_window_tree_host_aura.cc | 52 chromium-132.0.6834.159/chromecast/graphics/cast_window_tree_host_aura.h | 40 chromium-132.0.6834.159/chromecast/graphics/gestures/cast_gesture_handler.cc | 13 chromium-132.0.6834.159/chromecast/graphics/gestures/cast_gesture_handler.h | 69 chromium-132.0.6834.159/chromecast/graphics/gestures/cast_system_gesture_dispatcher.cc | 120 chromium-132.0.6834.159/chromecast/graphics/gestures/cast_system_gesture_dispatcher.h | 56 chromium-132.0.6834.159/chromecast/graphics/gestures/cast_system_gesture_dispatcher_test.cc | 217 chromium-132.0.6834.159/chromecast/graphics/gestures/cast_system_gesture_event_handler.cc | 49 chromium-132.0.6834.159/chromecast/graphics/gestures/cast_system_gesture_event_handler.h | 42 chromium-132.0.6834.159/chromecast/graphics/gestures/multiple_tap_detector.cc | 156 chromium-132.0.6834.159/chromecast/graphics/gestures/multiple_tap_detector.h | 98 chromium-132.0.6834.159/chromecast/graphics/gestures/multiple_tap_detector_test.cc | 185 chromium-132.0.6834.159/chromecast/graphics/gestures/side_swipe_detector.cc | 214 chromium-132.0.6834.159/chromecast/graphics/gestures/side_swipe_detector.h | 62 chromium-132.0.6834.159/chromecast/graphics/gestures/side_swipe_detector_test.cc | 359 chromium-132.0.6834.159/chromecast/graphics/graphics_properties_default.cc | 28 chromium-132.0.6834.159/chromecast/graphics/osd_plane_default.cc | 78 chromium-132.0.6834.159/chromecast/graphics/run_all_unittests.cc | 50 chromium-132.0.6834.159/chromecast/media/DEPS | 30 chromium-132.0.6834.159/chromecast/media/OWNERS | 1 chromium-132.0.6834.159/chromecast/media/api/audio_clock_simulator.h | 42 chromium-132.0.6834.159/chromecast/media/api/audio_provider.h | 37 chromium-132.0.6834.159/chromecast/media/api/cast_audio_decoder.h | 74 chromium-132.0.6834.159/chromecast/media/api/cast_audio_demuxer.h | 73 chromium-132.0.6834.159/chromecast/media/api/cast_audio_resampler.h | 47 chromium-132.0.6834.159/chromecast/media/api/cast_channel_mixer.h | 33 chromium-132.0.6834.159/chromecast/media/api/cast_sounds_manager.h | 62 chromium-132.0.6834.159/chromecast/media/api/cma_backend.h | 111 chromium-132.0.6834.159/chromecast/media/api/cma_backend_factory.h | 42 chromium-132.0.6834.159/chromecast/media/api/decoder_buffer_base.h | 64 chromium-132.0.6834.159/chromecast/media/api/monotonic_clock.h | 28 chromium-132.0.6834.159/chromecast/media/api/sound_player.h | 70 chromium-132.0.6834.159/chromecast/media/api/test/mock_cast_sounds_manager.cc | 15 chromium-132.0.6834.159/chromecast/media/api/test/mock_cast_sounds_manager.h | 34 chromium-132.0.6834.159/chromecast/media/api/test/mock_cma_backend.cc | 23 chromium-132.0.6834.159/chromecast/media/api/test/mock_cma_backend.h | 76 chromium-132.0.6834.159/chromecast/media/api/test/mock_cma_backend_factory.cc | 14 chromium-132.0.6834.159/chromecast/media/api/test/mock_cma_backend_factory.h | 33 chromium-132.0.6834.159/chromecast/media/api/test/mock_sound_player.cc | 14 chromium-132.0.6834.159/chromecast/media/api/test/mock_sound_player.h | 39 chromium-132.0.6834.159/chromecast/media/audio/audio_clock_simulator_impl.cc | 148 chromium-132.0.6834.159/chromecast/media/audio/audio_clock_simulator_unittest.cc | 200 chromium-132.0.6834.159/chromecast/media/audio/audio_fader.cc | 250 chromium-132.0.6834.159/chromecast/media/audio/audio_fader.h | 102 chromium-132.0.6834.159/chromecast/media/audio/audio_fader_unittest.cc | 357 chromium-132.0.6834.159/chromecast/media/audio/audio_io_thread.cc | 28 chromium-132.0.6834.159/chromecast/media/audio/audio_io_thread.h | 39 chromium-132.0.6834.159/chromecast/media/audio/audio_log.cc | 203 chromium-132.0.6834.159/chromecast/media/audio/audio_log.h | 58 chromium-132.0.6834.159/chromecast/media/audio/audio_output_service/audio_output_service.proto | 94 chromium-132.0.6834.159/chromecast/media/audio/audio_output_service/constants.cc | 17 chromium-132.0.6834.159/chromecast/media/audio/audio_output_service/constants.h | 19 chromium-132.0.6834.159/chromecast/media/audio/audio_output_service/output_connection.cc | 96 chromium-132.0.6834.159/chromecast/media/audio/audio_output_service/output_connection.h | 64 chromium-132.0.6834.159/chromecast/media/audio/audio_output_service/output_connection_unittest.cc | 163 chromium-132.0.6834.159/chromecast/media/audio/audio_output_service/output_socket.cc | 51 chromium-132.0.6834.159/chromecast/media/audio/audio_output_service/output_socket.h | 57 chromium-132.0.6834.159/chromecast/media/audio/audio_output_service/output_stream_connection.cc | 199 chromium-132.0.6834.159/chromecast/media/audio/audio_output_service/output_stream_connection.h | 114 chromium-132.0.6834.159/chromecast/media/audio/audio_output_service/receiver/audio_output_service_receiver.cc | 250 chromium-132.0.6834.159/chromecast/media/audio/audio_output_service/receiver/audio_output_service_receiver.h | 63 chromium-132.0.6834.159/chromecast/media/audio/audio_output_service/receiver/audio_output_service_receiver_instance.cc | 47 chromium-132.0.6834.159/chromecast/media/audio/audio_output_service/receiver/audio_output_service_receiver_instance.h | 36 chromium-132.0.6834.159/chromecast/media/audio/audio_output_service/receiver/cma_backend_shim.cc | 337 chromium-132.0.6834.159/chromecast/media/audio/audio_output_service/receiver/cma_backend_shim.h | 147 chromium-132.0.6834.159/chromecast/media/audio/audio_output_service/receiver/receiver.cc | 79 chromium-132.0.6834.159/chromecast/media/audio/audio_output_service/receiver/receiver.h | 50 chromium-132.0.6834.159/chromecast/media/audio/capture_service/DEPS | 4 chromium-132.0.6834.159/chromecast/media/audio/capture_service/capture_service_receiver.cc | 284 chromium-132.0.6834.159/chromecast/media/audio/capture_service/capture_service_receiver.h | 98 chromium-132.0.6834.159/chromecast/media/audio/capture_service/capture_service_receiver_unittest.cc | 251 chromium-132.0.6834.159/chromecast/media/audio/capture_service/constants.h | 111 chromium-132.0.6834.159/chromecast/media/audio/capture_service/message_parsing_fuzzer.cc | 21 chromium-132.0.6834.159/chromecast/media/audio/capture_service/message_parsing_utils.cc | 356 chromium-132.0.6834.159/chromecast/media/audio/capture_service/message_parsing_utils.h | 113 chromium-132.0.6834.159/chromecast/media/audio/capture_service/message_parsing_utils_unittest.cc | 255 chromium-132.0.6834.159/chromecast/media/audio/capture_service/packet_header.h | 46 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_bus.cc | 33 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_bus.h | 50 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_device_factory.cc | 267 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_device_factory.h | 37 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_input_stream.cc | 167 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_input_stream.h | 74 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_manager.cc | 221 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_manager.h | 142 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_manager_alsa.cc | 244 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_manager_alsa.h | 82 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_manager_alsa_unittest.cc | 71 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_manager_android.cc | 195 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_manager_android.h | 75 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_manager_helper.cc | 51 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_manager_helper.h | 75 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_manager_unittest.cc | 322 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_mixer.cc | 306 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_mixer.h | 68 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_mixer_unittest.cc | 418 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_output_device.cc | 434 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_output_device.h | 72 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_output_stream.cc | 481 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_output_stream.h | 154 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_output_stream_unittest.cc | 879 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_output_utils.cc | 22 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_output_utils.h | 22 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_renderer.cc | 588 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_renderer.h | 215 chromium-132.0.6834.159/chromecast/media/audio/cast_audio_resampler_impl.cc | 169 chromium-132.0.6834.159/chromecast/media/audio/cast_channel_mixer_impl.cc | 80 chromium-132.0.6834.159/chromecast/media/audio/cma_audio_output.cc | 210 chromium-132.0.6834.159/chromecast/media/audio/cma_audio_output.h | 82 chromium-132.0.6834.159/chromecast/media/audio/cma_audio_output_stream.cc | 292 chromium-132.0.6834.159/chromecast/media/audio/cma_audio_output_stream.h | 105 chromium-132.0.6834.159/chromecast/media/audio/external_audio_pipeline_dummy.cc | 69 chromium-132.0.6834.159/chromecast/media/audio/external_audio_pipeline_sample.cc | 131 chromium-132.0.6834.159/chromecast/media/audio/fake_external_audio_pipeline.cc | 277 chromium-132.0.6834.159/chromecast/media/audio/fake_external_audio_pipeline_support.h | 38 chromium-132.0.6834.159/chromecast/media/audio/interleaved_channel_mixer.cc | 76 chromium-132.0.6834.159/chromecast/media/audio/interleaved_channel_mixer.h | 55 chromium-132.0.6834.159/chromecast/media/audio/interleaved_channel_mixer_unittest.cc | 92 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/DEPS | 6 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/constants.cc | 19 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/constants.h | 24 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/control_connection.cc | 262 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/control_connection.h | 123 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/loopback_connection.cc | 95 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/loopback_connection.h | 87 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/loopback_interrupt_reason.h | 27 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/mixer_connection.cc | 121 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/mixer_connection.h | 58 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/mixer_control.cc | 58 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/mixer_control.h | 59 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/mixer_service_transport.proto | 287 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/mixer_socket.cc | 97 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/mixer_socket.h | 133 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/mock_mixer_socket.cc | 16 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/mock_mixer_socket.h | 50 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/output_stream_connection.cc | 256 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/output_stream_connection.h | 162 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/receiver/cma_backend_shim.cc | 227 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/receiver/cma_backend_shim.h | 123 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/receiver/receiver.cc | 183 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/receiver/receiver.h | 73 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/receiver/receiver_cma.cc | 236 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/receiver/receiver_cma.h | 63 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/receiver/receiver_creation.cc | 41 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/receiver/receiver_creation.h | 31 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/redirected_audio_connection.cc | 125 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/redirected_audio_connection.h | 120 chromium-132.0.6834.159/chromecast/media/audio/mixer_service/redirected_audio_connection_unittest.cc | 72 chromium-132.0.6834.159/chromecast/media/audio/mock_audio_input_callback.h | 28 chromium-132.0.6834.159/chromecast/media/audio/mock_cast_audio_manager_helper_delegate.h | 33 chromium-132.0.6834.159/chromecast/media/audio/net/DEPS | 14 chromium-132.0.6834.159/chromecast/media/audio/net/audio_socket.cc | 388 chromium-132.0.6834.159/chromecast/media/audio/net/audio_socket.h | 170 chromium-132.0.6834.159/chromecast/media/audio/net/audio_socket_service.cc | 57 chromium-132.0.6834.159/chromecast/media/audio/net/audio_socket_service.h | 96 chromium-132.0.6834.159/chromecast/media/audio/net/audio_socket_service_tcp.cc | 79 chromium-132.0.6834.159/chromecast/media/audio/net/audio_socket_service_uds.cc | 138 chromium-132.0.6834.159/chromecast/media/audio/net/audio_socket_service_uds_unittest.cc | 148 chromium-132.0.6834.159/chromecast/media/audio/net/common.proto | 51 chromium-132.0.6834.159/chromecast/media/audio/net/conversions.cc | 97 chromium-132.0.6834.159/chromecast/media/audio/net/conversions.h | 33 chromium-132.0.6834.159/chromecast/media/audio/playback_rate_shifter.cc | 173 chromium-132.0.6834.159/chromecast/media/audio/playback_rate_shifter.h | 77 chromium-132.0.6834.159/chromecast/media/audio/playback_rate_shifter_unittest.cc | 209 chromium-132.0.6834.159/chromecast/media/audio/rate_adjuster.cc | 123 chromium-132.0.6834.159/chromecast/media/audio/rate_adjuster.h | 86 chromium-132.0.6834.159/chromecast/media/audio/rate_adjuster_unittest.cc | 131 chromium-132.0.6834.159/chromecast/media/audio/wav_header.h | 84 chromium-132.0.6834.159/chromecast/media/avsettings/avsettings_dummy.cc | 108 chromium-132.0.6834.159/chromecast/media/avsettings/avsettings_dummy.h | 56 chromium-132.0.6834.159/chromecast/media/avsettings/avsettings_shlib.cc | 59 chromium-132.0.6834.159/chromecast/media/base/aligned_buffer.h | 97 chromium-132.0.6834.159/chromecast/media/base/audio_device_ids.cc | 20 chromium-132.0.6834.159/chromecast/media/base/audio_device_ids.h | 35 chromium-132.0.6834.159/chromecast/media/base/cast_decoder_buffer_impl.cc | 76 chromium-132.0.6834.159/chromecast/media/base/cast_decoder_buffer_impl.h | 50 chromium-132.0.6834.159/chromecast/media/base/decrypt_context_impl.cc | 60 chromium-132.0.6834.159/chromecast/media/base/decrypt_context_impl.h | 68 chromium-132.0.6834.159/chromecast/media/base/default_monotonic_clock.cc | 58 chromium-132.0.6834.159/chromecast/media/base/default_monotonic_clock.h | 35 chromium-132.0.6834.159/chromecast/media/base/key_systems_common.cc | 29 chromium-132.0.6834.159/chromecast/media/base/key_systems_common.h | 23 chromium-132.0.6834.159/chromecast/media/base/media_caps.cc | 112 chromium-132.0.6834.159/chromecast/media/base/media_caps.h | 57 chromium-132.0.6834.159/chromecast/media/base/media_codec_support.cc | 198 chromium-132.0.6834.159/chromecast/media/base/media_codec_support.h | 36 chromium-132.0.6834.159/chromecast/media/base/slew_volume.cc | 236 chromium-132.0.6834.159/chromecast/media/base/slew_volume.h | 95 chromium-132.0.6834.159/chromecast/media/base/slew_volume_unittests.cc | 544 chromium-132.0.6834.159/chromecast/media/base/supported_codec_profile_levels_memo.cc | 44 chromium-132.0.6834.159/chromecast/media/base/supported_codec_profile_levels_memo.h | 42 chromium-132.0.6834.159/chromecast/media/base/supported_codec_profile_levels_memo_unittest.cc | 34 chromium-132.0.6834.159/chromecast/media/base/video_mode_switcher.cc | 13 chromium-132.0.6834.159/chromecast/media/base/video_mode_switcher.h | 39 chromium-132.0.6834.159/chromecast/media/base/video_plane_controller.cc | 337 chromium-132.0.6834.159/chromecast/media/base/video_plane_controller.h | 125 chromium-132.0.6834.159/chromecast/media/base/video_plane_controller_test.cc | 166 chromium-132.0.6834.159/chromecast/media/base/video_resolution_policy.cc | 13 chromium-132.0.6834.159/chromecast/media/base/video_resolution_policy.h | 42 chromium-132.0.6834.159/chromecast/media/cdm/DIR_METADATA | 6 chromium-132.0.6834.159/chromecast/media/cdm/cast_cdm.cc | 202 chromium-132.0.6834.159/chromecast/media/cdm/cast_cdm.h | 118 chromium-132.0.6834.159/chromecast/media/cdm/cast_cdm_context.cc | 18 chromium-132.0.6834.159/chromecast/media/cdm/cast_cdm_context.h | 46 chromium-132.0.6834.159/chromecast/media/cdm/cast_cdm_factory.cc | 86 chromium-132.0.6834.159/chromecast/media/cdm/cast_cdm_factory.h | 64 chromium-132.0.6834.159/chromecast/media/cdm/cast_cdm_origin_provider.cc | 20 chromium-132.0.6834.159/chromecast/media/cdm/cast_cdm_origin_provider.h | 31 chromium-132.0.6834.159/chromecast/media/cdm/chromecast_init_data.cc | 67 chromium-132.0.6834.159/chromecast/media/cdm/chromecast_init_data.h | 41 chromium-132.0.6834.159/chromecast/media/cdm/chromecast_init_data_unittest.cc | 101 chromium-132.0.6834.159/chromecast/media/cma/DEPS | 4 chromium-132.0.6834.159/chromecast/media/cma/backend/DEPS | 4 chromium-132.0.6834.159/chromecast/media/cma/backend/alsa/alsa_fsm.dot | 91 chromium-132.0.6834.159/chromecast/media/cma/backend/alsa/alsa_volume_control.cc | 394 chromium-132.0.6834.159/chromecast/media/cma/backend/alsa/alsa_volume_control.h | 91 chromium-132.0.6834.159/chromecast/media/cma/backend/alsa/alsa_volume_control_unittest.cc | 40 chromium-132.0.6834.159/chromecast/media/cma/backend/alsa/alsa_wrapper.cc | 92 chromium-132.0.6834.159/chromecast/media/cma/backend/alsa/alsa_wrapper.h | 54 chromium-132.0.6834.159/chromecast/media/cma/backend/alsa/cast_media_shlib.cc | 165 chromium-132.0.6834.159/chromecast/media/cma/backend/alsa/mixer_output_stream_alsa.cc | 550 chromium-132.0.6834.159/chromecast/media/cma/backend/alsa/mixer_output_stream_alsa.h | 94 chromium-132.0.6834.159/chromecast/media/cma/backend/alsa/scoped_alsa_mixer.cc | 134 chromium-132.0.6834.159/chromecast/media/cma/backend/alsa/scoped_alsa_mixer.h | 56 chromium-132.0.6834.159/chromecast/media/cma/backend/alsa/scoped_alsa_mixer_unittest.cc | 387 chromium-132.0.6834.159/chromecast/media/cma/backend/android/DEPS | 4 chromium-132.0.6834.159/chromecast/media/cma/backend/android/audio_decoder_android.cc | 702 chromium-132.0.6834.159/chromecast/media/cma/backend/android/audio_decoder_android.h | 132 chromium-132.0.6834.159/chromecast/media/cma/backend/android/audio_sink_android.cc | 62 chromium-132.0.6834.159/chromecast/media/cma/backend/android/audio_sink_android.h | 141 chromium-132.0.6834.159/chromecast/media/cma/backend/android/audio_sink_android_audiotrack_impl.cc | 453 chromium-132.0.6834.159/chromecast/media/cma/backend/android/audio_sink_android_audiotrack_impl.h | 175 chromium-132.0.6834.159/chromecast/media/cma/backend/android/audio_sink_manager.cc | 108 chromium-132.0.6834.159/chromecast/media/cma/backend/android/audio_sink_manager.h | 72 chromium-132.0.6834.159/chromecast/media/cma/backend/android/cast_media_android.cc | 92 chromium-132.0.6834.159/chromecast/media/cma/backend/android/media_codec_support_cast_audio.cc | 25 chromium-132.0.6834.159/chromecast/media/cma/backend/android/media_pipeline_backend_android.cc | 134 chromium-132.0.6834.159/chromecast/media/cma/backend/android/media_pipeline_backend_android.h | 76 chromium-132.0.6834.159/chromecast/media/cma/backend/android/volume_cache.cc | 76 chromium-132.0.6834.159/chromecast/media/cma/backend/android/volume_cache.h | 53 chromium-132.0.6834.159/chromecast/media/cma/backend/android/volume_cache_test.cc | 121 chromium-132.0.6834.159/chromecast/media/cma/backend/android/volume_control_android.cc | 372 chromium-132.0.6834.159/chromecast/media/cma/backend/android/volume_control_android.h | 95 chromium-132.0.6834.159/chromecast/media/cma/backend/audio_decoder_for_mixer.cc | 607 chromium-132.0.6834.159/chromecast/media/cma/backend/audio_decoder_for_mixer.h | 141 chromium-132.0.6834.159/chromecast/media/cma/backend/audio_video_pipeline_device_unittest.cc | 1259 - chromium-132.0.6834.159/chromecast/media/cma/backend/av_sync.h | 57 chromium-132.0.6834.159/chromecast/media/cma/backend/av_sync_dummy.cc | 16 chromium-132.0.6834.159/chromecast/media/cma/backend/cast_audio_json.cc | 111 chromium-132.0.6834.159/chromecast/media/cma/backend/cast_audio_json.h | 84 chromium-132.0.6834.159/chromecast/media/cma/backend/cast_media_dummy.cc | 94 chromium-132.0.6834.159/chromecast/media/cma/backend/cma_backend_factory_impl.cc | 45 chromium-132.0.6834.159/chromecast/media/cma/backend/cma_backend_factory_impl.h | 50 chromium-132.0.6834.159/chromecast/media/cma/backend/cplay/cplay.cc | 384 chromium-132.0.6834.159/chromecast/media/cma/backend/desktop/audio_decoder_desktop.cc | 70 chromium-132.0.6834.159/chromecast/media/cma/backend/desktop/audio_decoder_desktop.h | 51 chromium-132.0.6834.159/chromecast/media/cma/backend/desktop/cast_media_desktop.cc | 88 chromium-132.0.6834.159/chromecast/media/cma/backend/desktop/desktop_system_volume_control.cc | 60 chromium-132.0.6834.159/chromecast/media/cma/backend/desktop/media_pipeline_backend_desktop.cc | 119 chromium-132.0.6834.159/chromecast/media/cma/backend/desktop/media_pipeline_backend_desktop.h | 64 chromium-132.0.6834.159/chromecast/media/cma/backend/desktop/media_sink_desktop.cc | 92 chromium-132.0.6834.159/chromecast/media/cma/backend/desktop/media_sink_desktop.h | 46 chromium-132.0.6834.159/chromecast/media/cma/backend/desktop/mixer_output_stream_desktop.cc | 62 chromium-132.0.6834.159/chromecast/media/cma/backend/desktop/mixer_output_stream_desktop.h | 43 chromium-132.0.6834.159/chromecast/media/cma/backend/desktop/video_decoder_desktop.cc | 54 chromium-132.0.6834.159/chromecast/media/cma/backend/desktop/video_decoder_desktop.h | 47 chromium-132.0.6834.159/chromecast/media/cma/backend/desktop/volume_control_desktop.cc | 217 chromium-132.0.6834.159/chromecast/media/cma/backend/media_codec_support_cast_audio.cc | 23 chromium-132.0.6834.159/chromecast/media/cma/backend/media_pipeline_backend_for_mixer.cc | 317 chromium-132.0.6834.159/chromecast/media/cma/backend/media_pipeline_backend_for_mixer.h | 114 chromium-132.0.6834.159/chromecast/media/cma/backend/media_pipeline_backend_manager_mixer.cc | 35 chromium-132.0.6834.159/chromecast/media/cma/backend/media_pipeline_backend_manager_no_mixer.cc | 13 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/audio_output_redirector.cc | 477 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/audio_output_redirector.h | 145 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/audio_output_redirector_input.h | 44 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/channel_layout.cc | 48 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/channel_layout.h | 36 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/filter_group.cc | 358 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/filter_group.h | 186 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/filter_group_unittest.cc | 248 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/loopback_handler.cc | 248 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/loopback_handler.h | 86 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/loopback_test_support.cc | 46 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/loopback_test_support.h | 23 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/mixer_input.cc | 527 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/mixer_input.h | 248 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/mixer_input_connection.cc | 1397 - chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/mixer_input_connection.h | 239 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/mixer_loopback_connection.cc | 102 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/mixer_loopback_connection.h | 68 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/mixer_output_stream_dummy.cc | 49 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/mixer_output_stream_dummy.h | 33 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/mixer_pipeline.cc | 228 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/mixer_pipeline.h | 106 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/mixer_service_receiver.cc | 202 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/mixer_service_receiver.h | 65 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/mock_mixer_source.cc | 48 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/mock_mixer_source.h | 106 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/mock_post_processor_factory.cc | 77 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/mock_post_processor_factory.h | 93 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/mock_redirected_audio_output.cc | 48 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/mock_redirected_audio_output.h | 62 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/post_processing_pipeline.h | 59 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/post_processing_pipeline_impl.cc | 293 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/post_processing_pipeline_impl.h | 108 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/post_processing_pipeline_parser.cc | 215 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/post_processing_pipeline_parser.h | 81 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/post_processor_factory.cc | 126 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/post_processor_factory.h | 53 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/post_processor_paths.cc | 28 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/post_processor_paths.h | 22 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/post_processor_registry.cc | 38 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/post_processor_registry.h | 81 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/post_processors/governor.cc | 100 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/post_processors/governor.h | 57 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/post_processors/governor_unittest.cc | 138 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/post_processors/post_processor_name.cc | 17 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/post_processors/post_processor_unittest.cc | 356 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/post_processors/post_processor_unittest.h | 133 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/post_processors/post_processor_wrapper.cc | 66 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/post_processors/post_processor_wrapper.h | 59 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/post_processors/saturated_gain.cc | 75 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/post_processors/saturated_gain.h | 42 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/post_processors/saturated_gain_unittest.cc | 83 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/stream_mixer.cc | 1105 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/stream_mixer.h | 276 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/stream_mixer_external_audio_pipeline_unittest.cc | 237 chromium-132.0.6834.159/chromecast/media/cma/backend/mixer/stream_mixer_unittest.cc | 1687 - chromium-132.0.6834.159/chromecast/media/cma/backend/mock_media_pipeline_backend_for_mixer.h | 60 chromium-132.0.6834.159/chromecast/media/cma/backend/multizone_backend_unittest.cc | 410 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/DEPS | 4 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/README.md | 156 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/audio_channel_broker_impl.cc | 207 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/audio_channel_broker_impl.h | 250 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/audio_channel_push_buffer_handler.h | 72 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/audio_decoder_pipeline_node.cc | 129 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/audio_decoder_pipeline_node.h | 96 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/audio_decoder_pipeline_node_unittest.cc | 144 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/buffer_id_manager.cc | 188 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/buffer_id_manager.h | 174 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/buffer_id_manager_unittest.cc | 258 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/cast_runtime_audio_channel_broker.cc | 15 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/cast_runtime_audio_channel_broker.h | 134 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/cast_runtime_audio_channel_endpoint_manager.h | 27 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/cast_runtime_audio_channel_endpoint_simple.cc | 20 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/cma_backend_proxy.cc | 156 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/cma_backend_proxy.h | 90 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/cma_backend_proxy_unittest.cc | 239 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/cma_proxy_handler.h | 104 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/media_pipeline_buffer_extension.cc | 228 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/media_pipeline_buffer_extension.h | 126 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/media_pipeline_buffer_extension_unittest.cc | 319 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/multizone_audio_decoder_proxy.h | 38 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/multizone_audio_decoder_proxy_impl.cc | 164 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/multizone_audio_decoder_proxy_impl.h | 115 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/proxy_call_translator.cc | 368 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/proxy_call_translator.h | 122 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/proxy_call_translator_unittest.cc | 355 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/push_buffer_pending_handler.cc | 131 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/push_buffer_pending_handler.h | 103 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/push_buffer_pending_handler_unittest.cc | 258 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/push_buffer_queue.cc | 277 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/push_buffer_queue.h | 184 chromium-132.0.6834.159/chromecast/media/cma/backend/proxy/push_buffer_queue_unittest.cc | 343 chromium-132.0.6834.159/chromecast/media/cma/backend/saved_volumes.cc | 99 chromium-132.0.6834.159/chromecast/media/cma/backend/saved_volumes.h | 23 chromium-132.0.6834.159/chromecast/media/cma/backend/system_volume_control.h | 73 chromium-132.0.6834.159/chromecast/media/cma/backend/video/av_sync_video.cc | 278 chromium-132.0.6834.159/chromecast/media/cma/backend/video/av_sync_video.h | 80 chromium-132.0.6834.159/chromecast/media/cma/backend/video/cast_media_shlib_common.cc | 25 chromium-132.0.6834.159/chromecast/media/cma/backend/video/cast_media_shlib_default.cc | 40 chromium-132.0.6834.159/chromecast/media/cma/backend/video_decoder_for_mixer.h | 125 chromium-132.0.6834.159/chromecast/media/cma/backend/video_decoder_null.cc | 114 chromium-132.0.6834.159/chromecast/media/cma/backend/video_decoder_null.h | 57 chromium-132.0.6834.159/chromecast/media/cma/backend/volume_control.cc | 452 chromium-132.0.6834.159/chromecast/media/cma/backend/volume_map.cc | 162 chromium-132.0.6834.159/chromecast/media/cma/backend/volume_map.h | 60 chromium-132.0.6834.159/chromecast/media/cma/backend/volume_map_unittest.cc | 95 chromium-132.0.6834.159/chromecast/media/cma/base/balanced_media_task_runner_factory.cc | 253 chromium-132.0.6834.159/chromecast/media/cma/base/balanced_media_task_runner_factory.h | 70 chromium-132.0.6834.159/chromecast/media/cma/base/balanced_media_task_runner_unittest.cc | 297 chromium-132.0.6834.159/chromecast/media/cma/base/buffering_controller.cc | 246 chromium-132.0.6834.159/chromecast/media/cma/base/buffering_controller.h | 117 chromium-132.0.6834.159/chromecast/media/cma/base/buffering_controller_unittest.cc | 115 chromium-132.0.6834.159/chromecast/media/cma/base/buffering_defs.cc | 23 chromium-132.0.6834.159/chromecast/media/cma/base/buffering_defs.h | 19 chromium-132.0.6834.159/chromecast/media/cma/base/buffering_frame_provider.cc | 142 chromium-132.0.6834.159/chromecast/media/cma/base/buffering_frame_provider.h | 123 chromium-132.0.6834.159/chromecast/media/cma/base/buffering_frame_provider_unittest.cc | 196 chromium-132.0.6834.159/chromecast/media/cma/base/buffering_state.cc | 148 chromium-132.0.6834.159/chromecast/media/cma/base/buffering_state.h | 141 chromium-132.0.6834.159/chromecast/media/cma/base/cast_decrypt_config_impl.cc | 45 chromium-132.0.6834.159/chromecast/media/cma/base/cast_decrypt_config_impl.h | 40 chromium-132.0.6834.159/chromecast/media/cma/base/coded_frame_provider.cc | 17 chromium-132.0.6834.159/chromecast/media/cma/base/coded_frame_provider.h | 53 chromium-132.0.6834.159/chromecast/media/cma/base/decoder_buffer_adapter.cc | 110 chromium-132.0.6834.159/chromecast/media/cma/base/decoder_buffer_adapter.h | 58 chromium-132.0.6834.159/chromecast/media/cma/base/decoder_buffer_adapter_unittest.cc | 192 chromium-132.0.6834.159/chromecast/media/cma/base/decoder_config_adapter.cc | 387 chromium-132.0.6834.159/chromecast/media/cma/base/decoder_config_adapter.h | 39 chromium-132.0.6834.159/chromecast/media/cma/base/decoder_config_adapter_unittest.cc | 46 chromium-132.0.6834.159/chromecast/media/cma/base/demuxer_stream_adapter.cc | 181 chromium-132.0.6834.159/chromecast/media/cma/base/demuxer_stream_adapter.h | 94 chromium-132.0.6834.159/chromecast/media/cma/base/demuxer_stream_adapter_unittest.cc | 224 chromium-132.0.6834.159/chromecast/media/cma/base/demuxer_stream_for_test.cc | 87 chromium-132.0.6834.159/chromecast/media/cma/base/demuxer_stream_for_test.h | 71 chromium-132.0.6834.159/chromecast/media/cma/base/media_task_runner.cc | 17 chromium-132.0.6834.159/chromecast/media/cma/base/media_task_runner.h | 42 chromium-132.0.6834.159/chromecast/media/cma/base/multi_demuxer_stream_adapter_unittest.cc | 180 chromium-132.0.6834.159/chromecast/media/cma/base/simple_media_task_runner.cc | 27 chromium-132.0.6834.159/chromecast/media/cma/base/simple_media_task_runner.h | 42 chromium-132.0.6834.159/chromecast/media/cma/decoder/DEPS | 3 chromium-132.0.6834.159/chromecast/media/cma/decoder/cast_audio_decoder.cc | 355 chromium-132.0.6834.159/chromecast/media/cma/decoder/external_audio_decoder_wrapper.cc | 290 chromium-132.0.6834.159/chromecast/media/cma/decoder/external_audio_decoder_wrapper.h | 79 chromium-132.0.6834.159/chromecast/media/cma/pipeline/audio_pipeline_impl.cc | 119 chromium-132.0.6834.159/chromecast/media/cma/pipeline/audio_pipeline_impl.h | 60 chromium-132.0.6834.159/chromecast/media/cma/pipeline/audio_video_pipeline_impl_unittest.cc | 459 chromium-132.0.6834.159/chromecast/media/cma/pipeline/av_pipeline_client.cc | 21 chromium-132.0.6834.159/chromecast/media/cma/pipeline/av_pipeline_client.h | 44 chromium-132.0.6834.159/chromecast/media/cma/pipeline/av_pipeline_impl.cc | 431 chromium-132.0.6834.159/chromecast/media/cma/pipeline/av_pipeline_impl.h | 206 chromium-132.0.6834.159/chromecast/media/cma/pipeline/backend_decryptor.cc | 94 chromium-132.0.6834.159/chromecast/media/cma/pipeline/backend_decryptor.h | 60 chromium-132.0.6834.159/chromecast/media/cma/pipeline/cdm_decryptor.cc | 60 chromium-132.0.6834.159/chromecast/media/cma/pipeline/cdm_decryptor.h | 42 chromium-132.0.6834.159/chromecast/media/cma/pipeline/decrypt_util.cc | 82 chromium-132.0.6834.159/chromecast/media/cma/pipeline/decrypt_util.h | 58 chromium-132.0.6834.159/chromecast/media/cma/pipeline/load_type.h | 21 chromium-132.0.6834.159/chromecast/media/cma/pipeline/media_pipeline_client.cc | 22 chromium-132.0.6834.159/chromecast/media/cma/pipeline/media_pipeline_client.h | 42 chromium-132.0.6834.159/chromecast/media/cma/pipeline/media_pipeline_impl.cc | 592 chromium-132.0.6834.159/chromecast/media/cma/pipeline/media_pipeline_impl.h | 143 chromium-132.0.6834.159/chromecast/media/cma/pipeline/media_pipeline_observer.cc | 47 chromium-132.0.6834.159/chromecast/media/cma/pipeline/media_pipeline_observer.h | 38 chromium-132.0.6834.159/chromecast/media/cma/pipeline/stream_decryptor.h | 49 chromium-132.0.6834.159/chromecast/media/cma/pipeline/video_pipeline_client.cc | 21 chromium-132.0.6834.159/chromecast/media/cma/pipeline/video_pipeline_client.h | 39 chromium-132.0.6834.159/chromecast/media/cma/pipeline/video_pipeline_impl.cc | 160 chromium-132.0.6834.159/chromecast/media/cma/pipeline/video_pipeline_impl.h | 61 chromium-132.0.6834.159/chromecast/media/cma/test/DEPS | 5 chromium-132.0.6834.159/chromecast/media/cma/test/frame_generator_for_test.cc | 116 chromium-132.0.6834.159/chromecast/media/cma/test/frame_generator_for_test.h | 63 chromium-132.0.6834.159/chromecast/media/cma/test/frame_segmenter_for_test.cc | 355 chromium-132.0.6834.159/chromecast/media/cma/test/frame_segmenter_for_test.h | 47 chromium-132.0.6834.159/chromecast/media/cma/test/mock_frame_consumer.cc | 111 chromium-132.0.6834.159/chromecast/media/cma/test/mock_frame_consumer.h | 73 chromium-132.0.6834.159/chromecast/media/cma/test/mock_frame_provider.cc | 98 chromium-132.0.6834.159/chromecast/media/cma/test/mock_frame_provider.h | 56 chromium-132.0.6834.159/chromecast/media/common/audio_decoder_software_wrapper.cc | 205 chromium-132.0.6834.159/chromecast/media/common/audio_decoder_software_wrapper.h | 76 chromium-132.0.6834.159/chromecast/media/common/audio_decoder_software_wrapper_unittest.cc | 72 chromium-132.0.6834.159/chromecast/media/common/audio_decoder_wrapper.cc | 248 chromium-132.0.6834.159/chromecast/media/common/audio_decoder_wrapper.h | 107 chromium-132.0.6834.159/chromecast/media/common/base/decoder_config_logging.cc | 69 chromium-132.0.6834.159/chromecast/media/common/base/decoder_config_logging.h | 17 chromium-132.0.6834.159/chromecast/media/common/media_pipeline_backend_manager.cc | 290 chromium-132.0.6834.159/chromecast/media/common/media_pipeline_backend_manager.h | 206 chromium-132.0.6834.159/chromecast/media/common/media_pipeline_backend_wrapper.cc | 373 chromium-132.0.6834.159/chromecast/media/common/media_pipeline_backend_wrapper.h | 69 chromium-132.0.6834.159/chromecast/media/common/media_resource_tracker.cc | 163 chromium-132.0.6834.159/chromecast/media/common/media_resource_tracker.h | 114 chromium-132.0.6834.159/chromecast/media/common/media_resource_tracker_unittest.cc | 180 chromium-132.0.6834.159/chromecast/media/common/test_media_resource_tracker.cc | 44 chromium-132.0.6834.159/chromecast/media/common/test_media_resource_tracker.h | 54 chromium-132.0.6834.159/chromecast/media/common/video_decoder_wrapper.cc | 89 chromium-132.0.6834.159/chromecast/media/common/video_decoder_wrapper.h | 51 chromium-132.0.6834.159/chromecast/media/gpu/DEPS | 8 chromium-132.0.6834.159/chromecast/media/gpu/cast_gpu_factory.h | 61 chromium-132.0.6834.159/chromecast/media/gpu/cast_gpu_factory_dummy.cc | 44 chromium-132.0.6834.159/chromecast/media/gpu/cast_gpu_factory_dummy.h | 31 chromium-132.0.6834.159/chromecast/media/gpu/cast_gpu_factory_impl.cc | 337 chromium-132.0.6834.159/chromecast/media/gpu/cast_gpu_factory_impl.h | 116 chromium-132.0.6834.159/chromecast/media/mojom/OWNERS | 6 chromium-132.0.6834.159/chromecast/media/mojom/decoder_config_mojom_traits.cc | 57 chromium-132.0.6834.159/chromecast/media/mojom/decoder_config_mojom_traits.h | 334 chromium-132.0.6834.159/chromecast/media/mojom/media_types.mojom | 69 chromium-132.0.6834.159/chromecast/media/service/DEPS | 6 chromium-132.0.6834.159/chromecast/media/service/cast_mojo_media_client.cc | 74 chromium-132.0.6834.159/chromecast/media/service/cast_mojo_media_client.h | 78 chromium-132.0.6834.159/chromecast/media/service/cast_renderer.cc | 427 chromium-132.0.6834.159/chromecast/media/service/cast_renderer.h | 153 chromium-132.0.6834.159/chromecast/media/service/mojom/OWNERS | 3 chromium-132.0.6834.159/chromecast/media/service/mojom/video_geometry_setter.mojom | 58 chromium-132.0.6834.159/chromecast/media/service/video_geometry_setter_service.cc | 89 chromium-132.0.6834.159/chromecast/media/service/video_geometry_setter_service.h | 79 chromium-132.0.6834.159/chromecast/media/test/run_all_unittests.cc | 38 chromium-132.0.6834.159/chromecast/metrics/DEPS | 8 chromium-132.0.6834.159/chromecast/metrics/OWNERS | 2 chromium-132.0.6834.159/chromecast/metrics/cast_event_builder.cc | 36 chromium-132.0.6834.159/chromecast/metrics/cast_event_builder.h | 131 chromium-132.0.6834.159/chromecast/metrics/cast_event_builder_impl.cc | 255 chromium-132.0.6834.159/chromecast/metrics/cast_event_builder_impl.h | 74 chromium-132.0.6834.159/chromecast/metrics/cast_event_builder_impl_unittest.cc | 166 chromium-132.0.6834.159/chromecast/metrics/cast_event_builder_simple.cc | 173 chromium-132.0.6834.159/chromecast/metrics/cast_event_builder_simple.h | 71 chromium-132.0.6834.159/chromecast/metrics/cast_metrics_service_client.cc | 413 chromium-132.0.6834.159/chromecast/metrics/cast_metrics_service_client.h | 156 chromium-132.0.6834.159/chromecast/metrics/cast_metrics_service_client_unittest.cc | 100 chromium-132.0.6834.159/chromecast/metrics/metrics_recorder.cc | 328 chromium-132.0.6834.159/chromecast/metrics/metrics_recorder.h | 173 chromium-132.0.6834.159/chromecast/metrics/metrics_recorder_base.cc | 36 chromium-132.0.6834.159/chromecast/metrics/metrics_recorder_base.h | 39 chromium-132.0.6834.159/chromecast/metrics/metrics_recorder_base_unittest.cc | 161 chromium-132.0.6834.159/chromecast/metrics/metrics_util.cc | 32 chromium-132.0.6834.159/chromecast/metrics/metrics_util.h | 20 chromium-132.0.6834.159/chromecast/metrics/mock_cast_event_builder.cc | 238 chromium-132.0.6834.159/chromecast/metrics/mock_cast_event_builder.h | 214 chromium-132.0.6834.159/chromecast/metrics/mock_cast_sys_info_util.cc | 22 chromium-132.0.6834.159/chromecast/metrics/mock_cast_sys_info_util.h | 19 chromium-132.0.6834.159/chromecast/metrics/timed_event_recorder.cc | 63 chromium-132.0.6834.159/chromecast/metrics/timed_event_recorder.h | 66 chromium-132.0.6834.159/chromecast/mojo/DEPS | 3 chromium-132.0.6834.159/chromecast/mojo/OWNERS | 2 chromium-132.0.6834.159/chromecast/mojo/binder_factory.cc | 15 chromium-132.0.6834.159/chromecast/mojo/binder_factory.h | 342 chromium-132.0.6834.159/chromecast/mojo/binder_factory_test.cc | 140 chromium-132.0.6834.159/chromecast/mojo/interface_bundle.cc | 43 chromium-132.0.6834.159/chromecast/mojo/interface_bundle.h | 152 chromium-132.0.6834.159/chromecast/mojo/interface_bundle_test.cc | 133 chromium-132.0.6834.159/chromecast/mojo/mojom/OWNERS | 2 chromium-132.0.6834.159/chromecast/mojo/mojom/remote_interfaces.mojom | 31 chromium-132.0.6834.159/chromecast/mojo/remote_interfaces.cc | 59 chromium-132.0.6834.159/chromecast/mojo/remote_interfaces.h | 113 chromium-132.0.6834.159/chromecast/mojo/test/DEPS | 3 chromium-132.0.6834.159/chromecast/mojo/test/run_all_unittests.cc | 16 chromium-132.0.6834.159/chromecast/mojo/test/test_interfaces.test-mojom | 18 chromium-132.0.6834.159/chromecast/net/DEPS | 8 chromium-132.0.6834.159/chromecast/net/connectivity_checker.cc | 84 chromium-132.0.6834.159/chromecast/net/connectivity_checker.h | 121 chromium-132.0.6834.159/chromecast/net/connectivity_checker_impl.cc | 374 chromium-132.0.6834.159/chromecast/net/connectivity_checker_impl.h | 186 chromium-132.0.6834.159/chromecast/net/connectivity_checker_impl_unittest.cc | 449 chromium-132.0.6834.159/chromecast/net/fake_connectivity_checker.cc | 31 chromium-132.0.6834.159/chromecast/net/fake_connectivity_checker.h | 38 chromium-132.0.6834.159/chromecast/net/fake_shared_url_loader_factory.cc | 44 chromium-132.0.6834.159/chromecast/net/fake_shared_url_loader_factory.h | 80 chromium-132.0.6834.159/chromecast/net/fake_stream_socket.cc | 219 chromium-132.0.6834.159/chromecast/net/fake_stream_socket.h | 75 chromium-132.0.6834.159/chromecast/net/fake_stream_socket_unittest.cc | 139 chromium-132.0.6834.159/chromecast/net/io_buffer_pool.cc | 285 chromium-132.0.6834.159/chromecast/net/io_buffer_pool.h | 69 chromium-132.0.6834.159/chromecast/net/io_buffer_pool_unittest.cc | 113 chromium-132.0.6834.159/chromecast/net/mock_stream_socket.cc | 37 chromium-132.0.6834.159/chromecast/net/mock_stream_socket.h | 56 chromium-132.0.6834.159/chromecast/net/net_switches.cc | 17 chromium-132.0.6834.159/chromecast/net/net_switches.h | 15 chromium-132.0.6834.159/chromecast/net/net_util_cast.cc | 33 chromium-132.0.6834.159/chromecast/net/net_util_cast.h | 19 chromium-132.0.6834.159/chromecast/net/network_change_notifier_factory_cast.cc | 23 chromium-132.0.6834.159/chromecast/net/network_change_notifier_factory_cast.h | 34 chromium-132.0.6834.159/chromecast/net/network_change_notifier_factory_fuchsia.cc | 28 chromium-132.0.6834.159/chromecast/net/network_change_notifier_factory_fuchsia.h | 33 chromium-132.0.6834.159/chromecast/net/small_message_socket.cc | 491 chromium-132.0.6834.159/chromecast/net/small_message_socket.h | 211 chromium-132.0.6834.159/chromecast/net/small_message_socket_unittest.cc | 355 chromium-132.0.6834.159/chromecast/net/socket_util.cc | 47 chromium-132.0.6834.159/chromecast/net/socket_util.h | 29 chromium-132.0.6834.159/chromecast/net/time_sync_tracker.cc | 27 chromium-132.0.6834.159/chromecast/net/time_sync_tracker.h | 47 chromium-132.0.6834.159/chromecast/net/time_sync_tracker_fuchsia.cc | 47 chromium-132.0.6834.159/chromecast/net/time_sync_tracker_fuchsia.h | 38 chromium-132.0.6834.159/chromecast/public/DEPS | 9 chromium-132.0.6834.159/chromecast/public/avsettings.h | 408 chromium-132.0.6834.159/chromecast/public/bluetooth/bluetooth_types.h | 22 chromium-132.0.6834.159/chromecast/public/bluetooth/gatt.h | 390 chromium-132.0.6834.159/chromecast/public/bluetooth/le_scanner.h | 56 chromium-132.0.6834.159/chromecast/public/cast_egl_platform.h | 53 chromium-132.0.6834.159/chromecast/public/cast_egl_platform_shlib.h | 25 chromium-132.0.6834.159/chromecast/public/cast_media_shlib.h | 81 chromium-132.0.6834.159/chromecast/public/cast_sys_info.h | 78 chromium-132.0.6834.159/chromecast/public/cast_sys_info_shlib.h | 26 chromium-132.0.6834.159/chromecast/public/chromecast_export.h | 12 chromium-132.0.6834.159/chromecast/public/graphics_properties_shlib.h | 32 chromium-132.0.6834.159/chromecast/public/graphics_types.h | 41 chromium-132.0.6834.159/chromecast/public/media/audio_post_processor2_shlib.h | 133 chromium-132.0.6834.159/chromecast/public/media/audio_post_processor_shlib.h | 96 chromium-132.0.6834.159/chromecast/public/media/cast_decoder_buffer.h | 64 chromium-132.0.6834.159/chromecast/public/media/cast_decrypt_config.h | 89 chromium-132.0.6834.159/chromecast/public/media/cast_key_status.h | 19 chromium-132.0.6834.159/chromecast/public/media/cast_key_system.h | 23 chromium-132.0.6834.159/chromecast/public/media/decoder_config.h | 411 chromium-132.0.6834.159/chromecast/public/media/decrypt_context.h | 42 chromium-132.0.6834.159/chromecast/public/media/external_audio_decoder.h | 88 chromium-132.0.6834.159/chromecast/public/media/external_audio_pipeline_shlib.h | 190 chromium-132.0.6834.159/chromecast/public/media/media_capabilities_shlib.h | 45 chromium-132.0.6834.159/chromecast/public/media/media_pipeline_backend.h | 404 chromium-132.0.6834.159/chromecast/public/media/media_pipeline_device_params.h | 192 chromium-132.0.6834.159/chromecast/public/media/mixer_output_stream.h | 62 chromium-132.0.6834.159/chromecast/public/media/stream_id.h | 19 chromium-132.0.6834.159/chromecast/public/osd_plane.h | 45 chromium-132.0.6834.159/chromecast/public/osd_plane_shlib.h | 25 chromium-132.0.6834.159/chromecast/public/osd_surface.h | 56 chromium-132.0.6834.159/chromecast/public/output_restrictions.h | 97 chromium-132.0.6834.159/chromecast/public/reboot_shlib.h | 187 chromium-132.0.6834.159/chromecast/public/task_runner.h | 56 chromium-132.0.6834.159/chromecast/public/video_plane.h | 54 chromium-132.0.6834.159/chromecast/public/volume_control.h | 159 chromium-132.0.6834.159/chromecast/renderer/DEPS | 33 chromium-132.0.6834.159/chromecast/renderer/OWNERS | 1 chromium-132.0.6834.159/chromecast/renderer/activity_filtering_websocket_handshake_throttle.cc | 38 chromium-132.0.6834.159/chromecast/renderer/activity_filtering_websocket_handshake_throttle.h | 48 chromium-132.0.6834.159/chromecast/renderer/assistant_bindings.cc | 169 chromium-132.0.6834.159/chromecast/renderer/assistant_bindings.h | 74 chromium-132.0.6834.159/chromecast/renderer/cast_activity_url_filter_manager.cc | 110 chromium-132.0.6834.159/chromecast/renderer/cast_activity_url_filter_manager.h | 94 chromium-132.0.6834.159/chromecast/renderer/cast_content_renderer_client.cc | 361 chromium-132.0.6834.159/chromecast/renderer/cast_content_renderer_client.h | 128 chromium-132.0.6834.159/chromecast/renderer/cast_content_renderer_client_simple.cc | 20 chromium-132.0.6834.159/chromecast/renderer/cast_content_settings_client.cc | 60 chromium-132.0.6834.159/chromecast/renderer/cast_content_settings_client.h | 51 chromium-132.0.6834.159/chromecast/renderer/cast_demo_bindings.cc | 388 chromium-132.0.6834.159/chromecast/renderer/cast_demo_bindings.h | 97 chromium-132.0.6834.159/chromecast/renderer/cast_url_loader_throttle_provider.cc | 67 chromium-132.0.6834.159/chromecast/renderer/cast_url_loader_throttle_provider.h | 48 chromium-132.0.6834.159/chromecast/renderer/cast_websocket_handshake_throttle_provider.cc | 59 chromium-132.0.6834.159/chromecast/renderer/cast_websocket_handshake_throttle_provider.h | 52 chromium-132.0.6834.159/chromecast/renderer/cast_window_manager_bindings.cc | 342 chromium-132.0.6834.159/chromecast/renderer/cast_window_manager_bindings.h | 108 chromium-132.0.6834.159/chromecast/renderer/feature_manager.cc | 180 chromium-132.0.6834.159/chromecast/renderer/feature_manager.h | 94 chromium-132.0.6834.159/chromecast/renderer/feature_manager_on_associated_interface.cc | 43 chromium-132.0.6834.159/chromecast/renderer/feature_manager_on_associated_interface.h | 56 chromium-132.0.6834.159/chromecast/renderer/media/DEPS | 5 chromium-132.0.6834.159/chromecast/renderer/media/key_systems_cast.cc | 118 chromium-132.0.6834.159/chromecast/renderer/media/key_systems_cast.h | 19 chromium-132.0.6834.159/chromecast/renderer/media/media_caps_observer_impl.cc | 32 chromium-132.0.6834.159/chromecast/renderer/media/media_caps_observer_impl.h | 37 chromium-132.0.6834.159/chromecast/renderer/memory_pressure_observer_impl.cc | 24 chromium-132.0.6834.159/chromecast/renderer/memory_pressure_observer_impl.h | 33 chromium-132.0.6834.159/chromecast/renderer/native_bindings_helper.cc | 89 chromium-132.0.6834.159/chromecast/renderer/native_bindings_helper.h | 79 chromium-132.0.6834.159/chromecast/renderer/queryable_data_store.cc | 33 chromium-132.0.6834.159/chromecast/renderer/queryable_data_store.h | 48 chromium-132.0.6834.159/chromecast/renderer/settings_ui_bindings.cc | 173 chromium-132.0.6834.159/chromecast/renderer/settings_ui_bindings.h | 69 chromium-132.0.6834.159/chromecast/resource_sizes/OWNERS | 2 chromium-132.0.6834.159/chromecast/resource_sizes/chromecast_resource_sizes.py | 330 chromium-132.0.6834.159/chromecast/service/cast_service.cc | 47 chromium-132.0.6834.159/chromecast/service/cast_service.h | 60 chromium-132.0.6834.159/chromecast/shared/DEPS | 5 chromium-132.0.6834.159/chromecast/shared/platform_info_serializer.cc | 361 chromium-132.0.6834.159/chromecast/shared/platform_info_serializer.h | 114 chromium-132.0.6834.159/chromecast/shared/platform_info_serializer_unittest.cc | 300 chromium-132.0.6834.159/chromecast/starboard/DEPS | 8 chromium-132.0.6834.159/chromecast/starboard/OWNERS | 2 chromium-132.0.6834.159/chromecast/starboard/chromecast/events/dummy_ui_event_source.cc | 33 chromium-132.0.6834.159/chromecast/starboard/chromecast/events/starboard_event_source.cc | 159 chromium-132.0.6834.159/chromecast/starboard/chromecast/events/starboard_event_source.h | 54 chromium-132.0.6834.159/chromecast/starboard/chromecast/events/starboard_event_source_test.cc | 170 chromium-132.0.6834.159/chromecast/starboard/chromecast/events/ui_event_source.cc | 11 chromium-132.0.6834.159/chromecast/starboard/chromecast/events/ui_event_source.h | 34 chromium-132.0.6834.159/chromecast/starboard/chromecast/starboard_adapter/public/cast_starboard_api_adapter.h | 62 chromium-132.0.6834.159/chromecast/starboard/chromecast/starboard_adapter/src/cast_starboard_api_adapter_dummy.cc | 22 chromium-132.0.6834.159/chromecast/starboard/chromecast/starboard_adapter/src/cast_starboard_api_adapter_impl.cc | 120 chromium-132.0.6834.159/chromecast/starboard/chromecast/starboard_adapter/src/cast_starboard_api_adapter_impl.h | 59 chromium-132.0.6834.159/chromecast/starboard/chromecast/starboard_cast_api/cast_starboard_api.h | 40 chromium-132.0.6834.159/chromecast/starboard/chromecast/starboard_cast_api/cast_starboard_api_types.h | 28 chromium-132.0.6834.159/chromecast/starboard/chromecast/starboard_cast_dummy/cast_starboard_api_dummy.cc | 134 chromium-132.0.6834.159/chromecast/starboard/graphics/cast_egl_platform_starboard.cc | 129 chromium-132.0.6834.159/chromecast/starboard/graphics/egl_starboard.cc | 232 chromium-132.0.6834.159/chromecast/starboard/graphics/egl_starboard.h | 160 chromium-132.0.6834.159/chromecast/starboard/graphics/egl_starboard_dummy.cc | 194 chromium-132.0.6834.159/chromecast/starboard/graphics/gles2_starboard.cc | 856 chromium-132.0.6834.159/chromecast/starboard/graphics/gles2_starboard.h | 392 chromium-132.0.6834.159/chromecast/starboard/graphics/gles2_starboard_dummy.cc | 561 chromium-132.0.6834.159/chromecast/starboard/graphics/graphics_properties_default.cc | 22 chromium-132.0.6834.159/chromecast/starboard/media/cdm/starboard_decryptor_cast.cc | 864 chromium-132.0.6834.159/chromecast/starboard/media/cdm/starboard_decryptor_cast.h | 246 chromium-132.0.6834.159/chromecast/starboard/media/cdm/starboard_decryptor_cast_test.cc | 714 chromium-132.0.6834.159/chromecast/starboard/media/cdm/starboard_drm_key_tracker.cc | 131 chromium-132.0.6834.159/chromecast/starboard/media/cdm/starboard_drm_key_tracker.h | 130 chromium-132.0.6834.159/chromecast/starboard/media/cdm/starboard_drm_key_tracker_test.cc | 151 chromium-132.0.6834.159/chromecast/starboard/media/media/cast_media_starboard.cc | 112 chromium-132.0.6834.159/chromecast/starboard/media/media/drm_util.cc | 138 chromium-132.0.6834.159/chromecast/starboard/media/media/drm_util.h | 68 chromium-132.0.6834.159/chromecast/starboard/media/media/media_pipeline_backend_starboard.cc | 418 chromium-132.0.6834.159/chromecast/starboard/media/media/media_pipeline_backend_starboard.h | 176 chromium-132.0.6834.159/chromecast/starboard/media/media/media_pipeline_backend_starboard_test.cc | 459 chromium-132.0.6834.159/chromecast/starboard/media/media/mime_utils.cc | 63 chromium-132.0.6834.159/chromecast/starboard/media/media/mime_utils.h | 30 chromium-132.0.6834.159/chromecast/starboard/media/media/mime_utils_test.cc | 91 chromium-132.0.6834.159/chromecast/starboard/media/media/mock_starboard_api_wrapper.cc | 14 chromium-132.0.6834.159/chromecast/starboard/media/media/mock_starboard_api_wrapper.h | 103 chromium-132.0.6834.159/chromecast/starboard/media/media/starboard_api_wrapper.cc | 13 chromium-132.0.6834.159/chromecast/starboard/media/media/starboard_api_wrapper.h | 517 chromium-132.0.6834.159/chromecast/starboard/media/media/starboard_api_wrapper_14.cc | 166 chromium-132.0.6834.159/chromecast/starboard/media/media/starboard_api_wrapper_15.cc | 178 chromium-132.0.6834.159/chromecast/starboard/media/media/starboard_api_wrapper_base.cc | 404 chromium-132.0.6834.159/chromecast/starboard/media/media/starboard_api_wrapper_base.h | 112 chromium-132.0.6834.159/chromecast/starboard/media/media/starboard_api_wrapper_dummy.cc | 15 chromium-132.0.6834.159/chromecast/starboard/media/media/starboard_audio_decoder.cc | 217 chromium-132.0.6834.159/chromecast/starboard/media/media/starboard_audio_decoder.h | 64 chromium-132.0.6834.159/chromecast/starboard/media/media/starboard_audio_decoder_test.cc | 690 chromium-132.0.6834.159/chromecast/starboard/media/media/starboard_decoder.cc | 257 chromium-132.0.6834.159/chromecast/starboard/media/media/starboard_decoder.h | 148 chromium-132.0.6834.159/chromecast/starboard/media/media/starboard_resampler.cc | 299 chromium-132.0.6834.159/chromecast/starboard/media/media/starboard_resampler.h | 40 chromium-132.0.6834.159/chromecast/starboard/media/media/starboard_resampler_test.cc | 515 chromium-132.0.6834.159/chromecast/starboard/media/media/starboard_video_decoder.cc | 231 chromium-132.0.6834.159/chromecast/starboard/media/media/starboard_video_decoder.h | 60 chromium-132.0.6834.159/chromecast/starboard/media/media/starboard_video_decoder_test.cc | 693 chromium-132.0.6834.159/chromecast/starboard/media/media/starboard_video_plane.cc | 84 chromium-132.0.6834.159/chromecast/starboard/media/media/starboard_video_plane.h | 83 chromium-132.0.6834.159/chromecast/starboard/media/media/starboard_video_plane_test.cc | 83 chromium-132.0.6834.159/chromecast/starboard/media/media/starboard_volume_control.cc | 59 chromium-132.0.6834.159/chromecast/system/reboot/fuchsia_component_restart_reason.cc | 83 chromium-132.0.6834.159/chromecast/system/reboot/fuchsia_component_restart_reason.h | 53 chromium-132.0.6834.159/chromecast/system/reboot/reboot_dummy.cc | 53 chromium-132.0.6834.159/chromecast/system/reboot/reboot_fuchsia.cc | 240 chromium-132.0.6834.159/chromecast/system/reboot/reboot_fuchsia.h | 31 chromium-132.0.6834.159/chromecast/system/reboot/reboot_fuchsia_test.cc | 396 chromium-132.0.6834.159/chromecast/system/reboot/reboot_util.h | 76 chromium-132.0.6834.159/chromecast/system/reboot/reboot_util_core.cc | 127 chromium-132.0.6834.159/chromecast/system/reboot/reboot_util_dummy.cc | 30 chromium-132.0.6834.159/chromecast/system/reboot/reboot_util_test.cc | 23 chromium-132.0.6834.159/chromecast/tools/build/generate_test_lists.py | 195 chromium-132.0.6834.159/chromecast/tools/build/package_test_deps.py | 108 chromium-132.0.6834.159/chromecast/tools/trace.py | 114 chromium-132.0.6834.159/chromecast/tools/tracinglib.py | 298 chromium-132.0.6834.159/chromecast/tracing/OWNERS | 1 chromium-132.0.6834.159/chromecast/tracing/ftrace.cc | 217 chromium-132.0.6834.159/chromecast/tracing/ftrace.h | 50 chromium-132.0.6834.159/chromecast/tracing/system_tracer.cc | 270 chromium-132.0.6834.159/chromecast/tracing/system_tracer.h | 54 chromium-132.0.6834.159/chromecast/tracing/system_tracing_common.cc | 30 chromium-132.0.6834.159/chromecast/tracing/system_tracing_common.h | 25 chromium-132.0.6834.159/chromecast/tracing/tracing_service_main.cc | 418 chromium-132.0.6834.159/chromecast/ui/DEPS | 14 chromium-132.0.6834.159/chromecast/ui/OWNERS | 1 chromium-132.0.6834.159/chromecast/ui/back_gesture_router.h | 22 chromium-132.0.6834.159/chromecast/ui/display_settings/brightness_animation.cc | 73 chromium-132.0.6834.159/chromecast/ui/display_settings/brightness_animation.h | 42 chromium-132.0.6834.159/chromecast/ui/display_settings/color_temperature_animation.cc | 122 chromium-132.0.6834.159/chromecast/ui/display_settings/color_temperature_animation.h | 56 chromium-132.0.6834.159/chromecast/ui/display_settings/gamma_configurator.cc | 77 chromium-132.0.6834.159/chromecast/ui/display_settings/gamma_configurator.h | 43 chromium-132.0.6834.159/chromecast/ui/display_settings/screen_power_controller.h | 61 chromium-132.0.6834.159/chromecast/ui/display_settings/screen_power_controller_aura.cc | 242 chromium-132.0.6834.159/chromecast/ui/display_settings/screen_power_controller_aura.h | 67 chromium-132.0.6834.159/chromecast/ui/display_settings/screen_power_controller_aura_unittest.cc | 217 chromium-132.0.6834.159/chromecast/ui/display_settings/screen_power_controller_default.cc | 57 chromium-132.0.6834.159/chromecast/ui/display_settings/screen_power_controller_default.h | 34 chromium-132.0.6834.159/chromecast/ui/display_settings_manager.cc | 16 chromium-132.0.6834.159/chromecast/ui/display_settings_manager.h | 63 chromium-132.0.6834.159/chromecast/ui/display_settings_manager_impl.cc | 214 chromium-132.0.6834.159/chromecast/ui/display_settings_manager_impl.h | 105 chromium-132.0.6834.159/chromecast/ui/mojom/OWNERS | 2 chromium-132.0.6834.159/chromecast/ui/mojom/display_settings.mojom | 44 chromium-132.0.6834.159/chromecast/ui/mojom/ui_service.mojom | 27 chromium-132.0.6834.159/chromecast/ui/vector_icons/back30.icon | 90 chromium-132.0.6834.159/chromecast/ui/vector_icons/forward30.icon | 90 chromium-132.0.6834.159/chromecast/ui/vector_icons/next.icon | 21 chromium-132.0.6834.159/chromecast/ui/vector_icons/pause.icon | 16 chromium-132.0.6834.159/chromecast/ui/vector_icons/play.icon | 9 chromium-132.0.6834.159/chromecast/ui/vector_icons/previous.icon | 20 chromium-132.0.6834.159/chromecast/ui/vector_icons/vector_icons.cc.template | 22 chromium-132.0.6834.159/chromecast/ui/vector_icons/vector_icons.h.template | 28 chromium-132.0.6834.159/chromeos/CHROMEOS_LKGM | 2 chromium-132.0.6834.159/chromeos/strings/chromeos_strings_ar.xtb | 2 chromium-132.0.6834.159/chromeos/strings/chromeos_strings_de.xtb | 2 chromium-132.0.6834.159/chromeos/strings/chromeos_strings_iw.xtb | 24 chromium-132.0.6834.159/chromeos/strings/chromeos_strings_mk.xtb | 2 chromium-132.0.6834.159/chromeos/strings/chromeos_strings_nl.xtb | 2 chromium-132.0.6834.159/chromeos/strings/chromeos_strings_ru.xtb | 2 chromium-132.0.6834.159/chromeos/strings/chromeos_strings_ur.xtb | 2 chromium-132.0.6834.159/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb | 2 chromium-132.0.6834.159/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb | 2 chromium-132.0.6834.159/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb | 4 chromium-132.0.6834.159/components/certificate_transparency/data/log_list.json | 4 chromium-132.0.6834.159/components/policy/resources/policy_templates_zh-CN.xtb | 4 chromium-132.0.6834.159/components/sessions/BUILD.gn | 1 chromium-132.0.6834.159/components/sessions/core/tab_restore_service_helper.cc | 39 chromium-132.0.6834.159/components/sessions/core/tab_restore_service_helper.h | 13 chromium-132.0.6834.159/components/sessions/core/tab_restore_service_helper_unittest.cc | 99 chromium-132.0.6834.159/components/strings/components_strings_ar.xtb | 2 chromium-132.0.6834.159/components/strings/components_strings_ca.xtb | 2 chromium-132.0.6834.159/components/strings/components_strings_da.xtb | 2 chromium-132.0.6834.159/components/strings/components_strings_de.xtb | 2 chromium-132.0.6834.159/components/strings/components_strings_fa.xtb | 2 chromium-132.0.6834.159/components/strings/components_strings_fr-CA.xtb | 2 chromium-132.0.6834.159/components/strings/components_strings_fr.xtb | 6 chromium-132.0.6834.159/components/strings/components_strings_hi.xtb | 4 chromium-132.0.6834.159/components/strings/components_strings_iw.xtb | 104 chromium-132.0.6834.159/components/strings/components_strings_vi.xtb | 2 chromium-132.0.6834.159/components/strings/privacy_sandbox_strings_fr.xtb | 2 chromium-132.0.6834.159/content/browser/web_contents/web_contents_impl.cc | 10 chromium-132.0.6834.159/debian/changelog | 18 chromium-132.0.6834.159/debian/copyright | 290 chromium-132.0.6834.159/debian/rules | 16 chromium-132.0.6834.159/gpu/config/gpu_lists_version.h | 2 chromium-132.0.6834.159/media/cast/common/encoded_frame.h | 6 chromium-132.0.6834.159/media/cast/encoding/external_video_encoder.cc | 59 chromium-132.0.6834.159/media/cast/encoding/external_video_encoder.h | 7 chromium-132.0.6834.159/media/cast/encoding/size_adaptable_video_encoder_base.cc | 26 chromium-132.0.6834.159/media/cast/encoding/size_adaptable_video_encoder_base.h | 15 chromium-132.0.6834.159/media/cast/encoding/video_encoder.cc | 11 chromium-132.0.6834.159/media/cast/encoding/video_encoder.h | 11 chromium-132.0.6834.159/media/cast/encoding/video_encoder_impl.cc | 18 chromium-132.0.6834.159/media/cast/encoding/video_encoder_impl.h | 7 chromium-132.0.6834.159/media/cast/encoding/video_encoder_unittest.cc | 65 chromium-132.0.6834.159/media/cast/sender/video_sender.cc | 39 chromium-132.0.6834.159/media/cast/sender/video_sender.h | 4 chromium-132.0.6834.159/net/data/ssl/chrome_root_store/root_store.md | 29 chromium-132.0.6834.159/net/http/transport_security_state_static.pins | 4 chromium-132.0.6834.159/net/http/transport_security_state_static_pins.json | 2 chromium-132.0.6834.159/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.h | 2 chromium-132.0.6834.159/third_party/blink/renderer/core/inspector/devtools_agent.cc | 1 chromium-132.0.6834.159/third_party/blink/renderer/core/inspector/devtools_agent.h | 4 chromium-132.0.6834.159/third_party/blink/renderer/core/inspector/worker_inspector_controller.h | 2 chromium-132.0.6834.159/third_party/blink/renderer/platform/media/url_index.cc | 5 chromium-132.0.6834.159/third_party/blink/renderer/platform/media/url_index_unittest.cc | 11 chromium-132.0.6834.159/third_party/blink/renderer/platform/runtime_enabled_features.json5 | 4 chromium-132.0.6834.159/third_party/closure_compiler/DIR_METADATA | 6 chromium-132.0.6834.159/third_party/closure_compiler/OWNERS | 10 chromium-132.0.6834.159/third_party/closure_compiler/README.chromium | 26 chromium-132.0.6834.159/third_party/closure_compiler/chromium_patch.diff | 1106 chromium-132.0.6834.159/third_party/closure_compiler/compiler.py | 67 chromium-132.0.6834.159/third_party/closure_compiler/compiler/README.md | 563 chromium-132.0.6834.159/third_party/closure_compiler/externs/OWNERS | 9 chromium-132.0.6834.159/third_party/closure_compiler/externs/accessibility_features.js | 133 chromium-132.0.6834.159/third_party/closure_compiler/externs/accessibility_private.js | 963 chromium-132.0.6834.159/third_party/closure_compiler/externs/arc_apps_private.js | 47 chromium-132.0.6834.159/third_party/closure_compiler/externs/audio.js | 186 chromium-132.0.6834.159/third_party/closure_compiler/externs/bluetooth.js | 193 chromium-132.0.6834.159/third_party/closure_compiler/externs/bluetooth_private.js | 209 chromium-132.0.6834.159/third_party/closure_compiler/externs/braille_display_private.js | 102 chromium-132.0.6834.159/third_party/closure_compiler/externs/chai-3.5.js | 556 chromium-132.0.6834.159/third_party/closure_compiler/externs/chrome.js | 643 chromium-132.0.6834.159/third_party/closure_compiler/externs/chrome_extensions.js |11243 ---------- chromium-132.0.6834.159/third_party/closure_compiler/externs/chrome_send.js | 21 chromium-132.0.6834.159/third_party/closure_compiler/externs/chromeos_info_private.js | 157 chromium-132.0.6834.159/third_party/closure_compiler/externs/clipboard.js | 68 chromium-132.0.6834.159/third_party/closure_compiler/externs/command_line_private.js | 27 chromium-132.0.6834.159/third_party/closure_compiler/externs/crash_report_private.js | 40 chromium-132.0.6834.159/third_party/closure_compiler/externs/events.js | 69 chromium-132.0.6834.159/third_party/closure_compiler/externs/extension_types.js | 118 chromium-132.0.6834.159/third_party/closure_compiler/externs/file_system_provider.js | 670 chromium-132.0.6834.159/third_party/closure_compiler/externs/image_loader_private.js | 55 chromium-132.0.6834.159/third_party/closure_compiler/externs/input_method_private.js | 460 chromium-132.0.6834.159/third_party/closure_compiler/externs/language_settings_private.js | 215 chromium-132.0.6834.159/third_party/closure_compiler/externs/login_state.js | 62 chromium-132.0.6834.159/third_party/closure_compiler/externs/mediasession.js | 88 chromium-132.0.6834.159/third_party/closure_compiler/externs/metrics_private.js | 192 chromium-132.0.6834.159/third_party/closure_compiler/externs/metrics_private_individual_apis.js | 45 chromium-132.0.6834.159/third_party/closure_compiler/externs/mocha-2.5.js | 126 chromium-132.0.6834.159/third_party/closure_compiler/externs/mojo.js | 204 chromium-132.0.6834.159/third_party/closure_compiler/externs/mojo_core.js | 88 chromium-132.0.6834.159/third_party/closure_compiler/externs/mojo_private.js | 25 chromium-132.0.6834.159/third_party/closure_compiler/externs/networking_private.js | 1275 - chromium-132.0.6834.159/third_party/closure_compiler/externs/pending.js | 76 chromium-132.0.6834.159/third_party/closure_compiler/externs/pending_polymer.js | 73 chromium-132.0.6834.159/third_party/closure_compiler/externs/picture_in_picture.js | 73 chromium-132.0.6834.159/third_party/closure_compiler/externs/polymer-1.0.js | 1771 - chromium-132.0.6834.159/third_party/closure_compiler/externs/quick_unlock_private.js | 156 chromium-132.0.6834.159/third_party/closure_compiler/externs/runtime.js | 547 chromium-132.0.6834.159/third_party/closure_compiler/externs/settings_private.js | 114 chromium-132.0.6834.159/third_party/closure_compiler/externs/speech_recognition_private.js | 106 chromium-132.0.6834.159/third_party/closure_compiler/externs/tabs.js | 599 chromium-132.0.6834.159/third_party/closure_compiler/externs/terminal_private.js | 152 chromium-132.0.6834.159/third_party/closure_compiler/externs/test.js | 279 chromium-132.0.6834.159/third_party/closure_compiler/externs/tts.js | 238 chromium-132.0.6834.159/third_party/closure_compiler/externs/ttsEngine.js | 222 chromium-132.0.6834.159/third_party/closure_compiler/externs/virtual_keyboard_private.js | 279 chromium-132.0.6834.159/third_party/closure_compiler/externs/webview_tag.js | 527 chromium-132.0.6834.159/third_party/closure_compiler/externs/windows.js | 211 chromium-132.0.6834.159/third_party/closure_compiler/interfaces/OWNERS | 2 chromium-132.0.6834.159/third_party/closure_compiler/interfaces/README.md | 5 chromium-132.0.6834.159/third_party/closure_compiler/interfaces/bluetooth_interface.js | 94 chromium-132.0.6834.159/third_party/closure_compiler/interfaces/bluetooth_private_interface.js | 101 chromium-132.0.6834.159/third_party/closure_compiler/interfaces/input_method_private_interface.js | 276 chromium-132.0.6834.159/third_party/closure_compiler/interfaces/language_settings_private.js | 157 chromium-132.0.6834.159/third_party/closure_compiler/interfaces/language_settings_private_interface.js | 157 chromium-132.0.6834.159/third_party/closure_compiler/interfaces/mojo_private_interface.js | 20 chromium-132.0.6834.159/third_party/closure_compiler/interfaces/networking_private_interface.js | 282 chromium-132.0.6834.159/third_party/closure_compiler/interfaces/quick_unlock_private_interface.js | 111 chromium-132.0.6834.159/third_party/closure_compiler/interfaces/settings_private_interface.js | 64 chromium-132.0.6834.159/third_party/closure_compiler/interfaces/system_display_interface.js | 181 chromium-132.0.6834.159/third_party/closure_compiler/js_binary.py | 162 chromium-132.0.6834.159/third_party/closure_compiler/js_library.py | 37 chromium-132.0.6834.159/third_party/closure_compiler/roll_closure_compiler | 140 chromium-132.0.6834.159/ui/accessibility/ax_tree.cc | 3 chromium-132.0.6834.159/ui/accessibility/extensions/strings/accessibility_extensions_strings_iw.xtb | 2 chromium-132.0.6834.159/ui/strings/translations/ax_strings_fa.xtb | 2 chromium-132.0.6834.159/ui/strings/translations/ax_strings_iw.xtb | 14 chromium-132.0.6834.159/ui/strings/translations/ui_strings_iw.xtb | 4 chromium-132.0.6834.159/v8/include/v8-version.h | 4 chromium-132.0.6834.159/v8/src/compiler/turboshaft/maglev-graph-building-phase.cc | 9 chromium-132.0.6834.159/v8/src/maglev/maglev-ir.cc | 15 chromium-132.0.6834.159/v8/src/maglev/maglev-ir.h | 21 chromium-132.0.6834.159/v8/src/maglev/maglev-phi-representation-selector.cc | 22 chromium-132.0.6834.159/v8/tools/builtins-pgo/profiles/meta.json | 2 chromium-132.0.6834.159/v8/tools/builtins-pgo/profiles/x64-rl.profile | 2734 +- chromium-132.0.6834.159/v8/tools/builtins-pgo/profiles/x64.profile | 2195 - chromium-132.0.6834.159/v8/tools/builtins-pgo/profiles/x86-rl.profile | 2262 +- chromium-132.0.6834.159/v8/tools/builtins-pgo/profiles/x86.profile | 2301 +- 1661 files changed, 5655 insertions(+), 194389 deletions(-) diff -Nru chromium-132.0.6834.110/DEPS chromium-132.0.6834.159/DEPS --- chromium-132.0.6834.110/DEPS 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/DEPS 2025-01-27 17:37:37.000000000 +0000 @@ -280,7 +280,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': '625e932f21c984db3f9fba8b56b9afa4e977994c', + 'v8_revision': '210ec27ca748c70580fe374f9811761667312b41', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. @@ -1277,7 +1277,7 @@ 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - 'f6f3fbddcec34da69f7d669ef10575caf958913c', + '2a522f492943cd51b74f442241518fb7623b4f2b', 'condition': 'checkout_android and checkout_src_internal', }, diff -Nru chromium-132.0.6834.110/ash/strings/ash_strings_de.xtb chromium-132.0.6834.159/ash/strings/ash_strings_de.xtb --- chromium-132.0.6834.110/ash/strings/ash_strings_de.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/ash/strings/ash_strings_de.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -2007,7 +2007,7 @@ Generative KI ist experimentell, befindet sich noch in einem frühen Entwicklungsstadium und ist derzeit nur eingeschränkt verfügbar. Neue Benachrichtigung ausgeblendet Drücke die Such-Taste oder Umschalttaste, um die Aktivierung aufzuheben. -Nein danke +Nein, danke Suche und Assistant und Mit „Mag ich“ gibst du an, dass dir dieser Vorschlag gefällt diff -Nru chromium-132.0.6834.110/ash/strings/ash_strings_es-419.xtb chromium-132.0.6834.159/ash/strings/ash_strings_es-419.xtb --- chromium-132.0.6834.110/ash/strings/ash_strings_es-419.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/ash/strings/ash_strings_es-419.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -1141,7 +1141,7 @@ Envía comentarios opcionales para mejorar las sugerencias: Tu administrador inhabilitó el Asistente de Google. Asegúrate de que el teléfono esté cerca y tenga la conexión Bluetooth activada. -Control facial +Control con gestos faciales La batería está completa. Tarea sugerida en la que concentrarse Vertical diff -Nru chromium-132.0.6834.110/ash/strings/ash_strings_es.xtb chromium-132.0.6834.159/ash/strings/ash_strings_es.xtb --- chromium-132.0.6834.110/ash/strings/ash_strings_es.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/ash/strings/ash_strings_es.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -484,7 +484,7 @@ Compartir Internet activado (la conexión Wi-Fi está desactivada) Conectarse a otras redes Wi‑Fi Activar o desactivar micrófono. -Flecha hacia arriba +Arriba Bloquea las ventanas Luz nocturna Se requieren datos móviles para activar el punto de acceso @@ -1141,7 +1141,7 @@ Proporciona comentarios opcionales para mejorar las sugerencias: Tu administrador ha inhabilitado el Asistente de Google. Asegúrate de que tengas el teléfono cerca y de que el Bluetooth esté activado -Control facial +Control con gestos faciales La batería está llena. Tarea sugerida en la que centrarse Vertical @@ -1560,7 +1560,7 @@ Desplegar Google Classroom Enlace con más información abierto en el navegador Ahora puedes grabarte a ti mismo y tu pantalla al mismo tiempo -Flecha hacia abajo +Abajo Reducir el brillo Envía el contenido de la pantalla de tu Chromebook Es posible que el rendimiento de los periféricos esté limitado diff -Nru chromium-132.0.6834.110/ash/strings/ash_strings_iw.xtb chromium-132.0.6834.159/ash/strings/ash_strings_iw.xtb --- chromium-132.0.6834.110/ash/strings/ash_strings_iw.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/ash/strings/ash_strings_iw.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -88,7 +88,7 @@ מה מזג האוויר? ‏לחצת על מקש הקיצור של 'מגדיל למסך מלא'. אפשר להשתמש ב- כדי להגדיל את התצוגה וב- כדי להקטין את התצוגה. כדי לזוז במסך כשמגדילים את התצוגה, משתמשים ב-Ctrl‏ + Alt + מקשי החיצים. אין תמיכה בציוד היקפי במצב אורח -המקלדת שמופיעה במסך מושבתת +המקלדת הווירטואלית מושבתת הפסקה מספק חשמל ל- נבחר @@ -134,7 +134,7 @@ צלילים למצב ריכוז עיצוב כהה . אפשר לעבור בין תאריכים באמצעות מקשי החיצים. -הלחצן האמצעי +הכפתור האמצעי , אפליקציה מותקנת סגירת החלון הנוכחי צפייה ברשימת הרשתות. . @@ -178,7 +178,7 @@ יש ללחוץ לקבלת אפשרויות נוספות כחול הצגת השם של שולחן העבודה הווירטואלי -לחצן מקשי העכבר +כפתור מקשי העכבר הפעולה הזו תאפשר גישה למצלמה ולמיקרופון לכל האפליקציות והאתרים שיש להם הרשאות לכך. יכול להיות שיהיה צורך לרענן את דף האינטרנט או להפעיל מחדש את האפליקציה. הפעלה או השבתה של המצב 'נא לא להפריע'. הקטנת התצוגה כשמפעילים את הזכוכית המגדלת @@ -229,7 +229,7 @@ {HOURS,plural, =0{תוך שעה}=1{לפני שעה}one{לפני # שעות}two{לפני שעתיים}other{לפני # שעות}} מנהל המערכת שלך מגדיר את שיטות הקלט. מועד ההגשה בתאריך -המקלדת שמופיעה במסך מופעלת +המקלדת הווירטואלית מופעלת החלון מוקצה לכל שולחנות העבודה הווירטואליים מותר להשתמש ב- שולחנות עבודה וירטואליים לכל היותר. צריך להסיר שולחן עבודה וירטואלי כדי לפתוח אחד חדש. עזרה בקריאה @@ -318,7 +318,7 @@ פתיחה של בוחר אמוג'י משחקים לא מחובר לרשת -לחצן אחר +כפתור אחר ‏כבל ה-USB-C שחיברת לא תומך ב-Thunderbolt. יכול להיות שביצועי המכשיר יוגבלו. ‏מקשי הקיצור Alt + ‏Backspace הוחלפו. כדי לדמות את הפעולה של המקש Delete, יש להקיש על המקש + המקש Backspace. שולחן עבודה חדש @@ -562,7 +562,7 @@ אמוטיקון מסוג הצגת כל האפליקציות הסתרת כל ההצעות למדיה -לחצן המיקרופן של המכשיר כבוי. +כפתור המיקרופן של המכשיר כבוי. ‏רוצה להשתמש במקש End? שימוש במקש אודיו במונו עריכת גודל המסך @@ -736,7 +736,7 @@ {MINUTES,plural, =1{דקה}one{דקות}two{דקות}other{דקות}} הצגת התמונות, המדיה, ההתראות והאפליקציות שבטלפון מהזמן האחרון ExpressKey 1 -הלחצן הצדדי +הכפתור הצדדי ‏כדי להיכנס להיסטוריית הלוח, יש ללחוץ על + V לצפייה בלוח. כדי להתחיל, צריך להעתיק פריט. כדי להציג את האפליקציות הפתוחות, מחליקים כלפי מעלה ולוחצים לחיצה ארוכה סוללה מלאה @@ -755,7 +755,7 @@ הגדרות אודיו אמוג'י מסוג בהירות -הלחצן הקדמי +הכפתור הקדמי כבויה המקורות הבאים יכולים להציג התראות ‏צריך לפתוח את הגדרות Bluetooth כדי להתאים את המכשיר @@ -924,7 +924,7 @@ ‏פתיחה של 'עזרה' באפליקציה 'מה חדש ב-Chromebook' באמצעות . הגרסה הנוכחית () אני רוצה להמשיך מהמקום שבו הפסקתי -לחצן קליקים אוטומטיים +כפתור קליקים אוטומטיים כבוי התכונה לא זמינה. הצגת חודש קודם @@ -1348,7 +1348,7 @@ טעינה מחדש החלפת מצב השיתוף בקרבת מקום במידת חשיפה גבוהה יצירתיות -לחצן +כפתור פתיחת כרטיסייה חדשה בחלון פרטי חדש ‏Bluetooth מופעל האפליקציות שחייבים להכיר @@ -1482,7 +1482,7 @@ ‏כדי להתקין את העדכון, יש להפעיל מחדש את ה-Chromebook כשהמקלדת מחוברת. ‏פלייליסטים מותאמים אישית עוזרים לך לשמור על מיקוד. נהנים מ-YouTube Music ומ-YouTube ללא פרסומות עם 3 חודשים של YouTube Premium ללא עלות. בכפוף לתנאים. השבתה של פקדי המשחקים -מקשים, לחצנים ועוד +מקשים, כפתורים ועוד דף מתוך הדגשת הפריט הבא במדף סימון כמשימה שהושלמה @@ -1491,7 +1491,7 @@ גלילה שמאלה הגדרת ההצגה של ההתראות והאפליקציות שבטלפון ניקוי הטקסט בתיבת החיפוש -הצגת חלונות מכל שולחנות העבודה הווירטואליים, לחצן הבחירה נבחר +הצגת חלונות מכל שולחנות העבודה הווירטואליים, כפתור הבחירה נבחר אי אפשר להוריד את הקבצים של שליטה באמצעות תנועות הפנים ,‏ , עוצמת האות: , הרשת מנוהלת על ידי מנהל המערכת שלך ‏אין אירועים בתאריך . צריך להקיש על Enter כדי לפתוח את יומן Google בדפדפן. @@ -1546,8 +1546,8 @@ פתיחת האפליקציה 'אבחון' האפליקציות המותקנות כאן אפשר להצמיד את הקבצים החשובים. יש לפתוח את אפליקציית 'קבצים' כדי להתחיל. -לחצן 'הקודם' -לחצן 'הבא' +כפתור 'הקודם' +כפתור 'הבא' פתיחת שולחן העבודה Page up לטעינה מלאה @@ -1567,7 +1567,7 @@ המצלמה והמיקרופון בשימוש כרגע על ידי ‎1X‎ הסיסמה חייבת להכיל תווים תקפים בלבד -הלחצן העליון +הכפתור העליון לשאול בכל פעם פתיחת ההתראות לא ניתן לסמן כ'הושלמה'. אפשר לנסות שוב כשיהיה חיבור לאינטרנט. @@ -1640,7 +1640,7 @@ ‏צריך לוודא ש-Chromebook מחובר לאותה רשת Wi-Fi שאליה מחובר מכשיר Chromecast. הקשר למצלמה אבד, מתבצע ניסיון להתחברות מחדש יש לבחור חלון לצילום -במהלך העדכון, ייתכן שהתצוגה במסך תופסק לפרק זמן ארוך מהרגיל (עד דקה). אין ללחוץ על לחצן ההפעלה עד להשלמת העדכון. +במהלך העדכון, ייתכן שהתצוגה במסך תופסק לפרק זמן ארוך מהרגיל (עד דקה). אין ללחוץ על כפתור ההפעלה עד להשלמת העדכון. נא לא להפריע אמוג'י עוצמת האות: , סוללת הטלפון: @@ -1701,7 +1701,7 @@ ‏חיפוש ב-Google Drive למקלדת הניתנת לניתוק דרוש עדכון קריטי הוספת שולחן עבודה וירטואלי חדש -‏לחצן תפריט IME +‏כפתור תפריט IME ‏כשמשתמשים ב-AI גנרטיבי, האיכות של התוצאות לא תמיד אחידה. מקלדת לקוד האימות הקודם @@ -1912,7 +1912,7 @@ אימות זהות ‏מקשי הקיצור של לחיצה ימנית היו Alt + לחיצה ועכשיו הם מקש + לחיצה , לא נבחר -אפשר להתאים אישית את פעולות הלחצנים במכשיר +אפשר להתאים אישית את פעולות הכפתורים במכשיר נבחר מצב של צילום מסך יומן, השבוע של , התאריך שנבחר הוא . הורדה @@ -1921,7 +1921,7 @@ הפריים האוטומטי פועל במצלמה. לאחר הכיבוי, האדמין ינותק מהחשבון ולא יוכל לשלוט במכשיר שלך. -כדי לכבות את המכשיר, יש ללחוץ שוב לחיצה ארוכה על לחצן ההפעלה במכשיר. +כדי לכבות את המכשיר, יש ללחוץ שוב לחיצה ארוכה על כפתור ההפעלה במכשיר. הפעלת התכונה 'נא לא להפריע' בזמן מצב ריכוז Google Tasks יצירה @@ -1992,7 +1992,7 @@ פתיחת האתר שרשום בסרגל הכתובות בכרטיסייה חדשה ‏השבתת Caps Lock אין התראות -הדגשת הלחצן של מרכז האפליקציות במדף +הדגשת הכפתור של מרכז האפליקציות במדף הגעת למספר המקסימלי של שולחנות עבודה. ExpressKey 4 הצגת הכול @@ -2015,7 +2015,7 @@ אם סימנת 'אהבתי', יישלח אלינו משוב שאהבת את ההצעה הזו מאירוע קרוב ביומן אות חזק -אפשר להתאים אישית את פעולות הלחצנים, מהירות הסמן ועוד במכשיר +אפשר להתאים אישית את פעולות הכפתורים, מהירות הסמן ועוד במכשיר עבר הזמן אזהרה: תכונה ניסיונית מקלדת @@ -2112,7 +2112,7 @@ הפסקת העברת המסך אל ביטול ההצמדה של האפליקציה למדף מופעל, כל האפליקציות -לחצן ההקראה +כפתור ההקראה ‏לא מוגדר בטלפון שלך מסך נעילה. צריך להזין סיסמה כדי לפתוח את ה-Chromebook. הפעלה מחדש פתיחה של אפליקציית המחשבון @@ -2218,7 +2218,7 @@ יצירת שולחן עבודה וירטואלי חדש ‏החיבור של ה-Chromebook ל-Bluetooth כבוי. צריך להזין סיסמה כדי לפתוח את ה-Chromebook. סיבוב אוטומטי -הצגת חלונות משולחן העבודה הווירטואלי הנוכחי, לחצן הבחירה נבחר +הצגת חלונות משולחן העבודה הווירטואלי הנוכחי, כפתור הבחירה נבחר כדאי להשתמש בכלי 'עזרה בקריאה' כדי לסכם תוכן או לשאול שאלות במהירות ייתכן שה- לא ייטען כשהוא פועל. {NUM_APPS,plural, =1{הקלט מהמיקרופון נשלט על ידי }one{הקלט מהמיקרופון נשלט על ידי # אפליקציות}two{הקלט מהמיקרופון נשלט על ידי # אפליקציות}other{הקלט מהמיקרופון נשלט על ידי # אפליקציות}} @@ -2264,7 +2264,7 @@ חובר מטען בעל מתח נמוך הצגת ההגדרות של מצב הריכוז. מצב הריכוז מופעל. הזמן שנותר: . מעקב הביצועים פעיל -‏יש להתחיל בהקלטה. לאחר התחלת ההקלטה, יש להקיש על Alt ‏+ Shift ‏+ L כדי לעבור למדף ולמצוא את הלחצן להפסקת ההקלטה +‏יש להתחיל בהקלטה. לאחר התחלת ההקלטה, יש ללחוץ על Alt ‏+ Shift ‏+ L כדי לעבור למדף ולמצוא את הכפתור להפסקת ההקלטה התמקדות בחלון תמונה בתוך תמונה הפעלה/השבתה של הכתבה (הקלדה קולית) אפשרויות במרכז בקרת המשחקים @@ -2308,7 +2308,7 @@ יש להחליק מצד ימין כדי לחזור אחורה הצגה או הסתרה של סרגל הסימניות מחובר עכשיו -לחצן 'הקודם' +כפתור 'הקודם' הפעלה או השבתה של נעילת הסיבוב. קבלת עזרה הצגת הטמפרטורה במעלות פרנהייט @@ -2391,7 +2391,7 @@ ביטול הפעולה האחרונה ‏‫Bluetooth לא זמין {MINUTES,plural, =1{בעוד דקה}one{בעוד # דקות}two{בעוד # דקות}other{בעוד # דקות}} -הלחצן האחורי +הכפתור האחורי לא ניתן להקליט תוכן מוגן מחיקת האות הבאה יציאה @@ -2442,7 +2442,7 @@ הפקדים של המצלמה והאודיו ‏כדי להפעיל את לוח המגע, יש ללחוץ על מקש Shift‏ 5 פעמים החלון נסגר. -‏שלב מתוך בסיור. בעזרת האפליקציות אפשר לבצע כל מה שצריך ב-. האפליקציות נמצאות במרכז האפליקציות. כדי להתמקד בלחצן של מרכז האפליקציות, מקישים על Alt + Shift + L. +‏שלב מתוך בסיור. בעזרת האפליקציות אפשר לבצע כל מה שצריך ב-. האפליקציות נמצאות במרכז האפליקציות. כדי להתמקד בכפתור של מרכז האפליקציות, לוחצים על Alt + Shift + L. ,‏ קבלה של התכונות ושיפורי האבטחה האחרונים. העדכונים מתבצעים ברקע. \ No newline at end of file diff -Nru chromium-132.0.6834.110/ash/strings/ash_strings_nl.xtb chromium-132.0.6834.159/ash/strings/ash_strings_nl.xtb --- chromium-132.0.6834.110/ash/strings/ash_strings_nl.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/ash/strings/ash_strings_nl.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -178,7 +178,7 @@ Klik voor meer opties Blauw Bureaunaam tonen -Knop voor muisknoppen +Knop voor muistoetsen Hiermee geef je toegang aan alle apps en websites met camera- en microfoonrechten. Je moet misschien de webpagina vernieuwen of de app opnieuw starten. Niet storen aan-/uitzetten. Uitzoomen als vergrootglas aanstaat @@ -867,7 +867,7 @@ Titel Handschrift Niet storen staat aan. -Muisknoppen onderbreken/hervatten als dit actief is +Muistoetsen onderbreken/hervatten als dit actief is Laserpen Stift niet beschikbaar. Open Screencast opnieuw. Omlaag scrollen @@ -1667,7 +1667,7 @@ , Camera uitgelijnd op de linkerbenedenhoek. Conflict met systeemoppervlak. Focus staat aan -Muisknoppen +Muistoetsen , signaalsterkte , beheerd door je beheerder Schermopnamemodus geselecteerd subtaak diff -Nru chromium-132.0.6834.110/ash/strings/ash_strings_pt-BR.xtb chromium-132.0.6834.159/ash/strings/ash_strings_pt-BR.xtb --- chromium-132.0.6834.110/ash/strings/ash_strings_pt-BR.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/ash/strings/ash_strings_pt-BR.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -1559,7 +1559,7 @@ Abrir o Google Sala de Aula Link "Saiba mais" aberto no navegador Agora é possível gravar você e a tela ao mesmo tempo -Seta para baixo +Para baixo Diminuir o brilho Transmitir a tela do Chromebook O desempenho dos periféricos pode ser limitado diff -Nru chromium-132.0.6834.110/ash/strings/ash_strings_ru.xtb chromium-132.0.6834.159/ash/strings/ash_strings_ru.xtb --- chromium-132.0.6834.110/ash/strings/ash_strings_ru.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/ash/strings/ash_strings_ru.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -1667,7 +1667,7 @@ , Окно предварительного просмотра камеры привязано к левому нижнему углу, так как перекрывало элементы системного интерфейса Режим концентрации внимания включен -Клавиши управления мышью +Клавиши управления указателем Статус защиты – "", уровень сигнала – , под управлением администратора Выбран режим записи видео с экрана подзадача @@ -2183,7 +2183,7 @@ и телефон будут подключены друг к другу автоматически Доброй ночи! Защита от чужих взглядов -С возвращением! +Двигаемся дальше? Подписка Music Premium Удалить единственный рабочий стол нельзя. Ваш родитель заблокировал это устройство. diff -Nru chromium-132.0.6834.110/ash/strings/ash_strings_sr-Latn.xtb chromium-132.0.6834.159/ash/strings/ash_strings_sr-Latn.xtb --- chromium-132.0.6834.110/ash/strings/ash_strings_sr-Latn.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/ash/strings/ash_strings_sr-Latn.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -219,7 +219,7 @@ Titl uživo je uključen. Uključite WiFi sinhronizaciju Hotspot je isključen -Pređite na prethodnog korisnika +Pređi na prethodnog korisnika Prelazite sa tamne na svetlu temu i obratno. Dodirnite i zadržite radnu površinu, pa izaberite Pozadina i stil. Stavka „“ je vidljiva za Bluetooth uređaje. Odbacite podešavanje pregleda obaveštenja na telefonu @@ -278,7 +278,7 @@ manje od 1 min Da biste preuzeli ažuriranje, restartujte Chromebook sa priključenom tastaturom na dodirnom ekranu. Nazad na pitanje -Pređite na sledećeg korisnika +Pređi na sledećeg korisnika Pomoćnik Snimanje ekrana je dovršeno Podesite jezik @@ -1007,7 +1007,7 @@ Privremenu memoriju ćete videti kad pritisnete i zadržite Ctrl + V. Ovu prečicu možete da isključite ako onemogućite oznaku #clipboard-history-longpress u odeljku chrome://flags (os://flags ako koristite Lacros). Prilagodi predloge Dobro veče, -Zaustavite snimanje ekrana +Zaustavi snimanje ekrana Pridružite se WiFi mreži Preuzimaju se datoteke za prepoznavanje govora... % {0,plural, =0{Ažurirajte uređaj}=1{Ažurirajte uređaj u roku od 1 sekunde}one{Ažurirajte uređaj u roku od # sekunde}few{Ažurirajte uređaj u roku od # sekunde}other{Ažurirajte uređaj u roku od # sekundi}} @@ -2288,7 +2288,7 @@ Pregledajte podešavanja VPN-a Možete da počnete sa prilagođavanjem rasporeda aplikacija kada izađete iz ovog prikaza. Nije moguće podesiti višestruko prijavljivanje -Prebacite uređaj u režim spavanja +Prebaci uređaj u režim spavanja 90 °F u C , instalirana aplikacija, blokirana Povežite sa uređajem diff -Nru chromium-132.0.6834.110/ash/strings/ash_strings_sr.xtb chromium-132.0.6834.159/ash/strings/ash_strings_sr.xtb --- chromium-132.0.6834.110/ash/strings/ash_strings_sr.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/ash/strings/ash_strings_sr.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -219,7 +219,7 @@ Титл уживо је укључен. Укључите WiFi синхронизацију Хотспот је искључен -Пређите на претходног корисника +Пређи на претходног корисника Прелазите са тамне на светлу тему и обратно. Додирните и задржите радну површину, па изаберите Позадина и стил. Ставка „“ је видљива за Bluetooth уређаје. Одбаците подешавање прегледа обавештења на телефону @@ -278,7 +278,7 @@ мање од 1 мин Да бисте преузели ажурирање, рестартујте Chromebook са прикљученом тастатуром на додирном екрану. Назад на питање -Пређите на следећег корисника +Пређи на следећег корисника Помоћник Снимање екрана је довршено Подесите језик @@ -1007,7 +1007,7 @@ Привремену меморију ћете видети кад притиснете и задржите Ctrl + V. Ову пречицу можете да искључите ако онемогућите ознаку #clipboard-history-longpress у одељку chrome://flags (os://flags ако користите Lacros). Прилагоди предлоге Добро вече, -Зауставите снимање екрана +Заустави снимање екрана Придружите се WiFi мрежи Преузимају се датотеке за препознавање говора... % {0,plural, =0{Ажурирајте уређај}=1{Ажурирајте уређај у року од 1 секунде}one{Ажурирајте уређај у року од # секунде}few{Ажурирајте уређај у року од # секунде}other{Ажурирајте уређај у року од # секунди}} @@ -2288,7 +2288,7 @@ Прегледајте подешавања VPN-а Можете да почнете са прилагођавањем распореда апликација када изађете из овог приказа. Није могуће подесити вишеструко пријављивање -Пребаците уређај у режим спавања +Пребаци уређај у режим спавања 90 °F у C , инсталирана апликација, блокирана Повежите са уређајем diff -Nru chromium-132.0.6834.110/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb chromium-132.0.6834.159/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb --- chromium-132.0.6834.110/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/ash/webui/camera_app_ui/resources/strings/camera_strings_iw.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -139,7 +139,7 @@ שגיאות במערכת הקבצים. הטקסט הועתק ‏צילום סרטון בפורמט GIF -הצגת טקסט ולחצן להעתקה +הצגת טקסט וכפתור להעתקה מעבר למצלמה הבאה ההורדה בהשהיה 4 על 4 diff -Nru chromium-132.0.6834.110/build/util/LASTCHANGE chromium-132.0.6834.159/build/util/LASTCHANGE --- chromium-132.0.6834.110/build/util/LASTCHANGE 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/build/util/LASTCHANGE 2025-01-27 17:37:37.000000000 +0000 @@ -1,2 +1,2 @@ -LASTCHANGE=df453a35f099772fdb954e33551388add2ca3cde-refs/branch-heads/6834_101@{#3} +LASTCHANGE=2d77d3fc4452661469b78f115e0aed4d71269739-refs/branch-heads/6834@{#4408} LASTCHANGE_YEAR=2025 diff -Nru chromium-132.0.6834.110/build/util/LASTCHANGE.committime chromium-132.0.6834.159/build/util/LASTCHANGE.committime --- chromium-132.0.6834.110/build/util/LASTCHANGE.committime 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/build/util/LASTCHANGE.committime 2025-01-27 17:37:37.000000000 +0000 @@ -1 +1 @@ -1737474076 \ No newline at end of file +1737999457 \ No newline at end of file diff -Nru chromium-132.0.6834.110/chrome/VERSION chromium-132.0.6834.159/chrome/VERSION --- chromium-132.0.6834.110/chrome/VERSION 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/VERSION 2025-01-27 17:37:37.000000000 +0000 @@ -1,4 +1,4 @@ MAJOR=132 MINOR=0 BUILD=6834 -PATCH=110 +PATCH=159 diff -Nru chromium-132.0.6834.110/chrome/app/resources/chromium_strings_iw.xtb chromium-132.0.6834.159/chrome/app/resources/chromium_strings_iw.xtb --- chromium-132.0.6834.110/chrome/app/resources/chromium_strings_iw.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/chromium_strings_iw.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -28,7 +28,7 @@ מכשירי Bluetooth. זיהוי שפה אוטומטי ‏אני רוצה למחוק את הנתונים גם מ-Chromium () -התכונה הוצמדה. מעכשיו אפשר לגשת לחיפוש התמונות דרך הלחצן החדש בסרגל הכלים +התכונה הוצמדה. מעכשיו אפשר לגשת לחיפוש התמונות דרך הכפתור החדש בסרגל הכלים חדש! אפשר לתרגם טקסט ותמונות במסך ‏נכנסת ל-Chromium! ‏קבלת עזרה לגבי Chrome for Testing @@ -564,12 +564,12 @@ ‏ל-Chromium יש אפשרות לבדוק את הסיסמאות שלך רק אם שמרת אותן פרופיל העבודה שלך נפרד לחלוטין מהפרופיל האישי שלך. שגיאה בשירות: . -אפשר להצמיד את התכונה 'חיפוש תמונות' כדי לאפשר גישה נוחה: פשוט לוחצים על הלחצן 'הצמדה' בחלק העליון של החלונית הצדדית +אפשר להצמיד את התכונה 'חיפוש תמונות' כדי לאפשר גישה נוחה: פשוט לוחצים על הכפתור 'הצמדה' בחלק העליון של החלונית הצדדית רשימת שפות לחיפוש ‏Chromium יכול לבדוק את הסיסמאות כשנכנסים באמצעות חשבון Google ‏מספר ארגונים מנהלים את Chromium ‏Copyright The Chromium Authors. כל הזכויות שמורות. -חדש! אפשר לתרגם טקסט ותמונות במסך באמצעות לחיצה על הלחצן 'תרגום המסך' +חדש! אפשר לתרגם טקסט ותמונות במסך באמצעות לחיצה על הכפתור 'תרגום המסך' איך אנחנו משתמשים בנתונים האלה: אתרים יכולים לשמור מידע ב-Chromium לגבי תחומי העניין שלך. לדוגמה, אם ביקרת באתר כדי לקנות נעליים למרתון, האתר עשוי להגדיר 'ריצת מרתון' כתחום עניין שלך. לאחר מכן, בביקור באתר שונה, למשל כדי להירשם למרוץ, יכול להיות שתוצג לך מודעה לנעלי ריצה על סמך תחומי העניין שלך. ‏הפעלת Chromium מתבצעת... ‏ההתקנה נכשלה בשל שגיאה לא מזוהה. יש להוריד שוב את Chromium. diff -Nru chromium-132.0.6834.110/chrome/app/resources/chromium_strings_ru.xtb chromium-132.0.6834.159/chrome/app/resources/chromium_strings_ru.xtb --- chromium-132.0.6834.110/chrome/app/resources/chromium_strings_ru.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/chromium_strings_ru.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -383,7 +383,7 @@ Назначить Chromium браузером по умолчанию Не удалось проверить наличие обновлений в Chromium. Проверьте подключение к Интернету. Выйти из Chromium? -Чтобы поддерживать работу этих вкладок, используется оперативная память. Разрешите Chromium сделать их неактивными, и производительность повысится. +Эти вкладки занимают лишние ресурсы. Чтобы повысить производительность, разрешите Chromium сделать их неактивными. Настроить профиль Chromium Настройте профиль Chromium Расширение запрашивает вход в Chromium diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_ar.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_ar.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_ar.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_ar.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -3582,7 +3582,7 @@ فلنبدأ اللعب ‏تستخدم المواقع الإلكترونية عادةً JavaScript لعرض الميزات التفاعلية، مثل ألعاب الفيديو أو نماذج الويب. ‏أجهزة USB من (المنتج ) -مشاركة رسومات الشعار المبتكرة +‏مشاركة رسومات شعار Google الإرسال إلى أجهزتك يجب إيقاف "" لتغيير إعدادات الميكروفون. للمتابعة، يجب أولاً إيقاف "". ‏حدث خطأ أثناء تثبيت المشاركة. سبَق وأن تمّ تثبيت العديد من مشاركات بروتوكول Server Message Block ‏(SMB). @@ -8128,7 +8128,7 @@ ‏يحتاج "مدير كلمات المرور في Google" إلى الإذن بالوصول إلى تطبيق MacOS Keychain. صغير جدًا &إدارة محركات البحث... -رابط رسومات الشعار المبتكرة +‏رابط رسومات شعار Google يمكن أن تشمل بيانات التطبيق أيّ بيانات حفظها التطبيق (بناءً على إعدادات مطوّر البرامج)، بما في ذلك بيانات مثل جهات الاتصال والرسائل والصور. لن يتم احتساب بيانات النُسخ الاحتياطية ضمن مساحة التخزين المتوفّرة في Drive لحساب طفلك. يمكنك إيقاف هذه الخدمة من خلال الإعدادات. ‏تم إلغاء عملية الاحتفاظ بنسخة احتياطية من Linux diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_as.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_as.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_as.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_as.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -11695,7 +11695,7 @@ ৰ শুধৰণি কৰি কৰাৰ বাবে স্বয়ং শুধৰণি আনডু কৰাৰ ডায়লগ দেখুওৱা হৈছে। এক্সেছ কৰিবলৈ উপৰমুৱা কাঁড়চিহ্নত টিপক, উপেক্ষা কৰিবলৈ এস্কে’প টিপক। আপুনি এগৰাকী অভিভাৱক বুলি সত্যাপন কৰক আৰম্ভণিৰ যতিচিহ্নৰ প্ৰস্থ পূৰ্ণ -এটা বস্তুত দুবাৰ টিপক, দ্বিতীয়বাৰ টিপি ধৰি ৰাখক আৰু তাৰ পিছত বস্তুটো লৰচৰ কৰিবলৈ টানি নিয়ক +এটা বস্তুত দুবাৰ টিপক, দ্বিতীয়বাৰ টিপি ধৰি ৰাখক আৰু তাৰ পাছত বস্তুটো লৰচৰ কৰিবলৈ টানি নিয়ক বাতিল কৰা সম্পূৰ্ণ হ'লে এই ৱিণ্ড'খন বন্ধ হ'ব। কামৰ তালিকাৰ বুটাম অফলাইন diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_bs.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_bs.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_bs.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_bs.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -8740,7 +8740,7 @@ Šaljite podatke o korištenju i dijagnostici. Ovaj uređaj trenutno automatski šalje Googleu podatke o dijagnostici, uređaju i korištenju aplikacija. To će pomoći stabilnosti sistema i aplikacija, kao i drugim poboljšanjima. Neki zbirni podaci će također pomoći Googleovim aplikacijama i partnerima, kao što su Androidovi programeri. Ovu postavku je nametnuo vlasnik. Ako vam je uključena postavka dodatna Aktivnost na webu i u aplikacijama, ti podaci će možda biti sačuvani na vašem Google računu. Pretražite aplikacije Ovdje se prikazuju web aplikacije koje ste instalirali -Premjesti stavke dodirom i prevlačenjem +Pomicanje stavki dodirom i prevlačenjem Štampači ekstenzija Još uvijek nije dodijeljen nijedan prekidač za pristup Unesite sadašnji PIN da ga promijenite. Ako ne znate svoj PIN, moraćete poništiti sigurnosni ključ, a zatim kreirati novi PIN. @@ -8829,7 +8829,7 @@ Uvijek blokiraj da web lokacija kontrolira i reprogramira MIDI uređaje % – do potpune napunjenosti Kupite odmah -Kreirajte teme pomoću AI-ja +Kreiranje tema s AI-jem Greška prilikom preuzimanja Postavke glasa za pretvaranje teksta u govor Upućen je zahtjev za odobrenje diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_ca.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_ca.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_ca.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_ca.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -11679,7 +11679,7 @@ Es mostra el quadre de diàleg Desfés de la correcció automàtica per a la paraula , que s'ha corregit com a . Prem la fletxa amunt per accedir i la tecla d'escapada per ignorar. Verifica que ets el pare o la mare L'amplada inicial de la puntuació és completa -Fes doble toc sobre un element, mantén-lo premut en el segon toc i arrossega'l per moure'l +Per moure un element, fes-hi doble toc, mantén premut en el segon toc i arrossega'l Aquesta finestra es tancarà un cop hagi finalitzat la cancel·lació. Botó del menú d'accions Sense connexió diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_de.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_de.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_de.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_de.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -1136,7 +1136,7 @@ App () Gruppe schließen Lesezeichen werden importiert... -Als anstößig / nicht sicher melden +Als anstößig/bedenklich melden Nearby Share einrichten, um Dateien mit Personen in der Nähe auszutauschen Geräuschunterdrückung und Audioverbesserungen anwenden. Aktuelle PIN @@ -9557,7 +9557,7 @@ Nur Geräte, die im Konto angemeldet sind, können Inhalte mit diesem Gerät teilen. Du musst das Teilen von deinen Geräten nicht genehmigen. Hierfür wird die mobile Datenverbindung deines Geräts () verwendet und dein Mobilfunkanbieter berechnet möglicherweise zusätzliche Gebühren. Kann auch den Akkuverbrauch erhöhen. Weitere Informationen &Gegen den Uhrzeigersinn drehen -Nein danke +Nein, danke Wenn du die Einrichtung mit deinem Android-Gerät fortsetzen möchtest, verbinde dein mit einem Netzwerk Tab geschlossen Leicht diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_en-GB.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_en-GB.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_en-GB.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_en-GB.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -4141,7 +4141,7 @@ Select Time Zone Lift, then touch again Name -Use Strong Password +Use strong password Manage '' tab group Username '' is not available Currently using Google Account password. You can set up a password to make it easier to sign in. diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_es-419.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_es-419.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_es-419.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_es-419.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -5561,7 +5561,7 @@ Cuando todo esté listo, busca tu lista de lectura en Favoritos y Listas Acción de inactividad mientras se usa la batería No se puede habilitar la -Control facial +Control con gestos faciales Activar la predicción de palabra siguiente Esta acción borrará permanentemente los datos de navegación de este dispositivo. Buena (DVD) diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_es.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_es.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_es.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_es.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -1315,7 +1315,7 @@ Para configurar la huella digital, pídele a tu hijo/a que toque el sensor de huellas digitales, que está en la esquina inferior derecha del teclado. Los datos de la huella digital de tu hijo/a se almacenan de forma segura y nunca salen de este . Usar contraseña segura Error al analizar -Haz una pregunta sobre esta página +Preguntar sobre esta página Es posible que las aplicaciones de Google Play necesiten acceso completo al sistema de archivos para leer y escribir archivos en dispositivos de almacenamiento externo. Los usuarios de la unidad externa podrán ver los archivos y las carpetas que se hayan creado en el dispositivo. Más información Pide a tu administrador que actualice esta aplicación Seleccionar &todo @@ -2479,7 +2479,7 @@ Velocidad del panel táctil Desplázate hasta el final de la pantalla y activa la opción Conexión compartida instantánea si aparece. Si no, ya has terminado. Crea copias de seguridad en Google Drive. Recupera datos de forma sencilla o cambia de dispositivo en cualquier momento. Esta copia de seguridad incluye datos de aplicaciones. Las copias de seguridad se suben a Google y se cifran con la contraseña de la cuenta de Google de tu hijo/a. Más información sobre las copias de seguridadMás información -Flecha hacia arriba +Arriba Por encima de la media Autocompletar Datos de uso y diagnóstico @@ -5563,7 +5563,7 @@ Cuando quieras, busca tu lista de lectura en Marcadores y listas Modo de inactividad con batería No se puede habilitar la -Control facial +Control con gestos faciales Habilitar sugerencia de siguiente palabra Se eliminarán de forma permanente los datos de navegación del dispositivo. Buena - DVD @@ -7368,7 +7368,7 @@ {NUM_OF_FILES,plural, =1{No se ha podido copiar el archivo a }other{No se han podido copiar los archivos a }} El proceso de formateo se ha realizado correctamente. Este contenedor ya existe. -Flecha hacia abajo +Abajo Se eliminará el perfil Conexión de datos disponible desde tu Archivo de clave privada (opcional) diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_et.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_et.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_et.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_et.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -3796,7 +3796,7 @@ Leidke oma pliiatsi nupud Lähtestamine Failide võrguhoidlad -Automaatselt kohanduv +Tundlik Inaktiivseid vahelehti kuvatakse uutmoodi Seda laiendust ei saa kasutada. Vanem või eestkostja on Chrome'is saitide, rakenduste ja laienduste load välja lülitanud. Luba saidil ka edaspidi mikrofoni juurde pääseda diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_eu.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_eu.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_eu.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_eu.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -8312,7 +8312,7 @@ Aurreikusteko ahotsa Ez da onartzen atal hau: Kontu hau sinkronizatzeko aukera aktibatuta daukaten Chrome arakatzaile guztietan sinkronizatuko dira datuak. Chrome OS-ren sinkronizazio-aukerak ikusteko, joan Chrome OS-ren ezarpenetara. -Aukeratu ez ordaintzea +Aukeratu ez erabiltzea Ireki guztiak () Aktibatu sinkronizazioa Bilatu "" diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_fa.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_fa.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_fa.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_fa.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -3802,7 +3802,7 @@ مکان‌یابی دکمه‌های قلم مقداردهی اولیه دستگاه ذخیره‌سازی متصل به شبکه -پاسخگویی +واکنش‌گرا برگه‌های غیرفعال ظاهر جدیدی پیدا می‌کنند ‏نمی‌توانید از این افزونه استفاده کنید. ولی یا سرپرستتان «اجازه‌های سایت‌ها، برنامه‌ها، و افزونه‌ها» را در Chrome خاموش کرده است. ادامه اجازه به برای دسترسی به میکروفون @@ -8736,7 +8736,7 @@ ‏داده‌های استفاده و عیب‌یابی را ارسال کنید. این دستگاه درحال‌حاضر به‌صورت‌ خودکار داده‌های عیب‌یابی و داده‌های استفاده از دستگاه و برنامه را برای Google ارسال می‌کند. این داده‌ها به بهبود پایداری سیستم و برنامه و موارد دیگر کمک خواهد کرد. بعضی داده‌های تجمیعی نیز به برنامه‌ها و شرکای Google (مانند «برنامه‌نویس‌های Android») کمک می‌کند. این تنظیم را مالک اعمال می‌کند. اگر تنظیم «فعالیت‌ها در وب و برنامه» تکمیلی روشن باشد، ممکن است این داده‌ها در «حساب Google» شما ذخیره شود. جستجوی برنامه‌ها برنامه‌های وبی که نصب کرده‌اید در اینجا نشان داده می‌شود -ضربه زدن و کشیدن برای انتقال موارد +حرکت دادن موارد با تک‌ضرب و کشیدن چاپگرهای افزونه هنوز کلیدی تخصیص داده نشده است پین کنونی‌تان را برای تغییر پین وارد کنید. اگر پین‌ خود را نمی‌دانید، باید کلید ایمنی را بازنشانی کنید و سپس پین جدیدی ایجاد کنید. @@ -8825,7 +8825,7 @@ ‏همیشه مسدود شود تا نتواند دستگاه‌های MIDI شما را کنترل و مجدداً برنامه‌ریزی کند ٪ - تا شارژ کامل اکنون بخرید -ساختن زمینه با هوش مصنوعی +موضوع‌سازی با هوش مصنوعی خطای بارگیری تنظیمات صدای نوشتار به گفتار مجوز درخواست شد diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_fr.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_fr.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_fr.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_fr.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -5828,7 +5828,7 @@ Recevoir un avertissement avant d'accéder aux sites qui ne prennent pas en charge les connexions sécurisées Échec de la connexion au réseau "" : En savoir plus sur l'utilisation de la localisation -Les sites que vous consultez peuvent déterminer ce que vous aimez, puis vous montrer des annonces alors que vous continuez de naviguer +Les sites que vous consultez peuvent déterminer ce qui vous intéresse, puis vous montrer des annonces lorsque vous continuez de naviguer Outil : Clic automatique à l'arrêt du curseur Dites-nous pourquoi vous téléchargez ce fichier malgré tout @@ -10005,7 +10005,7 @@ ChromeOS est à jour Mettre en veille lorsque l'appareil fonctionne sur batterie Les codes ne correspondent pas - utilise les paramètres de proxy provenant d'une extension + utilise les paramètres du proxy d'une extension Votre administrateur doit d'abord accepter les conditions d'utilisation dans la liste des appareils Chrome via la Console d'administration. Installer et effacer le disque dur ? Connexion réseau nécessaire diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_gl.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_gl.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_gl.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_gl.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -463,7 +463,7 @@ Non preguntarme de novo O sistema non puido almacenar o token de acceso á API de longo prazo para este dispositivo. O ficheiro é creación miña, grupo de botóns de opción, 1 de 3 -Elimínanse os datos que repercuten na personalización dos anuncios +Elimínanse os datos que repercuten na personalización de anuncios Estás emitindo unha pestana. Podes pór en pausa ou deter a emisión cando queiras. Descubre a protección mellorada para dispor do máximo nivel de seguranza de Chrome nas descargas A protección mellorada está activada diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_id.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_id.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_id.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_id.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -4807,7 +4807,7 @@ Untuk menelusuri situs tertentu atau bagian dari Chrome, ketik pintasannya di kolom URL, lalu tekan pintasan keyboard yang diinginkan. Akses kamera diizinkan untuk aplikasi dan situs yang memiliki izin kamera, serta layanan sistem. Untuk menggunakan kamera, Anda mungkin perlu memulai ulang aplikasi atau memuat ulang halaman. &Buka di -Konfigurasikan... +Konfigurasi... Nama pengguna tidak dikenali server Tambahkan detail opsional Menghapus akun ini juga akan menghapus profil Chrome yang login dengan akun ini diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_it.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_it.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_it.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_it.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -2722,7 +2722,7 @@ Rimuovi ambiente di sviluppo Linux questa scheda Imposta l'immagine del profilo -Tieni premuti i tasti della tastiera per vedere accenti e caratteri speciali. Verrà disattivata la funzionalità Ripeti la pressione del tasto per i tasti alfabetici. Disponibile solo per l'inglese (USA). +Tieni premuti i tasti della tastiera per vedere accenti e caratteri speciali. Verrà disattivata la ripetizione automatica del carattere quando tieni premuto un tasto alfabetico. Disponibile solo per l'inglese (USA). Screenshot dei programmi attualmente sullo schermo Crea automaticamente i sottotitoli codificati per le lingue supportate. I dati audio non vengono mai inoltrati dal tuo dispositivo. Controllo delle fonti di alimentazione… @@ -2740,7 +2740,7 @@ Impossibile installare l'app. Si è verificato un problema. Traccia precedente (pagine di errore Chrome) -Dito 2 +Impronta 2 Invia a Google gli URL di alcune pagine che visiti quando la tua sicurezza è a rischio Scegli l'intervallo di tempo Ricerca nei siti @@ -3860,7 +3860,7 @@ Disattivare la sincronizzazione e la personalizzazione? Presentazione di () Non consentire ai siti di monitorare la posizione della fotocamera -Correggi subito +Correggi Ricevi un avviso se una password è stata compromessa a causa di una violazione dei dati Inserisci il nome del rivenditore e il numero del negozio per i quali viene configurato questo dispositivo per le demo.* Se non conosci il numero del negozio, puoi inserire "0000" per continuare l'installazione della modalità demo. @@ -5095,7 +5095,7 @@ Blocca le app installate su: . Per limitare il download di app o contenuti, vai alle Impostazioni di Google Play. Scopri di più La lingua di input iniziale è il cinese Rimuovi dall'account -Dito 3 +Impronta 3 Completa la configurazione sul telefono Elimina all'uscita Nascondi password diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_iw.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_iw.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_iw.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_iw.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -464,7 +464,7 @@ קוד האימות שלך נוצר אין צורך לשאול אותי שוב ‏אופס! המערכת לא הצליחה לאחסן את טוקן הגישה לטווח ארוך אל ממשק ה-API עבור המכשיר הזה. -יצרתי את הקובץ הזה, קבוצת לחצני בחירה, 1 מתוך 3 +יצרתי את הקובץ הזה, קבוצת כפתורי בחירה, 1 מתוך 3 יימחקו הנתונים שמשפיעים על ההתאמה האישית של מודעות ‏Cast של כרטיסייה מופעל. אפשר להשהות או להפסיק אותו בכל שלב. ‏כדאי להכיר את ההגנה המשופרת כדי ליהנות מרמת האבטחה הגבוהה ביותר ב-Chrome להורדות @@ -481,7 +481,7 @@ לא ניתן היה להתחבר אל . אפשר לנסות שוב. הסנכרון הושהה ‏תחנת העגינה תעבוד במצב התואם ל-USB-C. -לחצן החזרה בדף המשנה +כפתור החזרה בדף המשנה הצגה וניהול של סיסמאות שמורות במסגרת ‏כרטיסי Kerberos @@ -787,7 +787,7 @@ ‏סריקת קוד QR נושא שהותקן "" {COUNT,plural, =1{החלון הפרטי לא ייפתח מחדש.}one{# החלונות הפרטיים לא ייפתחו מחדש.}two{# החלונות הפרטיים לא ייפתחו מחדש.}other{# החלונות הפרטיים לא ייפתחו מחדש.}} -התוסף הזה שינה את הדף שמוצג כשלוחצים על הלחצן 'דף הבית'. +התוסף הזה שינה את הדף שמוצג כשלוחצים על הכפתור 'דף הבית'. רוצה להתקין שיכול: ‏מותר להשתמש בקובצי cookie של צד שלישי ‏ברור לי שפרופילי ה-eSIM שהותקנו לא יוסרו על ידי Powerwash @@ -846,7 +846,7 @@ ‏קונסולת JavaScript& -יש לגעת בלחצן ההפעלה עם האצבע +יש לגעת בכפתור ההפעלה עם האצבע רגיל פתיחת קישור באמצעות... לחיצה ימנית על הכרטיס @@ -1281,7 +1281,7 @@ מוכן להשלים את ההתקנה שלך ‏בדיקת הסיסמאות לא זמינה ב-Chromium ‏שימוש במיקום באפליקציות ובשירותים של Android. -לחצן סימניה +כפתור סימניה ‏פתיחה בדפדפן Chrome היסטוריית ההורדות המלאה פחות אפליקציות @@ -1349,7 +1349,7 @@ ‏רענון היכולות של Wi-Fi ישיר &קטן יותר כשגולשים באתרים, תוכן הדפים שלהם מוצפן ונשמר במכשיר -כדי להגדיר טביעת אצבע, על הילד או הילדה לגעת בחיישן טביעות האצבע שבפינה הימנית העליונה של המקלדת, ליד לחצן ההפעלה. נתוני טביעות האצבע של הילד או הילדה נשמרים באופן מאובטח ואף פעם לא נשלחים ממכשיר ה- הזה. +כדי להגדיר טביעת אצבע, על הילד או הילדה לגעת בחיישן טביעות האצבע שבפינה הימנית העליונה של המקלדת, ליד כפתור ההפעלה. נתוני טביעות האצבע של הילד או הילדה נשמרים באופן מאובטח ואף פעם לא נשלחים ממכשיר ה- הזה. יש לך אפשרות ליצור קבוצת כרטיסיות משלך. אין כרטיסיות דומות לארגון, אבל יכול להיות שהקבוצות האלה יתאימו לך אנשי קשר @@ -1672,7 +1672,7 @@ &חידוש הזנת ביטוי סיסמה שגוי אין לאפשר התראות מהאתר -לחצן ההגדרה +כפתור ההגדרה תקינות הסוללה פתיחת קישור בתור ‏יצירת קוד אימות בן 6 ספרות למנהל הסיסמאות של Google, ספרה מתוך 6 @@ -1737,7 +1737,7 @@ מדיניות הועתק אל הלוח אני רוצה לכלול את יומני השרת שלי. -הלחצן 'המשך' מושבת +הכפתור 'המשך' מושבת כדאי להיכנס לחשבון כדי שהסיסמאות ונתונים נוספים יופיעו בכל המכשירים שלך ‏Chrome יקבע מתי אתרים יכולים להפעיל צלילים (מומלץ) Google Lens @@ -1883,7 +1883,7 @@ ‏כתובת IPP להדפסה {NUM_SITES,plural, =1{כדי להגן על הנתונים שלך, הוסרו ההרשאות מאתר שלא ביקרת בו בזמן האחרון}one{כדי להגן על הנתונים שלך, הוסרו הרשאות מאתרים שלא ביקרת בהם בזמן האחרון}two{כדי להגן על הנתונים שלך, הוסרו הרשאות מאתרים שלא ביקרת בהם בזמן האחרון}other{כדי להגן על הנתונים שלך, הוסרו הרשאות מאתרים שלא ביקרת בהם בזמן האחרון}} מסך התחברות -לחצני ניווט בטאבלט +כפתורי ניווט בטאבלט אפשר לנסות להיעזר בחלונית הצדדית לשמירת סימניות, תהליכים ועוד לא נמצא גופן תואם. ‏הפעלת כמשתמש רגיל. אם ברצונך להפעיל כבסיס לצורך פיתוח, יש להפעיל מחדש עם הסימון ‎--no-sandbox. @@ -2012,7 +2012,7 @@ ניהול התוספים שלך על ידי לחיצה על 'תוספים' בתפריט כלים. ‏חיבור התקן Bluetooth המשך -‏כדי לקבל סיכום של הדף, חיפושים קשורים ומידע שימושי נוסף על הדף הזה, צריך ללחוץ על לחצן החלונית הצדדית של חיפוש Google בסרגל הכלים +‏כדי לקבל סיכום של הדף, חיפושים קשורים ומידע שימושי נוסף על הדף הזה, צריך ללחוץ על כפתור החלונית הצדדית של חיפוש Google בסרגל הכלים בחרת להוסיף פרופיל מנוהל לדפדפן הזה. למנהל המערכת שלך יש שליטה על הפרופיל וגישה לנתונים שלו. אופטימיזציה המשוב מיד יישלח… @@ -2033,7 +2033,7 @@ לתרגם את הדף הזה? {NUM_EXTENSIONS,plural, =1{יכול להיות שבקרוב תופסק התמיכה בתוסף הזה}one{יכול להיות שבקרוב תופסק התמיכה בתוספים האלה}two{יכול להיות שבקרוב תופסק התמיכה בתוספים האלה}other{יכול להיות שבקרוב תופסק התמיכה בתוספים האלה}} בחר את ספריית ההרחבה. -כדי לשנות את סדר הלחצנים בסרגל הכלים, גוררים אותם +כדי לשנות את סדר הכפתורים בסרגל הכלים, גוררים אותם הדפסה באמצעות תיבת דו-שיח של המערכת... הפעולה עשויה לגרום לניתוק הרשת הסלולרית למשך מספר דקות תצוגה מקדימה של כרטיסייה משותפת @@ -2339,7 +2339,7 @@ ‏לפני שמתחילים, צריך לוודא שיש גיבוי של הנתונים. התקנת תחליף את כל הנתונים שבכונן הקשיח שלך. מידע נוסף זמין בכתובת g.co/flex/InstallGuide. ‏ניהול האבטחה של V8 ‏התכונה 'שיתוף בקרבת מקום' מחפשת מכשירים בקרבת מקום באמצעות Bluetooth. -התאמה אישית של לחצני סרגל הכלים +התאמה אישית של כפתורי סרגל הכלים ‏יש גרסה חדשה זמינה של Chrome שם המשתמש הועתק ללוח יש להחליק כלפי מעלה כדי להתחיל @@ -2460,7 +2460,7 @@ ‏התוסף הזה הושבת על ידי מדיניות הארגון כי הוא לא זמין יותר בחנות האינטרנט של Chrome. יציאה הפעלה מחדש -‏לוחצים על לחצן Google Lens +‏לוחצים על כפתור Google Lens הי&סטוריה פרופילים של אורחים אינם נתמכים בוצע עדכון על-ידי הורה @@ -2763,7 +2763,7 @@ בלחיצה על התוסף יבצע אתחול ואיפוס בעוד מספר רגעים ‏בדיקת הסוללה, המעבד (CPU), הזיכרון, קישוריות ועוד -יש לחצן עם שם זהה. עליך לבחור שם אחר. +יש כפתור עם שם זהה. עליך לבחור שם אחר. מנהל המשימות התרחשה בעיה במהלך פענוח תגובת השרת. התהליך עשוי להימשך עד 30 דקות @@ -2950,7 +2950,7 @@ הפעלה מחדש עכשיו אין רשומות ביומן כלי החץ -לחצן למעבר אל דף משנה +כפתור למעבר אל דף משנה ‏שירות VPN קיצורי דרך מספר סידורי: @@ -2986,7 +2986,7 @@ אותיות ומספרים הצגת כל האתרים הוספה ידנית של מדפסת -איתור לחצנים בעכבר +איתור כפתורים בעכבר התקנת המדיניות במצב אופליין במכשיר נכשלה. ‏נשמח לעזרתך בשיפור של Steam ב-Chromebook צריך להיכנס לחשבון כדי לראות את הסימניות @@ -3077,7 +3077,7 @@ גודל האפליקציה: הוסיף/ה הכרטיסייה את הזו לא לאפשר לאתרים לערוך קבצים או תיקיות במכשיר -הצמדת הלחצן בוטלה +הצמדת הכפתור בוטלה בהמתנה למטמון... כיווץ הכול ‏ניהול השפה בחשבון Google @@ -3210,7 +3210,7 @@ קדם-עיבוד: התחברות אל הפסקת השימוש במפתחות הגישה במכשיר הזה -לחצן איפוס +כפתור איפוס דמות ברירת מחדל סגולה חתימת קוד החלפת מצב לחלונית הצדדית משמאל @@ -3324,7 +3324,7 @@ ניתן לנהל את ההגדרות דרך התפריט בכרטיס או לראות עוד אפשרויות ב'התאמה אישית של Chrome'. -לחצן 'הסתרה' +כפתור 'הסתרה' {GROUP_COUNT,plural, =1{הכרטיסיות יישארו פתוחות במכשיר הזה, אבל הקבוצה תימחק לתמיד.}one{הכרטיסיות יישארו פתוחות במכשיר הזה, אבל הקבוצות יימחקו לתמיד.}two{הכרטיסיות יישארו פתוחות במכשיר הזה, אבל הקבוצות יימחקו לתמיד.}other{הכרטיסיות יישארו פתוחות במכשיר הזה, אבל הקבוצות יימחקו לתמיד.}} ‏טעינת Google Assistant מתבצעת... מבנים @@ -3377,7 +3377,7 @@ זוהה התקן נשלף ‏הצעות לאמוג'י. כדי לעבור בין ההצעות, מקישים על החיצים למעלה או למטה. כדי להוסיף אמוג'י, מקישים על Enter. הזיכרון שבשימוש -הוספה או זיהוי לחצנים בעט +הוספה או זיהוי כפתורים בעט צריך להפעיל את האפשרות 'הצגת מסך הנעילה ביציאה ממצב שינה' ולנסות שוב ‏גרסאות ישנות של אפליקציות Chrome לא ייפתחו במכשירי Mac אחרי דצמבר 2022. ניתן לבדוק אם יש גרסה חדשה להורדה. לא ניתן היה לבצע התאמה למכשיר . יש לבחור מכשיר כדי לנסות שוב @@ -3439,7 +3439,7 @@ ‏המחשב מחובר בחיבור קווי ומכשיר ה-Cast מחובר ל-Wi-Fi אתרים שמורשים להשתמש במזהים כדי להפעיל תוכן מוגן אימות הזהות שלך -‏לחיצה על הלחצן "קבלה והמשך" מבטאת את הסכמתך לעיבוד שתואר קודם לכן לגבי השירותים האלה של Google. +‏לחיצה על הכפתור "קבלה והמשך" מבטאת את הסכמתך לעיבוד שתואר קודם לכן לגבי השירותים האלה של Google. קופא הצעה לקבוצת כרטיסיות הודעות יושבתו @@ -3549,7 +3549,7 @@ כלי הבחירה ‏אי אפשר להשתמש בו-זמנית ביציאות HDMI ו-USB C לווידאו. עליך לבחור יציאת וידאו אחרת. נפתח בכרטיסייה חדשה -במצב טאבלט אפשר להשתמש בלחצנים כדי לעבור אל דף הבית, לחזור לדף הקודם ולעבור בין אפליקציות. +במצב טאבלט אפשר להשתמש בכפתורים כדי לעבור אל דף הבית, לחזור לדף הקודם ולעבור בין אפליקציות. מגדיל התצוגה יש לכתוב מילים חדשות עם 99 אותיות או פחות המשך כ- @@ -3801,7 +3801,7 @@ העלאת היומן בהמתנה. הענקת גישה ל-"": ‏ניתוק חיבור ה-Wi-Fi -איתור לחצנים בעט +איתור כפתורים בעט מתבצע אתחול התקני רשת לשיתוף קבצים רספונסיבית @@ -3986,7 +3986,7 @@ נוף ‏פעולות נוספות שקשורות לכרטיס , קוד האימות (CVC) נשמר ‏אפשר לחסום אתרים שלא רוצים לתת להם הרשאה. בנוסף, אתרים שנוספו לפני יותר מ-30 יום נמחקים מהרשימה ב-Chrome באופן אוטומטי. -לחצן 'הקודם' במדריך בנושא פרטיות +כפתור 'הקודם' במדריך בנושא פרטיות מידע מפורט על הגרסה {NUM_DEVICES,plural, =1{‏תקשורת עם מכשיר USB אחד}one{‏תקשורת עם # מכשירי USB}two{‏תקשורת עם # מכשירי USB}other{‏תקשורת עם # מכשירי USB}} {COUNT,plural, =1{המערכת שולחת אל }one{המערכת שולחת אל }two{המערכת שולחת אל }other{המערכת שולחת אל }} @@ -4051,7 +4051,7 @@ איכות הווידאו יכול להיות שאתרים שביקרת בהם יפסיקו לפעול כמו שצריך ‏הפעלת האפשרות לאיסוף נתוני ביצועים תסייע ל-Google לשפר את המערכת עם הזמן. הנתונים נשלחים רק לאחר שמגישים דוח משוב (Alt-Shift-I) וכוללים את נתוני הביצועים. ניתן לחזור למסך זה כדי להשבית את איסוף הנתונים בכל עת. -השם החדש ללחצן +השם החדש לכפתור לא ניתן להשתמש ב- (מזהה תוסף "") במסך התחברות. &ביטול עמעום תוכן ברקע @@ -4350,7 +4350,7 @@ ‏צריך לסנכרן את כדי שההעדפות שלך יהיו מוכנות בכל המכשירים בעת הכניסה לחשבון Google. ההעדפות מתייחסות לאפליקציות, להגדרות, לסיסמאות ל-Wi-Fi, לשפות, לטפט, למקשי קיצור ועוד. ‏לצערנו, המחשב שלך מוגדר באמצעות מזהה חומרה פגום. המצב הזה מונע מ-ChromeOS Flex להתקין את עדכוני האבטחה האחרונים, ויכול להיות שהמחשב שלך יהיה חשוף להתקפות זדוניות. עליך לבטל את נעילת הטלפון ולקרב אותו ל- כדי לבטל את הנעילה שלו. -איתור לחצנים בטאבלט +איתור כפתורים בטאבלט חלק מהסיסמאות שלך נחשפו בפרצה באבטחת מידע. כדי לאבטח את החשבונות שלך, עליך לשנות את הסיסמאות האלה עכשיו. מרחק מתצוגה ‏מכשיר עם יציאת USB-C (יציאה ימנית-אחורית) @@ -4724,7 +4724,7 @@ אתרים יכולים לבקש להתקין אפליקציות אינטרנט במכשיר שלך יצירה תנאי שירות -התאמה אישית של לחצני העט +התאמה אישית של כפתורי העט ‏Smart Lock מופעל ‏הקראה וקורא המסך ChromeVox עדכון סיסמה @@ -5038,7 +5038,7 @@ משוב ‏יש לפנות אל Dell כדי לקבל סיוע. אביזר העגינה יכבה אם המאוורר לא פועל. הארגון שלך מגביל את מה שאפשר לשמור -לחצני סרגל הכלים אופסו +כפתורי סרגל הכלים אופסו ‏הסגנון של מקש Shift אתרים יכולים לבקש הרשאה להשתמש במצלמה סנכרון הקבצים מופעל @@ -5080,7 +5080,7 @@ דמות ברירת מחדל כחולה כדי להפעיל את התוסף מחדש, יש לאשר את ההרשאות החדשות: לא ניתן לשמור עקב הרשאות לא מספיקות. יש לשמור במיקום אחר. -הלחצן הימני +הכפתור הימני רוצה להשתמש בתוסף הזה: ‏קלט קולי ב-Google Assistant אין כרטיסיות ממכשירים אחרים @@ -5389,7 +5389,7 @@ שיתוף קבוצת הכרטיסיות '' מתן הרשאה לתוסף לקרוא את האתר הזה ולשנות אותו המכשיר חובר -כדי להוסיף דף לקריאה במועד מאוחר יותר, לוחצים על הלחצן +כדי להוסיף דף לקריאה במועד מאוחר יותר, לוחצים על הכפתור משתמשים אחרים במכשיר הזה יכולים להשתמש ברשת הזו פועל • הפרסום של התוסף הזה בוטל על ידי המפתח שלו ‏חנות Play @@ -5647,7 +5647,7 @@ פוטבול נדרשת סיסמה שירות האימות הזה מתארח בדומיין -כדי להגדיר טביעת אצבע, על הילד או הילדה לגעת בלחצן ההפעלה. נתוני טביעות האצבע של הילד או הילדה מאוחסנים באופן מאובטח ואף פעם לא נשלחים מה- הזה. +כדי להגדיר טביעת אצבע, על הילד או הילדה לגעת בכפתור ההפעלה. נתוני טביעות האצבע של הילד או הילדה מאוחסנים באופן מאובטח ואף פעם לא נשלחים מה- הזה. מרכז האפליקציות + חץ למעלה נתונים מהאתר שאליו נכנסת צור פרופיל @@ -5675,7 +5675,7 @@ הוספת הערה הורדת הקובץ המסוכן ‏השבתת פרופילים של eSIM -התאמה אישית של לחצני העכבר +התאמה אישית של כפתורי העכבר שם המכשיר ב פתיחה בסיום ההורדה עריכת מדפסת @@ -5807,7 +5807,7 @@ {0,plural,offset:2 =1{}=2{,‏ }one{,‏ ועוד אחד}other{,‏ ועוד #}} ייתכן שיהיה צורך לטעון מחדש דף זה על מנת שההגדרות החדשות ייכנסו לתוקף. עדיין נדרשת הרשאה כדי להשלים את ההגדרה -שליטה במכשיר באמצעות מתג אחד או יותר. המתגים יכולים להיות מקשי מקלדת, לחצני גיימפאד או מכשירים ייעודיים. +שליטה במכשיר באמצעות מתג אחד או יותר. המתגים יכולים להיות מקשי מקלדת, כפתורי גיימפאד או מכשירים ייעודיים. תוכן לא מאובטח נחסם כברירת מחדל באתרים מאובטחים יצירת סימנייה לכל הכרטיסיות ‏PIN שגוי @@ -5907,7 +5907,7 @@ &פתיחה חשבון ראשי ‏לדגמה, אפשר להקליד oà, oè, uỳ במקום òa, òe, ùy -התוסף "" שינה את הדף שמוצג בלחיצה על הלחצן 'דף הבית'. +התוסף "" שינה את הדף שמוצג בלחיצה על הכפתור 'דף הבית'. הקובץ הזה מסוכן מעבר למסך מלא מביטים למטה @@ -6086,7 +6086,7 @@ יכול להיות שבודקים אנושיים יראו את הנתונים האלה כדי לשפר את התכונה הזו. עריכה של כתובת האתר מילוני משתמש -לחצן של קבוצת הכרטיסיות שנשמרה +כפתור של קבוצת הכרטיסיות שנשמרה כלב השתקת כרטיסייה ‏לאפשר תמיד JavaScript ב- @@ -6232,7 +6232,7 @@ מי יכול לשתף איתך ‏הסיסמה הזו שמורה רק במכשיר הזה. כדי להשתמש בה במכשירים אחרים, עליך לשמור אותה בחשבון Google. עריכת -מדיניות הארגון השתנתה. לחצן הניסויים התווסף לסרגל הכלים. יש ללחוץ על הלחצן כדי לפתוח תיבת דו-שיח ולהפעיל ניסויים. +מדיניות הארגון השתנתה. כפתור הניסויים התווסף לסרגל הכלים. יש ללחוץ על הכפתור כדי לפתוח תיבת דו-שיח ולהפעיל ניסויים. שירותי מערכת וגם אפליקציות ואתרים עם הרשאת גישה למצלמה יכולים להשתמש במצלמה. כדי להשתמש במצלמה, יכול להיות שצריך להפעיל מחדש את האפליקציה או לרענן את הדף. {NUM_SITES,plural, =1{נמצא אתר אחד עם הרבה התראות}one{נמצאו {NUM_SITES} אתרים עם הרבה התראות}two{נמצאו {NUM_SITES} אתרים עם הרבה התראות}other{נמצאו {NUM_SITES} אתרים עם הרבה התראות}} מתואם @@ -6357,7 +6357,7 @@ ההרשאות הבאות נחסמו: , מתבצע איתור של התקני רשת לשיתוף קבצים ‏סטטוס של שיתוף אינטרנט בין מכשירים (tethering): -שינוי שם הלחצן +שינוי שם הכפתור פינוי מקום בזיכרון על סמך שימוש ‏ניתן לנווט בדפים באמצעות סמן הטקסט. כדי להפסיק, אפשר להקיש על F7. ‏כדי לבצע איפוס באמצעות Powerwash, יש להפעיל תחילה את המכשיר מחדש. מידע נוסף @@ -6749,7 +6749,7 @@ אנחנו מצטערים, אבל חלק מהקבצים נפגמו והעדכון לא הצליח. הקבצים המסונכרנים שלך לא נפגעו. אין רשת זמינה הסיסמה לא שותפה -הצגת לחצני ניווט +הצגת כפתורי ניווט ההתקנה מתבצעת... מאפשר להפעיל אפליקציות של Windows®‎ ב-Chromebook. לפני התקנת התוכנה מומלץ לוודא שיש שטח אחסון פנוי בגודל . {NUM_PAGES,plural, =1{אפשר להמתין עד שתתקבל תגובה מהדף, או לצאת ממנו.}one{אפשר להמתין עד שתתקבל תגובה מהדפים, או לצאת מהם.}two{אפשר להמתין עד שתתקבל תגובה מהדפים, או לצאת מהם.}other{אפשר להמתין עד שתתקבל תגובה מהדפים, או לצאת מהם.}} @@ -6811,7 +6811,7 @@ מנהל החלונות נפח האחסון הכולל שבשימוש של האתרים המוצגים: 0° (ברירת מחדל) -הצגה או הסתרה של המקלדת שמופיעה במסך +הצגה או הסתרה של המקלדת הווירטואלית עוד פעולות לגבי האתר קוד האימות חייב להיות באורך של 6 ספרות החשבון הזה לא מתאים לבקרת הורים @@ -6996,7 +6996,7 @@ יש שדרוג אבטחה זמין איפוס לא ניתן ליצור קיצור דרך -בחירת הלחצנים שיוצגו בסרגל הכלים +בחירת הכפתורים שיוצגו בסרגל הכלים מתג לא מזוהה. יש להקיש על מקש כלשהו כדי . הוספת משתמש... כניסה ל-. @@ -7103,7 +7103,7 @@ ניווט אל תוכן נוסף מתוך כל מי שבקרבת מקום ‏אישור פעולת Powerwash בעת חזרה לגרסה קודמת -לחצן לבחירת שפה ומקלדת. השפה המוגדרת עכשיו היא . +כפתור לבחירת שפה ומקלדת. השפה המוגדרת עכשיו היא . ירוק חיתוך ‏מעולה – HD @@ -7121,7 +7121,7 @@ ניהול המידע שמשמש אתרים למדידת ביצועי מודעות אפשרויות קלט בסרגל הכלים כדי להעניק לתוסף גישה לאתר הזה, יש ללחוץ על התוסף. -‏כפתור ביטול בתיקון האוטומטי. חזרה לגרסה הקודמת של . יש להקיש על Enter כדי להפעיל, או על Escape כדי לבטל. +‏כפתור ביטול בתיקון האוטומטי. חזרה לגרסה הקודמת של . יש ללחוץ על Enter כדי להפעיל, או על Escape כדי לבטל. הפארק הלאומי ציון חסימה אם באתר מוצגות מודעות מפריעות או מטעות מילון מאפייני הרשת פגום @@ -7132,7 +7132,7 @@ עוד ניתוח ההגדרה נכשל יציאה עכשיו -‏לחצן TrackPoint ראשי +‏כפתור TrackPoint ראשי הסנכרון לא פועל. יש לנסות לצאת ולהיכנס שוב. ‏בחירה והתאמה אישית של הקולות בהמרת טקסט לדיבור בתכונות ChromeVox והקראה גווני אפור @@ -7258,7 +7258,7 @@ ‏Phone Hub, שיתוף בקרבת מקום מקש במקלדת נתזים -הלחצן הוצמד +הכפתור הוצמד לדלג על ההרשמה לשימוש בית ספרי? ‏הסרת כל חשבונות המשתמשים ואיפוס Chromebook כך שיהיה כמו חדש. אין הרשאה לנהל את החלונות בכל המסכים @@ -7294,7 +7294,7 @@ יצירת מפתח גישה הצגת סרגל הסימניות מטמון סקריפטים -הצגת לחצני ניווט במצב טאבלט +הצגת כפתורי ניווט במצב טאבלט אתרים יכולים להציג תמונות ‏הקוד לא תקין. הפורמט של הרשומה צריך להיות $SM-DP+ address$מזהה תואם אופציונלי אספקת אישורים לאימות @@ -7378,7 +7378,7 @@ כניסה אוטומטית התיקיות המשותפות זמינות ב- בספרייה . לא מחובר לרשת. צריך להתחבר לאינטרנט ולנסות שוב. -אישור לקחת את הסיכון, קבוצת לחצני בחירה, 3 מתוך 3 +אישור לקחת את הסיכון, קבוצת כפתורי בחירה, 3 מתוך 3 אירעה שגיאה בטעינת תוסף {NUM_OF_FILES,plural, =1{לא ניתן להעתיק את הקובץ אל }one{לא ניתן להעתיק את הקבצים אל }two{לא ניתן להעתיק את הקבצים אל }other{לא ניתן להעתיק את הקבצים אל }} הפרמוט הסתיים בהצלחה! @@ -7713,13 +7713,13 @@ סיסמאות ומפתחות גישה הבהוב על התראות השתקת ההתראות -הצגת לחצן 'דף הבית' +הצגת כפתור 'דף הבית' יש לבחור אפשרות ‏לא ניתן לבטל את השיתוף כי אפליקציה משתמשת בתיקייה הזו. השיתוף של התיקייה הזו יבוטל בכיבוי הבא של Linux. ‏ניתוק חשבון Google Drive ‏עליך לפנות נפח אחסון או לשנות בהגדרות את גודל הנפח המיועד ל-Linux מהירות הדיבור -צריך ללחוץ על לחצן שונה מהלחצן השמאלי או הימני בעכבר במכשיר . +צריך ללחוץ על כפתור שונה מהכפתור השמאלי או הימני בעכבר במכשיר . אין תמיכה בסנכרון התראות בטלפונים שמחוברים לפרופיל עבודה. מידע נוסף ‏מקש ההוספה המהירה נמצא מתחת למקש Tab ‏לחנות האינטרנט של Chrome @@ -7749,7 +7749,7 @@ הקטנת הסף כל הקונטיינרים הכי פופולריים -הלחצן השמאלי +הכפתור השמאלי אין הרשאה להשתמש בגופנים שמותקנים במכשיר התחברות לאינטרנט כדי להוסיף מדפסת ‏חתימת X9.62 ECDSA עם SHA-256 @@ -7867,7 +7867,7 @@ התאמה אישית של הגופן וגודל הטקסט בדפדפן האינטרנט גלישה כאורח ‏כשאומרים "Hey Google", מתבצעת גישה ל-Assistant. -החלפת לחצן העכבר העיקרי +החלפת כפתור העכבר העיקרי ‏שימוש ב-DNS מאובטח פנקוטה בדיקת הבטיחות הסתיימה. @@ -7934,7 +7934,7 @@ + רמת אבטחה גבוהה יותר מעוניין בגישה קבועה לאישור כדי לאמת את עצמו בשמך. -האתר מהימן בעיניי, קבוצת לחצני בחירה, 2 מתוך 3 +האתר מהימן בעיניי, קבוצת כפתורי בחירה, 2 מתוך 3 אף אחד לא יכול לשתף איתך אם המכשיר לא יוגדר כגלוי.כדי שהמכשיר יהיה גלוי באופן זמני, יש לפתוח את אזור הסטטוס ואז להפעיל את הרשאות הגישה בקרבת מקום. לא ניתן ליצור חיבור לרשת. צריך לבדוק את החיבור לרשת ולנסות שוב. הצגת התוספים שיש להם הרשאה לקרוא או לשנות אתר @@ -7974,7 +7974,7 @@ בחירת הקול השועל המהיר קפץ מעל לכלב שנח לו בעצלתיים. שרתי הדפסה -מדיניות הארגון השתנתה. לחצן הניסויים הוסר מסרגל הכלים. +מדיניות הארגון השתנתה. כפתור הניסויים הוסר מסרגל הכלים. ‏יש לבצע Powerwash למכשיר ה- שלך ולחזור לגרסה הקודמת. משהו השתבש בפתיחת הפרופיל שלך. יש לצאת ולאחר מכן להיכנס מחדש. פרוע @@ -8171,7 +8171,7 @@ ‏סגירת כל החלונות של Firefox תשלים את פעולת הייבוא. ‏caps lock מופעל פלאגין: -הלחצנים המוסתרים בסרגל הכלים +הכפתורים המוסתרים בסרגל הכלים האפליקציות המובילות ב- {NUM_EXTENSIONS,plural, =1{ניתן לבחור אם התוסף הזה יוכל לקרוא או לשנות את האתר הזה}one{ניתן לבחור אם התוספים האלה יוכלו לקרוא או לשנות את האתר הזה}two{ניתן לבחור אם התוספים האלה יוכלו לקרוא או לשנות את האתר הזה}other{ניתן לבחור אם התוספים האלה יוכלו לקרוא או לשנות את האתר הזה}} כיול מסך המגע @@ -8800,7 +8800,7 @@ מקישים על || כדי להתמקד בבועה, ומקישים שוב כדי להתמקד ברכיב שאליו היא מפנה. &למידע נוסף ברצונך באמת להפעיל את "" במצב אבחון? -לחצן תיקיית סימניות +כפתור תיקיית סימניות יש לך כרגע כרטיס אחד שאפשר להשתמש בו רק במכשיר הזה החלה האתר משתמש במצלמה @@ -8948,7 +8948,7 @@ בורר האמוג'י בחירת חלון יש ללחוץ לחיצה ימנית כדי להפעיל את -יש לגעת עם האצבע בלחצן ההפעלה. נתוני טביעות האצבע נשמרים באופן מאובטח ואף פעם לא נשלחים ממכשיר . +יש לגעת עם האצבע בכפתור ההפעלה. נתוני טביעות האצבע נשמרים באופן מאובטח ואף פעם לא נשלחים ממכשיר . ‏אתרים יכולים לבקש הרשאה להתחבר למכשירי Bluetooth מדריך לבחירות שלך בנושא פרטיות התקבלה בקשת גישה @@ -8969,7 +8969,7 @@ ‏ניהול התקני USB ‏אי אפשר להשתמש בקישור הזה. יש לבדוק אם הקישור מתחיל ב-'http://‎' או ב-'https://‎' ולנסות שוב. הדגשת סמן העכבר כשהסמן בתנועה -כדי לחזור לכמה דפים, לוחצים לחיצה ארוכה על לחצן 'הקודם'. +כדי לחזור לכמה דפים, לוחצים לחיצה ארוכה על כפתור 'הקודם'. ייתכן שתיעוד של ביקורך באתר יישמר במפתח האבטחה שלך. המשך חסימת הגישה לחיישנים התחברות באמצעות קוד @@ -9331,7 +9331,7 @@ מנהל המערכת הצמיד את התוסף הזה ‏אתרים שמורשים להשתמש בקובצי cookie של צד שלישי התקנה במכשיר זה -אפשר לגעת בחיישן טביעות האצבע שבפינה הימנית העליונה של המקלדת, ליד לחצן ההפעלה. נתוני טביעות האצבע נשמרים באופן מאובטח ואף פעם לא נשלחים ממכשיר ה-. +אפשר לגעת בחיישן טביעות האצבע שבפינה הימנית העליונה של המקלדת, ליד כפתור ההפעלה. נתוני טביעות האצבע נשמרים באופן מאובטח ואף פעם לא נשלחים ממכשיר ה-. אין מספיק נפח אחסון בדיסק ‏נכשל הניסיון לאחזר את ההפניה האוטומטית אל SAML מהשרת ‏ה-IMEI של המכשיר הוא והמספר הסידורי של המכשיר הוא . המספרים האלה יכולים לשמש להפעלת השירות. @@ -9382,7 +9382,7 @@ היסטוריית ההורדות המלאה הצגת הדומיינים לא ניתן לייבא את הסיסמאות. צריך לבדוק את הקובץ ולוודא שהפורמט שלו תקין. למידע נוסף -הלחצן 'המשך' מופעל +הכפתור 'המשך' מופעל {NUM_WEEKS,plural, =1{יש להחזיר את מכשיר ה- בתוך שבוע ({NUM_WEEKS})}one{יש להחזיר את מכשיר ה- בתוך {NUM_WEEKS} שבועות}two{יש להחזיר את מכשיר ה- בתוך שבועיים ({NUM_WEEKS})}other{יש להחזיר את מכשיר ה- בתוך {NUM_WEEKS} שבועות}} ‏ההגדרות לקובצי Office ‏שמורה במנהל הסיסמאות של Google בחשבון @@ -9419,7 +9419,7 @@ ‏לא ניתן להפעיל Cast ‏זיכרון JavaScript נדרש קוד אימות -צריך ללחוץ על לחצן כלשהו במכשיר . +צריך ללחוץ על כפתור כלשהו במכשיר . מידע נוסף על הצעות למודעות באתרים () בחירה מתוך רשימה @@ -9460,7 +9460,7 @@ הורדה: הפעולה הזו תמחק באופן סופי את נתוני הגלישה שלך במכשיר הזה. כדי לשחזר את הנתונים, יש להפעיל סנכרון חיפוש עדכונים -מקלדת שמופיעה במסך, הכתבה, גישה באמצעות מתג ועוד +מקלדת וירטואלית, הכתבה, גישה באמצעות מתג ועוד מרחק מתצוגה בדף שם המכשיר ארוך מדי , פרטים נוספים @@ -9603,7 +9603,7 @@ Microsoft OneDrive עריכת קיצור הדרך עבור הורדה מסוכנת נחסמה -‏המקלדת שמופיעה במסך לא עובדת עדיין באפליקציות Linux +‏המקלדת הווירטואלית לא עובדת עדיין באפליקציות Linux עיצוב חדש נוסף () נחסם על ידי הארגון שלך יש למחוק את כדי שמשתמשים אחרים במכשיר לא יוכלו לראות את הסיסמאות שלך @@ -10216,7 +10216,7 @@ ‏הפעלת חנות Play המשך ייתכן שאיכות המדיה תהיה נמוכה יותר -‏לחצן להצגת מידע נוסף על התיקון האוטומטי. ייפתח דף ההגדרות של התיקון האוטומטי. יש להקיש על Enter כדי להפעיל, או על Escape כדי לבטל. +‏כפתור להצגת מידע נוסף על התיקון האוטומטי. ייפתח דף ההגדרות של התיקון האוטומטי. יש ללחוץ על Enter כדי להפעיל, או על Escape כדי לבטל. עוד מעט כיבוי אורות אפשר להגן על מפתח האבטחה באמצעות קוד אימות הורדת קובץ לא מאובטח @@ -10258,7 +10258,7 @@ אישור לקוח לא חוקי Drive היסטוריית ההורדות מהתקופה האחרונה -הצגת לחצן 'דף הבית' +הצגת כפתור 'דף הבית' בלחיצה ימנית או בלחיצה ארוכה על טקסט, יוצגו הגדרות, תרגומים או המרת יחידות. בשפות לאתרים אפשר להתאים אישית את השפות לתרגום. עכשיו יש כמה שלבים שהורים צריכים להשלים. אפשר יהיה להחזיר את ה- לילד/ה לאחר הגדרת החשבון. הורד תמונה @@ -10384,11 +10384,11 @@ האם לשחזר את הדפים? ‏שמירה בחשבון Google שלך התאמה אישית של עיצוב המסך -לחצן לשליחת משוב +כפתור לשליחת משוב יציב לא ניתן להשתמש במיקרופון בדף זה אוקיינוס -קישוריות הרשת שלך התחדשה. יש לבחור רשת אחרת או ללחוץ על הלחצן 'המשך' שלמטה כדי להפעיל את יישום הקיוסק. +קישוריות הרשת שלך התחדשה. יש לבחור רשת אחרת או ללחוץ על הכפתור 'המשך' שלמטה כדי להפעיל את יישום הקיוסק. מקשי בחירה &פתיחת כל הסימניות מעבר למצב שינה כשהמחשב הנייד נסגר @@ -10814,7 +10814,7 @@ אנחנו בוחנים דרכים חדשות להגביל מעקב בין-אתרים ולאפשר לאתרים לעצור ניסיונות הונאה וספאם של מודעות. יכול להיות שהמכשיר שלך לא יעבוד כמו שצריך ושיהיו בעיות באבטחה ובביצועים. חמים יותר -כדי לחזור לכאן במהירות, יש ללחוץ על לחצן ההתקנה ולהתקין את +כדי לחזור לכאן במהירות, יש ללחוץ על כפתור ההתקנה ולהתקין את התרחשה שגיאת שרת זמנית. התאמה אישית של הטפט, העיצוב הכהה ועוד חיפוש באינטרנט... @@ -10982,7 +10982,7 @@ כדי לעבוד עם הדומיין , צריך להשאיר את הכרטיס החכם בפנים.}other{מכשיר ה- יינעל אוטומטית בעוד # שניות. כדי לעבוד עם הדומיין , צריך להשאיר את הכרטיס החכם בפנים.}} ‏הקובץ הזה גדול מדי לבדיקת אבטחה ולכן הוא נחסם על ידי הארגון שלך. אפשר לפתוח קבצים בגודל של עד 50MB. -הוספה או זיהוי לחצנים בטאבלט +הוספה או זיהוי כפתורים בטאבלט ‏סיסמת root A4 ‏אתרים יכולים להשתמש בקובצי cookie רק כדי לראות את פעילות הגלישה בהם, ולא באתרים אחרים @@ -11049,7 +11049,7 @@ הצעת סיסמה... ‏אפשר גם לבחור ב-PPD של המדפסת. מידע נוסף הוספת &דף... -התאמה אישית של לחצני הלוח +התאמה אישית של כפתורי הלוח בוצעה חסימה להרשאות ועוד הצמדת התוסף ‏שם DNS @@ -11096,7 +11096,7 @@ לא ניתן לטעון את התנאים וההגבלות חשבון הורה {COUNT,plural, =1{חשבון אחד ({COUNT})}one{{COUNT} חשבונות}two{{COUNT} חשבונות}other{{COUNT} חשבונות}} -‏משתמשים בלחצנים במסך כדי לנווט למסך הבית, לחזור למסך הקודם או לעבור בין אפליקציות. ההגדרה הזו מופעלת אוטומטית כשמפעילים את ChromeVox או את התכונה 'לחיצות אוטומטיות'. +‏משתמשים בכפתורים במסך כדי לנווט למסך הבית, לחזור למסך הקודם או לעבור בין אפליקציות. ההגדרה הזו מופעלת אוטומטית כשמפעילים את ChromeVox או את התכונה "לחיצות אוטומטיות". ‏ההרשאה להפעלת Cast נדחתה. מידע נוסף זמין במאמר במרכז העזרה. פתיחת הקישור ב- המערכת משתפת את עם @@ -11136,7 +11136,7 @@ הגדרות העכבר ולוח המגע הפעלת האצה של לוח מגע ‏שליחת מידע לגבי אופן השימוש בנתונים וניתוח הביצועים. המכשיר הזה שולח עכשיו אל Google נתוני אבחון, נתוני מכשיר ונתוני שימוש באפליקציות באופן אוטומטי. הנתונים האלה יעזרו לשמור על היציבות של המערכת ושל האפליקציות ולבצע שיפורים אחרים. חלק מהנתונים הנצברים יעזרו גם לשפר את האפליקציות של Google ויעזרו לשותפים של Google, כמו מפתחים של Android. ההגדרה הזו נאכפת על ידי הבעלים. אם ההגדרה 'פעילות באפליקציות ובאתרי אינטרנט נוספים' הופעלה, יכול להיות שהנתונים האלה יישמרו בחשבון שלך ב-Google. מידע נוסף על מדדיםמידע נוסף -האתר מהימן בעיניי (), קבוצת לחצני בחירה, 2 מתוך 3 +האתר מהימן בעיניי (), קבוצת כפתורי בחירה, 2 מתוך 3 איך לנהל את הנתונים שלך: כדי להגן על הפרטיות שלך, האתרים שנוספו לרשימה לפני יותר מ-4 שבועות נמחקים ממנה אוטומטית. אתר שביקרת בו שוב עשוי לחזור ולהופיע ברשימה. אפשר גם להסיר אתר אם לא רוצים שתחומי העניין יוגדרו לפי הביקור בו. המכשיר שלך יינעל רק ב-. ‏דיווח על ההגדרות הנוכחיות כדי לעזור לשפר את ChromeOS @@ -11314,7 +11314,7 @@ התרה בכל האתרים &כניסה מחדש סגירה -לחצן 'הקודם' לדף הפרטים של +כפתור 'הקודם' לדף הפרטים של בחרת בעבר לתת הרשאה לכל התוספים ב‑ בטעינה (%)... ‏יובאו מ-Windows @@ -11473,7 +11473,7 @@ ‏הגדרת Microsoft 365 לפתיחת קבצים ביטול נעילה לא הוגדר רישיון -הוספה או זיהוי לחצנים בעכבר +הוספה או זיהוי כפתורים בעכבר : מעבר אל הגדרות הגלישה הבטוחה ברוך בואך לפרופיל החדש שלך @@ -11576,7 +11576,7 @@ - מכשיר Bluetooth מחובר כדי להמשיך, הפרטים '' ישותפו על ידי עם האתר הזה. כאן מפורטת מדיניות הפרטיות של האתר הזה. מחיקת פרטי הכניסה -אפשר ללחוץ על הלחצן 'שיתוף' שבתחתית הכרטיס כדי לשתף עותק של הסיסמה עם אחד מהחברים בקבוצה המשפחתית +אפשר ללחוץ על הכפתור 'שיתוף' שבתחתית הכרטיס כדי לשתף עותק של הסיסמה עם אחד מהחברים בקבוצה המשפחתית הצגת שם המשתמש במסך הכניסה ‏הפעולה עשויה להימשך מספר דקות. מתבצעת הפעלה של הקונטיינר של Linux. האתר רשאי לשתף את המסך @@ -11706,7 +11706,7 @@ רוחב סימן הפיסוק הראשוני הוא מלא לחיצה כפולה על פריט, לחיצה ארוכה בלחיצה השנייה וגרירת הפריט כדי להזיז אותו החלון הזה ייסגר לאחר השלמת הביטול. -לחצן תפריט פעולות +כפתור תפריט פעולות לא מקוון שלום, סגירת כל הכרטיסיות diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_ja.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_ja.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_ja.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_ja.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -2512,7 +2512,7 @@     Google は、位置情報の精度と、位置情報を利用したサービスを改善し、Google のサービスを全般的に改善、提供、維持する目的でこの情報を使用します。また、ユーザーのニーズに応えるうえでの Google およびサードパーティの正当な利益に基づき、この情報を処理します。この情報が個人の特定に使用されることはありません。 [位置情報の精度] は、このデバイスの位置情報の設定([設定] > [プライバシーとセキュリティ] > [プライバシー管理] > [位置情報へのアクセス] > [位置情報の詳細設定])でいつでもオフにできます。[位置情報の精度] をオフにした場合、位置情報の精度に関するデータは一切収集されません。Android アプリやサービスでは、IP アドレスのみを使用して(可能な場合)、このデバイスの位置情報を判断します。そのため、Google マップなどの Android アプリやサービスでの位置情報の利用範囲と精度に影響する可能性があります。 Linux アプリとファイルのバックアップ -自身で選択 +自分で設定 すべての個人情報を含める 絵文字候補 このページはカメラにアクセスしています。 @@ -5890,7 +5890,7 @@ Alt+ デバイスの前から離れると、画面が自動的にロックされます。デバイスの前にいるときは、画面がロックされるまでの時間が長くなります。ロック画面を無効にしている場合、デバイスはロックされずにスリープ状態になります。 デバイスを登録しない -自身で選択 +自分で設定 システム音声 OS のシステムページをお探しですか? にアクセスしてください。 おすすめ diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_kn.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_kn.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_kn.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_kn.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -8273,7 +8273,7 @@ ಗಾಗಿ ಇನ್ನಷ್ಟು ಕ್ರಿಯೆಗಳು ಹೆಸರು 32 ಅಕ್ಷರಗಳನ್ನು ಮೀರುವಂತಿಲ್ಲ ಎಲ್ಲಾ ವಿಸ್ತರಣೆಗಳನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ -ಪಾಸ್‌ವರ್ಡ್ ಅಳಿಸುವುದೇ? +ಪಾಸ್‌ವರ್ಡ್ ಅಳಿಸಬೇಕೆ? ಕೊಲೊಸಿಯಮ್ ಸ್ವಯಂತುಂಬುವಿಕೆ ಫಾರ್ಮ್ ಡೇಟಾ WebRTC ಈವೆಂಟ್‌ ಲಾಗ್‌ಗಳು () diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_mk.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_mk.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_mk.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_mk.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -807,7 +807,7 @@ Активноста во заднина и некои визуелни ефекти, како што е непреченото лизгање, може да се ограничени Не може да го премести директориумот за наставки во профилот. Создајте профил -Подлога за допир +Допирна подлога Продолжи со емитување на Ова овозможува пристап до локацијата за апликациите, веб-сајтовите со дозволата за локација и системските услуги Ако го додадете контактов, ќе биде запомнет следниот пат кога ќе споделува diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_or.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_or.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_or.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_or.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -11674,7 +11674,7 @@ କୁ ସଂଶୋଧନ କରି କରିବା ପାଇଁ 'ସ୍ୱତଃସଂଶୋଧନକୁ ପୂର୍ବବତ୍ କରନ୍ତୁ' ଡାଏଲଗ୍ ଦେଖାଯାଇଛି। ଆକ୍ସେସ୍ କରିବାକୁ ଅପ୍ ତୀର କୀ, ଅଣଦେଖା କରିବାକୁ Escape କୀ ଦବାନ୍ତୁ। ଆପଣ ଜଣେ ବାପା କିମ୍ବା ମା' ବୋଲି ଯାଞ୍ଚ କରନ୍ତୁ ପ୍ରାରମ୍ଭିକ ବିରାମ ଚିହ୍ନର ଚଉଡ଼ା ପୂର୍ଣ୍ଣ ଅଛି -କୌଣସି ଆଇଟମରେ ଦୁଇ-ଥର ଟାପ କରନ୍ତୁ, ଦ୍ୱିତୀୟ ଥର ଟାପ କରି ଏହାକୁ ଦବାଇ ଧରନ୍ତୁ ଏବଂ ତା'ପରେ ଆଇଟମକୁ ମୁଭ କରିବା ପାଇଁ ଏହାକୁ ଡ୍ରାଗ କରନ୍ତୁ +କୌଣସି ଆଇଟମରେ ଦୁଇ-ଥର ଟାପ କରନ୍ତୁ, ଦ୍ୱିତୀୟ ଥରର ଟାପରେ ଏହାକୁ ଦବାଇ ଧରନ୍ତୁ ଏବଂ ତା'ପରେ ଆଇଟମକୁ ମୁଭ କରିବା ପାଇଁ ଏହାକୁ ଡ୍ରାଗ କରନ୍ତୁ ବାତିଲ୍ ହୋଇସାରିବା ପରେ ଏହି ୱିଣ୍ଡୋ ବନ୍ଦ ହୋଇଯିବ। କାର୍ଯ୍ୟ ମେନୁ ବଟନ୍ ଅଫ୍‍ଲାଇନ୍ diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_pl.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_pl.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_pl.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_pl.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -3124,7 +3124,7 @@ Język strony: Twoje urządzenie ma licencję na Chrome Education, ale Twoja nazwa użytkownika nie jest powiązana z kontem Google for Education. Utwórz takie konto na stronie g.co/workspace/edusignup, korzystając z dodatkowego urządzenia. Czcionka tekstu -Zapisuj m.in. swoje zakładki i hasła dzięki synchronizacji +Korzystaj z synchronizacji, aby zapisywać m.in. swoje zakładki i hasła Przesunięcie żuchwy w lewo Bezpieczne przeglądanie (chroni Ciebie i Twoje urządzenie przed niebezpiecznymi witrynami) Sprawdzanie pisowni diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_pt-BR.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_pt-BR.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_pt-BR.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_pt-BR.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -976,7 +976,7 @@ A exibição de solicitações está bloqueada Nenhum destino de transmissão encontrado. Precisa de ajuda? Opacidade do plano de fundo -Ajudar a aprimorar o enviando automaticamente estatísticas de uso e relatórios de problemas ao Google. +Ajudar o a melhorar enviando automaticamente estatísticas de uso e relatórios de problemas ao Google. Para fazer login novamente e ter acesso a recursos educacionais, peça permissão a um dos responsáveis Esta página está acessando seu microfone. Problema com o adaptador de energia @@ -4142,7 +4142,7 @@ Selecionar fuso horário Tire o dedo e toque novamente Nome -Use uma senha forte +Usar uma senha forte Gerenciar o grupo de guias "" O nome de usuário "" não está disponível A senha da Conta do Google está sendo usada. Você pode definir uma senha do para facilitar o login. @@ -5163,7 +5163,7 @@ Wi-Fi disponível por meio de vários dispositivos Sem permissão para capturar e usar a entrada do teclado Número de sugestões -Verificações detalhadas de downloads suspeitos. +Faz verificações detalhadas de downloads suspeitos. Marcar como não lido Mostrar senhas Sempre permitir que acesse sua câmera e seu microfone @@ -7272,7 +7272,7 @@ Confirmar download Receber ajuda Escolha o idioma da página que você gostaria de traduzir -Ajudar a melhorar os Chromebooks +Ajude a melhorar os Chromebooks A sincronização não está funcionando. Tente fazer login novamente. A visualização de impressão falhou. Para desbloquear o perfil, faça login com o e-mail da sua conta principal: @@ -7385,7 +7385,7 @@ {NUM_OF_FILES,plural, =1{Não é possível copiar o arquivo para o }one{Não é possível copiar o arquivo para o }other{Não é possível copiar os arquivos para o }} A formatação foi concluída. Esse contêiner já existe. -Seta para baixo +Para baixo O perfil será excluído Conexão de dados disponível a partir do seu Arquivo de chaves particulares (opcional) @@ -9060,7 +9060,7 @@ na parte superior da tela do painel do ChromeVox O arquivo pode ser perigoso. Adicione uma senha se quiser que o Chrome o verifique ou baixe de forma direta. Nenhum dispositivo HID encontrado -Controlar como o histórico de navegação é usado para personalizar a Pesquisa e mais +Controle como o histórico de navegação é usado para personalizar a Pesquisa e mais Seu administrador bloqueou a extensão : ID do app Insira o cartão inteligente para continuar usando seu Manter assim @@ -9543,7 +9543,7 @@ Excesso de solicitações. A guia foi movida para um grupo sem nome: poderá ver arquivos em até que você feche todas as guias desse site -Quando sua conta está conectada, essa opção protege você nos Serviços do Google. +Protege você em todos os Serviços do Google quando sua conta está conectada. Nenhuma voz encontrada Tente de novo depois que a sincronização do arquivo for concluída. Atalho para a extensão diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_ru.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_ru.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_ru.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_ru.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -4130,7 +4130,7 @@ Выберите часовой пояс Коснитесь несколько раз Название -Используйте надежный пароль +Использовать надежный пароль Управление группой вкладок "" Имя пользователя "" недоступно. Используется пароль аккаунта Google. Чтобы входить ещё быстрее, задайте отдельный пароль для . @@ -10415,7 +10415,7 @@ Более подробная информация доступна на странице g.co/flex/InstallErrors. -С возвращением! +Двигаемся дальше? Политика не найдена. Запретить сайтам определять ваше местоположение Подтвердите личность @@ -10424,7 +10424,7 @@ Установка ПО для сканера… Сервер недоступен. Виниловая пластинка -Оповещение о проблеме производительности +Проблемы с производительностью Настройки озвучивания при нажатии Остановить плагин Сведения об устройстве Bluetooth diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_sl.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_sl.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_sl.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_sl.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -6373,7 +6373,7 @@ Če nadaljujete, se strinjate, da lahko ta naprava tudi samodejno prenaša in namešča posodobitve in aplikacije Googla, operaterja in proizvajalca te otrokove naprave – morda s prenosom podatkov v mobilnih omrežjih. Nekatere od teh aplikacij morda ponujajo nakupe v aplikaciji. {NUM_CHARACTERS,plural, =1{Koda PIN mora vsebovati najmanj en znak}one{Koda PIN mora vsebovati najmanj # znak}two{Koda PIN mora vsebovati najmanj # znaka}few{Koda PIN mora vsebovati najmanj # znake}other{Koda PIN mora vsebovati najmanj # znakov}} Domena zahteva, da se povežete z omrežjem Wi-Fi in prenesete posodobitev. Prenesete jo lahko tudi prek povezave z omejenim prenosom podatkov (prenos podatkov se morda zaračuna). -Prilagodite hitrost posebej za vsako smer +Prilagoditev hitrosti ločeno za vsako smer Konfiguriranje dostopne točke naprave Ni dovoljeno samodejno prenesti več datotek Ponudi pomoč pri pisanju @@ -11028,7 +11028,7 @@ Ogromni prihranki Brskanje je hitrejše, ker je manj verjetno, da vas bo spletno mesto pozvalo, da potrdite, da ste resnična oseba. Kadar ni povezana nobena naprava -Stabilna +Stabilno Spletna trgovina Mačka Svetlo zelenomodra diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_ur.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_ur.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_ur.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_ur.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -177,7 +177,7 @@ ہیرا لِڈ بند ہونے پر سلیپ وضع میں بھیجیں آپ کی شناخت کی تصدیق نہیں کی جا سکی -کے بارے میں +تعارف "" ایکسٹینشن اس ترتیب کو نافذ کرتی ہے۔ پاس ورڈز اور آٹو فل سسٹم آلہ کے ماڈل یا نمبر شمار کا تعین کرنے میں ناکام ہو گیا۔ diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_vi.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_vi.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_vi.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_vi.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -76,7 +76,7 @@ Đã di chuyển cửa sổ lên trên và sang bên trái Khởi động lại Linux? Sao chép &văn bản liên kết -Hiển thị +Màn hình Tự động phân bổ {COUNT,plural, =1{Đang nhận từ thiết bị }other{Đang nhận từ thiết bị }} Ẩn danh @@ -2388,7 +2388,7 @@ Để bật tùy chọn gỡ lỗi ADB, bạn cần phải đặt lại Chromebook này về trạng thái ban đầu. Tìm hiểu thêm Phát triển ứng dụng Android Xoá canvas -Hiển thị tùy chọn nhập trên kệ +Hiện các tuỳ chọn nhập trong thanh ứng dụng Các trang web có thể yêu cầu cuộn và thu phóng các thẻ được chia sẻ Xóa ""? không thể hoàn tất cài đặt nhưng sẽ tiếp tục chạy từ hình ảnh đĩa của trình duyệt này. @@ -11591,7 +11591,7 @@ sẽ chỉnh sửa được các tệp trong Tìm kiếm trên Từng xem trước đây -Các phương thức khóa màn hình +Các phương thức khoá màn hình Đã xảy ra lỗi. Vui lòng liên hệ với quản trị viên hoặc chủ sở hữu thiết bị. Mã lỗi: . Đỏ – xanh lục, phân biệt màu lục kém (Mù màu lục nhẹ) &Bật cấu hình diff -Nru chromium-132.0.6834.110/chrome/app/resources/generated_resources_zh-TW.xtb chromium-132.0.6834.159/chrome/app/resources/generated_resources_zh-TW.xtb --- chromium-132.0.6834.110/chrome/app/resources/generated_resources_zh-TW.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/generated_resources_zh-TW.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -2636,7 +2636,7 @@ 已登入 螢幕大小 沒有受管理的印表機。 -手勢設定: +表情設定: 開啟資料夾 請確認藍牙裝置「」上顯示的密碼金鑰為 無法開啟替代瀏覽器 @@ -3789,7 +3789,7 @@ 點選觸控筆按鈕 正在初始化 網路檔案共用 -回應式 +靈敏 閒置分頁新外觀登場 你的家長或監護人已關閉 Chrome 的「網站、應用程式和擴充功能的權限」,因此你無法使用這個擴充功能。 繼續允許 存取你的麥克風 @@ -5694,7 +5694,7 @@ 開啟 開啟「零打擾」模式 第三方 Cookie -使用手勢進入捲動模式,然後將頭部轉向要捲動的方向。再次做出手勢即可退出捲動模式。 +使用表情進入捲動模式,然後將頭部轉向要捲動的方向。再次做出表情即可退出捲動模式。 下一句 複製密碼 Crostini Android 應用程式 ADB @@ -7005,7 +7005,7 @@ 同步功能已開啟 網路無法使用 放大鏡跟隨「隨選朗讀」讀出的字詞 -指派手勢 +指派表情 區段 個 (最多 個) {COUNT,plural, =0{在新視窗中開啟所有網址(&N)}=1{在新視窗中開啟(&N)}other{在新視窗中開啟所有 ({COUNT} 個) 網址(&N)}} @@ -7973,7 +7973,7 @@ 訓練聲音時,建議你使用耳罩式耳機 你的分頁、網頁標題和網址會傳送給 Google 正在接收 Wi-Fi 資訊... -已將「」手勢設為 +已將「」表情設為 海上大浪噴濺,遠處背景可見陸地。在黑暗陰鬱的天空中,地平線上出現些微橘色光芒。 查詢網址 可用空間: @@ -8371,7 +8371,7 @@ 你即將啟用 Chrome OS 偵錯功能,這會一併設定 sshd Daemon,並允許從 USB 隨身碟執行啟動作業。 再指派 1 個切換工具 這個安全金鑰不支援 PIN 碼 -手勢偵測門檻 +表情偵測門檻 不使用票證造訪 選取分頁群組並啟用內容選單,即可編輯群組 必須更新 Linux @@ -10966,7 +10966,7 @@ 觸控筆 如果你的孩子看到這個圖示,就表示他們可以透過指紋進行身分認證或購買交易。 請說明你允許使用第三方 Cookie 的原因,協助我們改善 Chrome -選取「」的手勢 +選取「」的表情 這個分頁群組已額滿 進一步瞭解如何更新 將「Do Not Track」要求與瀏覽流量一併送出 @@ -10990,7 +10990,7 @@ 節省量:極大 降低網站確認你是否為真人的機率,提供更快速的瀏覽體驗 沒有任何裝置連線時 -穩定版 +穩定 線上應用程式商店 貓咪 淺藍綠色 diff -Nru chromium-132.0.6834.110/chrome/app/resources/google_chrome_strings_iw.xtb chromium-132.0.6834.159/chrome/app/resources/google_chrome_strings_iw.xtb --- chromium-132.0.6834.110/chrome/app/resources/google_chrome_strings_iw.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/google_chrome_strings_iw.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -284,7 +284,7 @@ נוסף ל-‏Chrome ‏כדי להשתמש בהתאמה אישית, צריך לכלול את Chrome ב'פעילות באינטרנט ובאפליקציות' ‏‫Chrome חסם את ההורדה הזו כי הקובץ יכול לפגוע בחשבונות האישיים ובחשבונות שלך ברשתות החברתיות -‏אפשר להצמיד את Google Lens כדי לאפשר גישה נוחה: פשוט לוחצים על הלחצן 'הצמדה' בחלק העליון של החלונית הצדדית +‏אפשר להצמיד את Google Lens כדי לאפשר גישה נוחה: פשוט לוחצים על הכפתור 'הצמדה' בחלק העליון של החלונית הצדדית ‏Chrome לא יכול לבדוק את הסיסמאות שלך כי לא נכנסת לחשבון ‏בגלישה במצב פרטי, Chrome יציג אזהרה לפני טעינת אתר באמצעות חיבור לא מאובטח עם ההגנה המשופרת, החסימה של פישינג ותוכנות זדוניות מקיפה יותר @@ -400,7 +400,7 @@ ‏אפשר להתאים אישית את Chrome בדרך שנוחה לך ‏Google Chrome יופעל מחדש בעוד סגירה -‏התכונה הוצמדה. מעכשיו אפשר לגשת אל Google Lens דרך הלחצן החדש בסרגל הכלים +‏התכונה הוצמדה. מעכשיו אפשר לגשת אל Google Lens דרך הכפתור החדש בסרגל הכלים ‏פתיחת Lens העתקה כתמונה ‏לשיפור האבטחה, Google Chrome יצפין את הנתונים @@ -626,7 +626,7 @@ שגיאה בשירות: . רשימת שפות לחיפוש ‏בעזרת פרופילים ב-Chrome, אפשר להפריד בין הפריטים ששומרים ב-Chrome. באופן הזה קל יותר להפריד בין עבודה לפנאי. -חדש! אפשר לתרגם טקסט ותמונות במסך באמצעות לחיצה על הלחצן 'תרגום המסך' +חדש! אפשר לתרגם טקסט ותמונות במסך באמצעות לחיצה על הכפתור 'תרגום המסך' ‏Google Chrome אינו מגיב. להפעיל מחדש עכשיו? ‏Chrome זקוק להרשאת גישה למצלמה כדי ליצור מפה תלת-ממדית של הסביבה שלך {0,plural, =1{‏Chrome יופעל מחדש בעוד דקה}one{‏Chrome יופעל מחדש בעוד # דקות}two{‏Chrome יופעל מחדש בעוד # דקות}other{‏Chrome יופעל מחדש בעוד # דקות}} diff -Nru chromium-132.0.6834.110/chrome/app/resources/google_chrome_strings_pt-BR.xtb chromium-132.0.6834.159/chrome/app/resources/google_chrome_strings_pt-BR.xtb --- chromium-132.0.6834.110/chrome/app/resources/google_chrome_strings_pt-BR.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/google_chrome_strings_pt-BR.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -192,7 +192,7 @@ Teste novos recursos de IA para criar temas, receber ajuda com a escrita e se organizar Se você também compartilhar os relatórios de uso do Chrome, eles vão incluir os URLs acessados Personalize seu navegador com uma nova cor -Fazer login no Google Chrome +Fazer login no Chrome Reiniciar agora Depois, o Chrome vai perguntar se você quer usar as informações salvas para preencher formulários automaticamente Depois, é necessário reiniciar o Chrome. @@ -339,7 +339,7 @@ Fazer login no Chrome ao se conectar a outros Serviços do Google O Chrome pré-carrega mais páginas que você provavelmente vai visitar para que elas sejam carregadas mais rapidamente ao serem acessadas Descubra ótimos aplicativos, jogos, extensões e temas para o Google Chrome. -Personalize seu perfil do Chrome +Personalizar perfil do Chrome O Chrome pode deixar esta guia inativa para melhorar sua experiência de navegação e liberar recursos. Conheça o Chrome. Nova janela do navegador aberta O Chrome precisa de permissão para rastrear suas mãos @@ -499,7 +499,7 @@ O Chrome libera memória de guias inativas. Isso permite que essas guias e outros apps usem mais recursos do computador e mantém a velocidade do Chrome. Suas guias inativas são reativadas automaticamente quando você volta a elas. {COUNT,plural, =0{Uma nova atualização está disponível para o Chrome e será feita assim que você reiniciá-lo.}=1{Uma nova atualização está disponível para o Chrome e será feita assim que você reiniciá-lo. Sua janela anônima não será aberta novamente.}one{Uma nova atualização está disponível para o Chrome e será feita assim que você reiniciá-lo. Sua janela anônima não será aberta novamente.}other{Uma nova atualização está disponível para o Chrome e será feita assim que você reiniciá-lo. Suas # janelas anônimas não serão abertas novamente.}} Se tiver mudado, edite a senha salva no Chrome para que ela seja igual à nova senha. -Bem-vindo ao Google Chrome +Que bom te ver no Google Chrome! Saiba mais sobre esses recursos nas configurações do Chrome. Sua organização vai fechar o Chrome se ele não for usado por . Você está fazendo login com uma conta gerenciada e concedendo ao administrador da conta o controle sobre seu perfil do Google Chrome. Seus dados do Google Chrome, como aplicativos, favoritos, histórico, senhas e outras configurações serão permanentemente vinculados a . Você pode excluir esses dados pelo painel das Contas do Google, mas não pode associá-los a outra conta. Você tem a opção de criar um novo perfil para manter seus dados existentes do Google Chrome separados. diff -Nru chromium-132.0.6834.110/chrome/app/resources/google_chrome_strings_ru.xtb chromium-132.0.6834.159/chrome/app/resources/google_chrome_strings_ru.xtb --- chromium-132.0.6834.110/chrome/app/resources/google_chrome_strings_ru.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/app/resources/google_chrome_strings_ru.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -409,7 +409,7 @@ Chrome становится все лучше На этом языке показываются меню, настройки, оповещения и другой текст в Chrome Чтобы использовать микрофон, предоставьте Chrome доступ к нему в системных настройках -Чтобы поддерживать работу этих вкладок, используется оперативная память. Разрешите Chrome сделать их неактивными, и производительность повысится. +Эти вкладки занимают лишние ресурсы. Чтобы повысить производительность, разрешите Chrome сделать их неактивными. Открывать PDF-файлы в Chrome Чтобы использовать и сохранять данные Chrome в аккаунте Google, обновите Chrome. Ваша организация удаляет данные Chrome, если они не используются в течение . Они могут включать в себя историю, сведения для автозаполнения и скачанные файлы. diff -Nru chromium-132.0.6834.110/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_iw.xtb chromium-132.0.6834.159/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_iw.xtb --- chromium-132.0.6834.110/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_iw.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_iw.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -39,7 +39,7 @@ marquee אין עוד כותרות מרמה 4 ‏מקשי הקיצור הבאים אינם פקודות ChromeVox, אבל הם עדיין שימושיים מאוד אם רוצים לנצל את כל היתרונות של Chrome. - כדי לנווט קדימה בין פריטים שמאפשרים לבצע פעולה, כמו לחצנים וקישורים, מקישים על המקש Tab. כדי לנווט אחורה, מקישים על Shift+Tab. + כדי לנווט קדימה בין פריטים שמאפשרים לבצע פעולה, כמו כפתורים וקישורים, מקישים על המקש Tab. כדי לנווט אחורה, מקישים על Shift+Tab. כדי לעבור אל תיבת הכתובות בדפדפן Chrome, שנקראת גם סרגל הכתובות, מקישים על Control+L. כדי לפתוח באופן אוטומטי כרטיסייה חדשה ולעבור אליה, מקישים על Control+T. הסמן יופיע בסרגל הכתובות. כדי לסגור כרטיסייה, מקישים על Control+W. @@ -59,13 +59,13 @@ אין ביטוי מתמטי קודם נבחר ‏אפשר להציג את המדריכים בכל שלב. פשוט לוחצים בעזרת ארבע אצבעות כדי לפתוח את התפריטים. לאחר מכן, מפעילים את המדריך שבקטע ChromeVox. -לחצן החלפת מצב +כפתור החלפת מצב כחול שמיים בהיר ‏לוחצים עם 4 אצבעות כדי לעבור אל התפריטים של ChromeVox לחיצה על מקש הרווח חזרה לקטע הקודם. הדוגמאות כוללות את מגש הסטטוס ואת מרכז האפליקציות. הדרכה להפעלה באמצעות מגע -, ביטלת את הסימון בלחצן הבחירה של האפשרות בתפריט +, ביטלת את הסימון בכפתור הבחירה של האפשרות בתפריט חום צהבהב מנמיכים את הגבות מתוך @@ -228,7 +228,7 @@ תיבת סימון move to the next sentence כרגע -קבוצת לחצני בחירה +קבוצת כפתורי בחירה ביטול הבחירה כותרת 6 {COUNT,plural, =1{כוכבית}one{# סימני כוכבית}two{# סימני כוכבית}other{# סימני כוכבית}} @@ -300,7 +300,7 @@ {COUNT,plural, =1{דקה}one{דקות}two{דקות}other{דקות}} מידע {COUNT,plural, =1{סוגר מסולסל שמאלי}one{# סימני סוגר מסולסל שמאלי}two{# סימני סוגר מסולסל שמאלי}other{# סימני סוגר מסולסל שמאלי}} -אין עוד לחצנים +אין עוד כפתורים ‏פתיחת המדריך של ChromeVox החלקה ימינה עם שלוש אצבעות התכונה 'הפעלה חכמה של ההקשה ביד אחת' פעילה @@ -319,7 +319,7 @@ ‏מקש החיפוש + O, ואז S. אפשר להשתמש במקשי הקיצור האלה לצורך התקנה, ניהול והתאמה אישית של קולות. ‏‎@עריכה 8 נק'‎ ‏ChromeVox בטעינה -לחצן בחירה של פריט בתפריט +כפתור בחירה של פריט בתפריט {COUNT,plural, =1{גרש}one{# סימני גרש}two{# סימני גרש}other{# סימני גרש}} סמן התקדמות ‏אפשרויות של ChromeVox @@ -367,7 +367,7 @@ , כרטיסייה ללא קו חוצה chk -לחצן קופץ +כפתור קופץ הקישור הקודם שאליו נכנסת תאים בכל שורה: : @@ -493,7 +493,7 @@ ירוק ליים sts מתבצעת טעינת דף -צריך להקיש על מקש החיפוש ועל החץ ימינה כדי למצוא את הלחצן 'הבא'. כדי ללחוץ עליו, יש להקיש על מקש החיפוש ומקש הרווח. +צריך ללחוץ על מקש החיפוש ועל החץ ימינה כדי למצוא את הכפתור 'הבא'. כדי ללחוץ עליו, יש ללחוץ על מקש החיפוש ומקש הרווח. {COUNT,plural, =1{טילדה (~)}one{# סימני טילדה (~)}two{# סימני טילדה (~)}other{# סימני טילדה (~)}} האובייקט הקודם כולל תפריט משנה @@ -508,7 +508,7 @@ מושבת מחליקים מעלה או מטה כדי לעבור שורה אחר שורה המשפט הקודם -לחצן +כפתור מעבר לעמודה הקודמת העברה ימינה תכלת @@ -627,16 +627,16 @@ עריכת הטקסט שדה הטקסט ריק מינימום -אין לחצן קודם -לחצן 'הקודם' +אין כפתור קודם +כפתור 'הקודם' קלט לא מזוהה ‏נתחיל במספר מקשים שישמשו אותך באופן שוטף. אפשר להשתמש במקש Control כדי להפסיק דיבור שפועל. מקש Control נמצא בפינה השמאלית התחתונה של המקלדת. כדי להמשיך, יש להקיש על המקש Control. דילוג לחלק העליון של הדף , חלון אחוזים מקצב הדיבור הקראת מצב הסוללה הנוכחי -, לחצן בחירה מסומן -, סימנת את לחצן הבחירה של האפשרות בתפריט +, כפתור בחירה מסומן +, סימנת את כפתור הבחירה של האפשרות בתפריט לא ניתן , הפעלה של תיעוד דיבור העברת תצוגת ברייל לחלק העליון של הדף @@ -708,20 +708,20 @@ מילה תפריט הקשר כחול בינוני -לחצן בחירה +כפתור בחירה השלמת את ההדרכה המהירה! hdr גיינסבורו הפעלת הכתבה או הפסקתה הפעלה או השבתה של המשוב הקולי (צלילי חיווי) -לחצן +כפתור הרשימה הבאה hdnggrp ‏מצב למידה של ChromeVox התפריט הראשי עריכת טקסט, רשומת אימייל תיבת הסימון הבאה -, לחצן הבחירה לא נבחר +, כפתור הבחירה לא נבחר ביצוע פעולת ברירת המחדל {COUNT,plural, =1{תבליט מרובע}one{# תבליטים מרובעים}two{# תבליטים מרובעים}other{# תבליטים מרובעים}} השלמה אוטומטית מוטבעת @@ -731,8 +731,8 @@ יומן h4 סמל גרפי -‏כל הכבוד! למדת את כל המידע הבסיסי שיאפשר לך להשתמש ב-ChromeVox. חשוב לזכור שאפשר לפתוח את תפריט הפקודות של ChromeVox בכל שלב על ידי הקשה על Search+מקש הנקודה. כדי לקבל מידע נוסף על ChromeVox ו-ChromeOS, אפשר לעיין במאמרים הבאים. - אם סיימת עם המדריך, אפשר להשתמש ב-ChromeVox כדי לנווט ללחצן 'סגירה' וללחוץ עליו. +‏כל הכבוד! למדת את כל המידע הבסיסי שיאפשר לך להשתמש ב-ChromeVox. חשוב לזכור שאפשר לפתוח את תפריט הפקודות של ChromeVox בכל שלב על ידי לחיצה על Search+מקש הנקודה. כדי לקבל מידע נוסף על ChromeVox ו-ChromeOS, אפשר לעיין במאמרים הבאים. + אם סיימת עם המדריך, אפשר להשתמש ב-ChromeVox כדי לנווט לכפתור 'סגירה' וללחוץ עליו. ‏שימוש בתכונות הנגישות של מסך המגע ב-Chromebook פקודות דילוג אזור טקסט @@ -752,11 +752,11 @@ ‏זו הכותרת השנייה. כדי להמשיך בשיעור יש להקיש על מקש החיפוש ועל H או על מקש החיפוש, על Shift ועל H הכותרת הקודמת של רמה 5 נספח -‏כל הכבוד! למדת את המידע הבסיסי לשימוש ב-ChromeVox באמצעות מגע. אפשר לעבור שוב על המידע במדריך, או לצאת ממנו על ידי לחיצה על הלחצנים שלמטה. +‏כל הכבוד! למדת את המידע הבסיסי לשימוש ב-ChromeVox באמצעות מגע. אפשר לעבור שוב על המידע במדריך, או לצאת ממנו על ידי לחיצה על הכפתורים שלמטה. ‏תוסף המרת טקסט לדיבור (TTS) של Google Enhanced Network התכונה 'שליטה באמצעות תנועות הפנים' מאפשרת לשלוט בסמן באמצעות הבעות פנים, ולבצע פעולות כמו לחיצה שמאלית בעזרת תנועות פנים, כמו חיוך. לחיצה עם שתי אצבעות -הצגה או הסתרה של המקלדת שמופיעה במסך +הצגה או הסתרה של המקלדת הווירטואלית פריט עץ טורקיז כהה הקראת הדף באופן אוטומטי אחרי שהטעינה שלו מסתיימת @@ -850,7 +850,7 @@ {COUNT,plural, =1{נקודתיים}one{# סימני נקודתיים}two{# סימני נקודתיים}other{# סימני נקודתיים}} תיבת דו-שיח של התראה תוכן העניינים -הלחצן הבא +הכפתור הבא אינדקס הפחתת הבהירות טורקיז @@ -940,7 +940,7 @@ מתבצע חיבור לבנדר תקציר -לחצן קופץ +כפתור קופץ הד תו כחול מידנייט () @@ -954,7 +954,7 @@ פתיחת תיאור ארוך בכרטיסייה חדשה אין גרפיקה קודמת יישום -לחצן הבחירה הבא +כפתור הבחירה הבא קול ברירת המחדל של המרת טקסט לדיבור אין סימני פיסוק הפעלת תיאורים מפורטים @@ -970,7 +970,7 @@ עזרה נבחר באופן חלקי גילוי באמצעות מגע -‏דוגמאות לפקודות קפיצה נוספות: קפיצה באמצעות קישור, לחצן או תיבת סימון. רשימה מלאה של פקודות קפיצה מופיעה בתפריטי ChromeVox, שאותם ניתן לפתוח על ידי הקשה על מקש החיפוש ועל מקש הנקודה. +‏דוגמאות לפקודות קפיצה נוספות: קפיצה באמצעות קישור, כפתור או תיבת סימון. רשימה מלאה של פקודות קפיצה מופיעה בתפריטי ChromeVox, שאותם ניתן לפתוח על ידי לחיצה על מקש החיפוש ועל מקש הנקודה. מעבר לברייל 8 נקודות פרטי רשימת תיאורים {COUNT,plural, =1{אמפרסנד (&)}one{# סימני אמפרסנד (&)}two{# סימני אמפרסנד (&)}other{# סימני אמפרסנד (&)}} @@ -1009,7 +1009,7 @@ השהיית כל הווידאג'טים של מדיה הפועלים כעת הטבלה הבאה (), רמה -כדי למצוא את אזור התרגול או את הלחצן 'השיעור הבא', מקישים על מקש החיפוש ועל החץ ימינה. לאחר מכן מקישים על מקש החיפוש ועל הרווח כדי להפעיל. +כדי למצוא את אזור התרגול או את הכפתור 'השיעור הבא', לוחצים על מקש החיפוש ועל החץ ימינה. לאחר מכן לוחצים על מקש החיפוש ועל הרווח כדי להפעיל. אפור כהה כותרת 2 {COUNT,plural, =1{שעה}one{שעות}two{שעות}other{שעות}} @@ -1018,7 +1018,7 @@ איפוס ההגדרות של המרת טקסט לדיבור עריכת טקסט, רשומת כתובת אתר tlbar -לחצן הבחירה הקודם +כפתור הבחירה הקודם move to the next word אין autolst @@ -1130,7 +1130,7 @@ ‏אני רוצה להשהות את ההשמעה כשתוסף ה-ChromeVox מקריא עכשיו נלמד פעולות ניווט בסיסיות. אפשר להקיש הקשה ארוכה על מקש החיפוש ועל מקשי החיצים כדי לנוע במסך. כדי להמשיך, יש להקיש על מקש החיפוש + החץ ימינה. צמצום רמת הפירוט של ניווט -לחצן סיבוב +כפתור סיבוב עיצוב ‏כדי לראות את כל הפקודות והקיצורים הזמינים ב-ChromeVox, יש להקיש על מקש החיפוש ומקש הנקודה. לאחר מכן יש להשתמש במקשי החיצים כדי לנווט בתפריטים. יש להשתמש במקש Enter כדי להפעיל פקודה. הקשה על מקש החיפוש יחד עם o ולאחר מכן t תחזיר אותך לכאן. תו @@ -1143,7 +1143,7 @@ ‏חלונית ChromeVox בקרת תאריך ביסק -‏כל הכבוד! למדת את המידע הבסיסי לשימוש ב-ChromeVox. אפשר לעבור שוב על המידע במדריך, או לצאת ממנו על ידי לחיצה על אחד הלחצנים שלמטה. +‏כל הכבוד! למדת את המידע הבסיסי לשימוש ב-ChromeVox. אפשר לעבור שוב על המידע במדריך, או לצאת ממנו על ידי לחיצה על אחד הכפתורים שלמטה. אין עוד כותרות מרמה 6 עגבנייה הקראת הקואורדינטות של התא הנוכחי @@ -1185,7 +1185,7 @@ ליים מסומנת באופן חלקי שע -אין לחצן בחירה קודם +אין כפתור בחירה קודם אין קטע קודם Esc tltip @@ -1197,7 +1197,7 @@ יש לבחור טבלת ברייל 8 נקודות: מעבר לתו הקודם ‎+popup‎ -אין עוד לחצני בחירה +אין עוד כפתורי בחירה מעבר דף אין כותרת קודמת הוסר מהבחירה diff -Nru chromium-132.0.6834.110/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb --- chromium-132.0.6834.110/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -647,7 +647,7 @@ Google Play አገልግሎቶችን ያዘምኑ በማንኛውም ጣቢያ ላይ ዋጋው ቢቀንስ ማንቂያዎችን ያግኙ ቀይ ቡናማ -የህግ መረጃ +የሕግ መረጃ {NUM_SITES,plural, =1{በቀን 1 ያህል ማሳወቂያ}one{በቀን # ያህል ማሳወቂያ}other{በቀን # ያህል ማሳወቂያዎች}} ቆይተው እንደገና ይሞክሩ ዕልባት diff -Nru chromium-132.0.6834.110/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb --- chromium-132.0.6834.110/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -62,7 +62,7 @@ جهاز إغلاق علامة التبويب الحالية هل تريد إزالة اقتراح من الحافظة؟ -‏رسم الشعار المبتكر من Google: +‏ رسم شعار Google: ‏سيظهر لك الآن محتوى من موقع "" وحوله في القسم "تتم متابعته حاليًا". يتم حفظ المواقع الإلكترونية وعمليات البحث التي تُتابعها في حسابك على Google. يمكنك إدارة المحتوى الذي تُتابعه من خلال الإعدادات في أي وقت. قائمة القراءة سيظهر لك السجلّ هنا. diff -Nru chromium-132.0.6834.110/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb --- chromium-132.0.6834.110/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -578,7 +578,7 @@ Suchleiste öffnen Diese Seite benötigt zu viel Arbeitsspeicher und wurde daher von Chrome angehalten. Möglicherweise siehst du den Verlauf von anderen Apps, die Links in Chrome öffnen. -Nein, danke +Nein danke Google und ich Übersetzungseinstellungen Zum Suchen antippen @@ -1484,7 +1484,7 @@ Hinzufügen  Tabs wiederhergestellt Lesezeichen, Passwörter und andere Daten auf allen deinen Geräten aufrufen -Nein danke +Nein, danke Durch das Entfernen dieses Passworts wird dein -Konto nicht gelöscht. Ändere dein Passwort oder lösche dein Konto auf , um das Konto gegen unbefugten Zugriff zu schützen. Öffnen mit… {FILE_COUNT,plural, =1{Alle Dateien, 1 Datei in der Liste}other{Alle Dateien, # Dateien in der Liste}} @@ -1666,7 +1666,7 @@ Diese Seite öffnen {ARCHIVED_TAB_COUNT,plural, =1{Inaktiver Tab (1)}other{Inaktive Tabs (#)}} Inkognitotabs beim Verlassen von Chrome sperren -Anstößig oder nicht sicher +Anstößig oder bedenklich Chrome beschränkt die Gesamtmenge an Daten, die Websites über den Browser zur Analyse der Werbeleistung teilen können Übersetzung von fremdsprachigen Seiten anbieten In den Lesezeichen findest du deine Leseliste diff -Nru chromium-132.0.6834.110/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb --- chromium-132.0.6834.110/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -416,7 +416,7 @@ La lista de dispositivos con los que puedes compartir una pestaña está abierta a altura completa. Historias no leídas listas Plataforma de notificaciones de Google -Usa el bloqueo de pantalla para ver las pestañas de Incógnito abiertas +Usa el método de desbloqueo de la pantalla para ver las pestañas de Incógnito abiertas El nombre no es válido Almacenamiento de Google Tu teclado no cambiará diff -Nru chromium-132.0.6834.110/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb --- chromium-132.0.6834.110/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -880,7 +880,7 @@ Connectez-vous à ce site et à Chrome pour accéder sur tous vos appareils à vos favoris et bien plus Vous verrez bientôt les stories de quand vous ouvrirez un onglet. Les sites que vous suivez seront enregistrés dans votre compte Google. Vous pourrez les gérer dans les paramètres Discover. Une erreur s'est produite. -Les sites que vous consultez peuvent déterminer ce que vous aimez, puis vous montrer des annonces alors que vous continuez de naviguer +Les sites que vous consultez peuvent déterminer ce qui vous intéresse, puis vous montrer des annonces lorsque vous continuez de naviguer 1 heure restante La feuille de filtrage des applis est fermée. vers diff -Nru chromium-132.0.6834.110/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb --- chromium-132.0.6834.110/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -571,7 +571,7 @@ Download di non riuscito perché non è possibile trovare il percorso di archiviazione. Ordina per sito Vuoi scaricare il file? -Correggi subito +Correggi Ricevi un avviso se una password è stata compromessa a causa di una violazione dei dati Se il problema persiste, scegli "Altri dettagli" di seguito per ottenere maggiori informazioni da . Per continuare, condividerà il tuo con questo sito. diff -Nru chromium-132.0.6834.110/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb --- chromium-132.0.6834.110/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -261,7 +261,7 @@ חלון ריק פעילות באינטרנט ובאפליקציות המדריך בנושא פרטיות -‏בעזרת הלחצן 'אפשרויות של Discover' ניתן לקבוע אילו מאמרים יוצגו +‏בעזרת הכפתור 'אפשרויות של Discover' ניתן לקבוע אילו מאמרים יוצגו תוקף הכרטיס פג ‏הסיסמאות שלך מוצפנות במכשיר לפני שהן נשמרות במנהל הסיסמאות של Google התאמה אישית של המידע שמשמש אתרים להצגת מודעות @@ -500,7 +500,7 @@ האם להוריד את התוכן? לא נמצאו תוצאות חיפוש שליחה למכשיר -תרגום הדפים באמצעות הלחצן 'אפשרויות נוספות' +תרגום הדפים באמצעות הכפתור 'אפשרויות נוספות' אפשר לחפש לפי אפליקציה, תאריך ועוד. לשנות את סיומת הקובץ? לא ניתן לבטל את המעקב. משהו השתבש. @@ -979,7 +979,7 @@ לאחר הכניסה לחשבון, הסימניות, הסיסמאות ונתונים נוספים יופיעו בכל המכשירים שלך הארגון שלך הפעיל את הגלישה הבטוחה אין סיסמאות שמורות -איתור הקבצים והדפים שלך ב'הורדות' דרך הלחצן 'אפשרויות נוספות' +איתור הקבצים והדפים שלך ב'הורדות' דרך הכפתור 'אפשרויות נוספות' ניהול התגובות שם: לא נקראו – זמינים במצב אופליין @@ -993,7 +993,7 @@ ‏מערכת Chrome לא יכולה לבדוק אם יש עדכונים שם הקובץ ארוך מדי ‏אתרים שנוספו לפני יותר מ-30 יום נמחקים מ-Chrome באופן אוטומטי. אתר שמבקרים בו פעם נוספת עשוי להופיע שוב ברשימה. אפשר גם לחסום את האפשרות של אתרים להציע מודעות. מידע נוסף על ניהול הפרטיות בפרסום ב-Chrome -דרך לחצן האפשרויות הנוספות אפשר לתרגם את הדף הזה לשפה כלשהי +דרך כפתור האפשרויות הנוספות אפשר לתרגם את הדף הזה לשפה כלשהי ‏Chrome יכול להגן עליך מפני פרצות באבטחת מידע, אתרים לא בטוחים וסכנות נוספות עליך לבדוק אם יש תמיכה בחשבון שנבחר. מעבר לכרטיסייה @@ -1675,7 +1675,7 @@ מארבעת השבועות האחרונים כאן יופיעו הכרטיסיות שפתוחות במכשירים אחרים שירותי מילוי אוטומטי -אפשר לעקוב אחר המחיר באמצעות לחצן האפשרויות הנוספות +אפשר לעקוב אחר המחיר באמצעות כפתור האפשרויות הנוספות קבוצת הכרטיסיות נמחקה שם בעל הכרטיס ‏כניסה ל-Chrome, סגור. @@ -1733,7 +1733,7 @@ ‏שולח ל-Google כתובות URL של חלק מהדפים שאליהם נכנסת, פרטים מוגבלים לגבי המערכת וחלק מתוכן הדפים. פעולה זו עוזרת לזהות איומים חדשים ולהגן על כל המשתמשים באינטרנט. שיתוף… אפשר לבצע סנכרון כדי להוסיף את הסימניות מהמכשירים האחרים שלך -כדי להשתמש בדפים במצב אופליין, אפשר להוריד אותם דרך הלחצן 'אפשרויות נוספות' +כדי להשתמש בדפים במצב אופליין, אפשר להוריד אותם דרך הכפתור 'אפשרויות נוספות' מידע נוסף מוכנה לשימוש ‏האם להסיר את הפעילות שלך ב-Chrome מ'שימוש חכם בדיגיטל'? diff -Nru chromium-132.0.6834.110/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb --- chromium-132.0.6834.110/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -1261,7 +1261,7 @@ ಟ್ಯಾಬ್‌ಗಳನ್ನು ಮುಚ್ಚಲಾಗಿದೆ {FILE_COUNT,plural, =1{ಆಡಿಯೋ ಫೈಲ್‌ಗಳು, ಪಟ್ಟಿಯಲ್ಲಿರುವ 1 ಆಡಿಯೋ ಫೈಲ್}one{ಆಡಿಯೋ ಫೈಲ್‌ಗಳು, ಪಟ್ಟಿಯಲ್ಲಿರುವ # ಆಡಿಯೋ ಫೈಲ್‌ಗಳು}other{ಆಡಿಯೋ ಫೈಲ್‌ಗಳು, ಪಟ್ಟಿಯಲ್ಲಿರುವ # ಆಡಿಯೋ ಫೈಲ್‌ಗಳು}} Google ನಿಂದ Discover - ಆಫ್ ಆಗಿದೆ -ಪಾಸ್‌ವರ್ಡ್ ಅಳಿಸುವುದೇ? +ಪಾಸ್‌ವರ್ಡ್ ಅಳಿಸಬೇಕೆ? ಚಿತ್ರ ಡೌನ್‌ಲೋಡ್ ಮಾಡಿ ಆ್ಯಪ್ ಫಿಲ್ಟರ್ ಶೀಟ್ ಸ್ವಯಂತುಂಬುವಿಕೆ ಫಾರ್ಮ್ ಡೇಟಾ diff -Nru chromium-132.0.6834.110/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb --- chromium-132.0.6834.110/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -493,7 +493,7 @@ Carregar imagem Mudamos a forma como as senhas neste dispositivo são salvas Pesquisa por voz -Fazer login no Google Chrome +Fazer login no Chrome {TAB_COUNT,plural, =1{, guia}one{, guia}other{, guias}} Seu histórico de navegação é mantido no seu dispositivo, e os relatórios são enviados com um atraso para proteger sua identidade Restaurar grupo , cor , como um novo grupo de guias em segundo plano. @@ -757,7 +757,7 @@ Sites Esta página off-line é de e pode ser diferente da versão on-line. Erro na Conta do Google -Verificações detalhadas de downloads suspeitos. +Faz verificações detalhadas de downloads suspeitos. Quando um site ou app pede para pré-carregar links anonimamente, o Chrome criptografa e pré-carrega as páginas pelos servidores do Google sem cookies. Isso oculta sua identidade do site pré-carregado. Suas listas de senhas salvas do Chrome e do foram fundidas. Você ainda pode preencher automaticamente todas as senhas salvas nos dois apps. Abrir @@ -1237,7 +1237,7 @@ Você pode consultar ou excluir as páginas visitadas do histórico Fazendo o download... É comum que os sites que você visita se lembrem dos seus interesses para personalizar a experiência. Os sites também podem armazenar informações sobre seus interesses com o Chrome. -Analisar os dados da sua conta +Analise os dados da sua conta Abrir rapidamente uma nova guia. Para editar este atalho, toque e pressione. Compartilhar feedback , . @@ -1398,7 +1398,7 @@ Usuário da Conta do Google Sim Sempre usar conexões seguras -Controlar como o histórico de navegação é usado para personalizar a Pesquisa e mais +Controle como o histórico de navegação é usado para personalizar a Pesquisa e mais Desativado pelo administrador Sair do Google Chrome Desconecta você da maioria dos sites, mas não da sua Conta do Google. @@ -1480,7 +1480,7 @@ Fechar Com base na legislação da sua região, é necessário definir um navegador e um mecanismo de pesquisa {PAYMENT_METHOD,plural, =1{\u2026 e mais }one{\u2026 e mais }other{\u2026 e mais }} -Quando sua conta está conectada, essa opção protege você nos Serviços do Google. +Protege você em todos os Serviços do Google quando sua conta está conectada. Volte mais tarde para ver novas matérias Adicionar guias restauradas diff -Nru chromium-132.0.6834.110/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb --- chromium-132.0.6834.110/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb 2025-01-27 17:37:37.000000000 +0000 @@ -211,7 +211,7 @@ Не удалось выполнить проверку личности Стандартная защита Обновите учетные данные -При удалении данных о работе в браузере вы не выйдете из аккаунта Google. Это потребуется сделать вручную. +Удаление данных о работе в браузере не приведет к выходу из аккаунта Google. Вы можете сделать это вручную. Сохранить Не удалять данные Дополнительные настройки diff -Nru chromium-132.0.6834.110/chrome/chrome_branch_deps.json chromium-132.0.6834.159/chrome/chrome_branch_deps.json --- chromium-132.0.6834.110/chrome/chrome_branch_deps.json 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chrome/chrome_branch_deps.json 2025-01-27 17:37:37.000000000 +0000 @@ -1,16 +1,19 @@ { - "src": "refs/branch-heads/6834_101", - "src:src/clank": "refs/heads/chromium/6834_101", - "src:src/components/optimization_guide/internal": "refs/heads/chromium/6834_101", - "src:src/internal": "refs/heads/chromium/6834_101", - "src:src/ios_internal": "refs/heads/chromium/6834_101", - "src:src/third_party/angle": "refs/heads/chromium/6834_101", - "src:src/third_party/dawn": "refs/heads/chromium/6834_101", - "src:src/third_party/devtools-frontend/src": "refs/heads/chromium/6834_101", - "src:src/third_party/instrumented_libs": "refs/heads/chromium/6834_101", - "src:src/third_party/openscreen/src": "refs/heads/chromium/6834_101", - "src:src/third_party/pdfium": "refs/heads/chromium/6834_101", - "src:src/third_party/vulkan-deps": "refs/heads/chromium/6834_101", - "src:src/third_party/webrtc": "refs/branch-heads/6834_101", - "src:src/v8": "refs/heads/chromium/6834_101" + "src": "refs/branch-heads/6834", + "src:src/clank": "refs/heads/chromium/6834", + "src:src/components/optimization_guide/internal": "refs/heads/chromium/6834", + "src:src/internal": "refs/heads/chromium/6834", + "src:src/ios_internal": "refs/heads/chromium/6834", + "src:src/third_party/angle": "refs/heads/chromium/6834", + "src:src/third_party/dawn": "refs/heads/chromium/6834", + "src:src/third_party/devtools-frontend-internal": "refs/heads/chromium/6834", + "src:src/third_party/devtools-frontend-internal:devtools-frontend": "refs/heads/chromium/6834", + "src:src/third_party/devtools-frontend/src": "refs/heads/chromium/6834", + "src:src/third_party/instrumented_libs": "refs/heads/chromium/6834", + "src:src/third_party/openscreen/src": "refs/heads/chromium/6834", + "src:src/third_party/pdfium": "refs/heads/chromium/6834", + "src:src/third_party/skia": "refs/heads/chrome/m132", + "src:src/third_party/vulkan-deps": "refs/heads/chromium/6834", + "src:src/third_party/webrtc": "refs/branch-heads/6834", + "src:src/v8": "refs/heads/chromium/6834" } diff -Nru chromium-132.0.6834.110/chromecast/DEPS chromium-132.0.6834.159/chromecast/DEPS --- chromium-132.0.6834.110/chromecast/DEPS 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/DEPS 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -# Do not add any includes under chrome/ anywhere in chromecast. - -include_rules = [ - # Chromecast code should explicitly declare its dependencies on each - # sub-directory within chromecast/. - "-chromecast", - - # Other Chromecast-wide dependencies. - "+chromecast/base", - "+chromecast/chromecast_buildflags.h", - "+chromecast/public", - "+third_party/boringssl/src/include", - "+third_party/widevine/cdm", -] diff -Nru chromium-132.0.6834.110/chromecast/DIR_METADATA chromium-132.0.6834.159/chromecast/DIR_METADATA --- chromium-132.0.6834.110/chromecast/DIR_METADATA 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/DIR_METADATA 1970-01-01 00:00:00.000000000 +0000 @@ -1,6 +0,0 @@ -monorail: { - component: "Chromecast" -} -buganizer_public: { - component_id: 1456570 -} diff -Nru chromium-132.0.6834.110/chromecast/OWNERS chromium-132.0.6834.159/chromecast/OWNERS --- chromium-132.0.6834.110/chromecast/OWNERS 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/OWNERS 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -set noparent - -antoniori@google.com -sandv@google.com -sanfin@chromium.org -vigeni@google.com -yucliu@chromium.org - -# Android -per-file *android*=file://chromecast/android/OWNERS -per-file *.java=file://chromecast/android/OWNERS - -# Fuchsia integration owners: -per-file ...fuchsia*=file://build/fuchsia/OWNERS - -# For major changes, please use one of the reviewers above! -dnicoara@chromium.org -spang@chromium.org -halliwell@chromium.org -seantopping@chromium.org diff -Nru chromium-132.0.6834.110/chromecast/README.md chromium-132.0.6834.159/chromecast/README.md --- chromium-132.0.6834.110/chromecast/README.md 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/README.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -# Cast base - -## cast_features - -This file contains tools for checking the feature state of all of the features -which affect Cast products. Cast features build upon -[the Chrome feature system](https://chromium.googlesource.com/chromium/src/+/main/base/feature_list.h). -Some aspects of Cast require the feature system to work differently, however, -so some additional logic has been layered on top. Details are available in -comments of the header file. The basics are: - - * If you are adding a new feature, add it to `cast_features.cc` so it lives - alongside existing features - * Add your new feature to the list of `kFeatures` in `cast_features.cc` - -```c++ -BASE_FEATURE(kMyFeature, "my_feature", base::FEATURE_DISABLED_BY_DEFAULT); - - -const base::Feature* kFeatures[] = { - // ..other features - &kMyFeature -} -``` diff -Nru chromium-132.0.6834.110/chromecast/activity/queryable_data_host.h chromium-132.0.6834.159/chromecast/activity/queryable_data_host.h --- chromium-132.0.6834.110/chromecast/activity/queryable_data_host.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/activity/queryable_data_host.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,28 +0,0 @@ -// Copyright 2019 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_ACTIVITY_QUERYABLE_DATA_HOST_H_ -#define CHROMECAST_ACTIVITY_QUERYABLE_DATA_HOST_H_ - -#include - -#include "base/values.h" - -namespace chromecast { - -// Sends queryable data to a host where it will be consumed. -// Either through to WebContents (non-fuchsia) or through FIDL to the -// Cast Runner (Fuchsia). -class QueryableDataHost { - public: - virtual ~QueryableDataHost() = default; - - // Send the queryable data entry |key|:|value| - virtual void SendQueryableValue(const std::string& key, - const base::Value& value) = 0; -}; - -} // namespace chromecast - -#endif // CHROMECAST_ACTIVITY_QUERYABLE_DATA_HOST_H_ diff -Nru chromium-132.0.6834.110/chromecast/android/DEPS chromium-132.0.6834.159/chromecast/android/DEPS --- chromium-132.0.6834.110/chromecast/android/DEPS 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/android/DEPS 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -include_rules = [ - "+chromecast/media/cma/backend", - "+jni", -] diff -Nru chromium-132.0.6834.110/chromecast/android/OWNERS chromium-132.0.6834.159/chromecast/android/OWNERS --- chromium-132.0.6834.110/chromecast/android/OWNERS 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/android/OWNERS 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ -sanfin@chromium.org -sandv@google.com -vigeni@google.com - -per-file lint-*.xml=* diff -Nru chromium-132.0.6834.110/chromecast/android/lint-baseline.xml chromium-132.0.6834.159/chromecast/android/lint-baseline.xml --- chromium-132.0.6834.110/chromecast/android/lint-baseline.xml 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/android/lint-baseline.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru chromium-132.0.6834.110/chromecast/android/lint-suppressions.xml chromium-132.0.6834.159/chromecast/android/lint-suppressions.xml --- chromium-132.0.6834.110/chromecast/android/lint-suppressions.xml 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/android/lint-suppressions.xml 1970-01-01 00:00:00.000000000 +0000 @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff -Nru chromium-132.0.6834.110/chromecast/app/DEPS chromium-132.0.6834.159/chromecast/app/DEPS --- chromium-132.0.6834.110/chromecast/app/DEPS 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/DEPS 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -include_rules = [ - "+chromecast/browser", - "+chromecast/common", - "+chromecast/crash", - "+chromecast/gpu", - "+chromecast/renderer", - "+components/crash", - "+components/prefs", - "+content/public/app", - "+content/public/browser", - "+content/public/common", - "+sandbox/policy", - "+ui/base", -] - -specific_include_rules = { - "cast_test_launcher\.cc": [ - "+content/public/test", - "+mojo/core/embedder/embedder.h", - ], -} diff -Nru chromium-132.0.6834.110/chromecast/app/android/DEPS chromium-132.0.6834.159/chromecast/app/android/DEPS --- chromium-132.0.6834.110/chromecast/app/android/DEPS 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/android/DEPS 1970-01-01 00:00:00.000000000 +0000 @@ -1,7 +0,0 @@ -include_rules = [ - "+chromecast/android", - "+chromecast/browser/android", - "+jni", - "+third_party/jni_zero", - "+components/prefs", -] diff -Nru chromium-132.0.6834.110/chromecast/app/android/OWNERS chromium-132.0.6834.159/chromecast/app/android/OWNERS --- chromium-132.0.6834.110/chromecast/app/android/OWNERS 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/android/OWNERS 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -file://chromecast/android/OWNERS diff -Nru chromium-132.0.6834.110/chromecast/app/android/cast_browser_module_entrypoint.cc chromium-132.0.6834.159/chromecast/app/android/cast_browser_module_entrypoint.cc --- chromium-132.0.6834.110/chromecast/app/android/cast_browser_module_entrypoint.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/android/cast_browser_module_entrypoint.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/android/jni_utils.h" -#include "chromecast/app/cast_main_delegate.h" -#include "content/public/app/content_main.h" -#include "content/public/browser/android/compositor.h" -#include "third_party/jni_zero/jni_zero.h" - -extern "C" { -// This JNI registration method is found and called by module framework code. -JNI_BOUNDARY_EXPORT bool JNI_OnLoad_cast_browser(JNIEnv* env) { - content::Compositor::Initialize(); - content::SetContentMainDelegate(new chromecast::shell::CastMainDelegate); - return true; -} -} // extern "C" diff -Nru chromium-132.0.6834.110/chromecast/app/android/cast_crash_reporter_client_android.cc chromium-132.0.6834.159/chromecast/app/android/cast_crash_reporter_client_android.cc --- chromium-132.0.6834.110/chromecast/app/android/cast_crash_reporter_client_android.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/android/cast_crash_reporter_client_android.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,86 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/app/android/cast_crash_reporter_client_android.h" - -#include "base/android/build_info.h" -#include "base/base_paths.h" -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/path_service.h" -#include "chromecast/base/cast_sys_info_android.h" -#include "chromecast/base/version.h" -#include "chromecast/common/global_descriptors.h" -#include "content/public/common/content_switches.h" - -namespace chromecast { - -CastCrashReporterClientAndroid::CastCrashReporterClientAndroid( - const std::string& process_type) - : process_type_(process_type) { -} - -CastCrashReporterClientAndroid::~CastCrashReporterClientAndroid() { -} - -void CastCrashReporterClientAndroid::GetProductNameAndVersion( - std::string* product_name, - std::string* version, - std::string* channel) { - *product_name = "media_shell"; - *version = CAST_BUILD_RELEASE "."; - *version += base::android::BuildInfo::GetInstance()->package_version_code(); -#if CAST_IS_DEBUG_BUILD() - *version += ".debug"; -#endif - CastSysInfoAndroid sys_info; - *channel = sys_info.GetSystemReleaseChannel(); -} - -base::FilePath CastCrashReporterClientAndroid::GetReporterLogFilename() { - return base::FilePath(FILE_PATH_LITERAL("uploads.log")); -} - -// static -bool CastCrashReporterClientAndroid::GetCrashReportsLocation( - const std::string& process_type, - base::FilePath* crash_dir) { - base::FilePath crash_dir_local; - if (!base::PathService::Get(base::DIR_ANDROID_APP_DATA, &crash_dir_local)) { - return false; - } - crash_dir_local = crash_dir_local.Append("crashes"); - - // Only try to create the directory in the browser process (empty value). - if (process_type.empty()) { - if (!base::DirectoryExists(crash_dir_local)) { - if (!base::CreateDirectory(crash_dir_local)) { - return false; - } - } - } - - // Provide value to crash_dir once directory is known to be a valid path. - *crash_dir = crash_dir_local; - return true; -} - -bool CastCrashReporterClientAndroid::GetCrashDumpLocation( - base::FilePath* crash_dir) { - base::FilePath app_data; - if (!base::PathService::Get(base::DIR_ANDROID_APP_DATA, &app_data)) { - return false; - } - - *crash_dir = app_data.Append("Crashpad"); - return true; -} - -bool CastCrashReporterClientAndroid::EnableBreakpadForProcess( - const std::string& process_type) { - return process_type == switches::kRendererProcess || - process_type == switches::kGpuProcess; -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/app/android/cast_crash_reporter_client_android.h chromium-132.0.6834.159/chromecast/app/android/cast_crash_reporter_client_android.h --- chromium-132.0.6834.110/chromecast/app/android/cast_crash_reporter_client_android.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/android/cast_crash_reporter_client_android.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_APP_ANDROID_CAST_CRASH_REPORTER_CLIENT_ANDROID_H_ -#define CHROMECAST_APP_ANDROID_CAST_CRASH_REPORTER_CLIENT_ANDROID_H_ - -#include - -#include "base/compiler_specific.h" -#include "components/crash/core/app/crash_reporter_client.h" - -namespace chromecast { - -class CastCrashReporterClientAndroid - : public crash_reporter::CrashReporterClient { - public: - explicit CastCrashReporterClientAndroid(const std::string& process_type); - - CastCrashReporterClientAndroid(const CastCrashReporterClientAndroid&) = - delete; - CastCrashReporterClientAndroid& operator=( - const CastCrashReporterClientAndroid&) = delete; - - ~CastCrashReporterClientAndroid() override; - - // Return the path to a directory of MIME-encoded crash reports. - static bool GetCrashReportsLocation(const std::string& process_type, - base::FilePath* crash_dir); - - // crash_reporter::CrashReporterClient implementation: - void GetProductNameAndVersion(std::string* product_name, - std::string* version, - std::string* channel) override; - base::FilePath GetReporterLogFilename() override; - bool GetCrashDumpLocation(base::FilePath* crash_dir) override; - bool EnableBreakpadForProcess(const std::string& process_type) override; - - private: - std::string process_type_; -}; - -} // namespace chromecast - -#endif // CHROMECAST_APP_ANDROID_CAST_CRASH_REPORTER_CLIENT_ANDROID_H_ diff -Nru chromium-132.0.6834.110/chromecast/app/android/cast_crash_uploader_android.cc chromium-132.0.6834.159/chromecast/app/android/cast_crash_uploader_android.cc --- chromium-132.0.6834.110/chromecast/app/android/cast_crash_uploader_android.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/android/cast_crash_uploader_android.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,129 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/app/android/cast_crash_uploader_android.h" - -#include -#include -#include -#include - -#include "base/android/java_exception_reporter.h" -#include "base/android/jni_android.h" -#include "base/android/jni_string.h" -#include "base/files/file_path.h" -#include "base/path_service.h" - -#include "base/command_line.h" -#include "base/logging.h" -#include "base/task/task_traits.h" -#include "base/task/thread_pool.h" -#include "chromecast/app/android/cast_crash_reporter_client_android.h" -#include "chromecast/base/cast_paths.h" -#include "chromecast/base/pref_names.h" -#include "components/crash/core/app/crash_reporter_client.h" -#include "components/crash/core/app/crashpad.h" -#include "components/crash/core/common/crash_key.h" -#include "content/public/common/content_switches.h" - -// Must come after all headers that specialize FromJniType() / ToJniType(). -#include "chromecast/browser/android/crash_handler_jni_headers/CastCrashHandler_jni.h" - -namespace chromecast { -// static -std::unique_ptr CastCrashUploader::Create( - PrefService* pref_service) { - const base::CommandLine* command_line(base::CommandLine::ForCurrentProcess()); - std::string process_type = - command_line->GetSwitchValueASCII(switches::kProcessType); - - base::FilePath log_file; - base::PathService::Get(FILE_CAST_ANDROID_LOG, &log_file); - - return std::make_unique( - std::move(process_type), std::move(log_file), pref_service); -} - -CastCrashUploaderAndroid::CastCrashUploaderAndroid( - const std::string process_type, - const base::FilePath log_file_path, - PrefService* pref_service) - : log_file_path_(log_file_path), - pref_service_(pref_service), - process_type_(process_type), - crash_reporter_client_(new CastCrashReporterClientAndroid(process_type)), - weak_factory_(this) { - crash_reporter::SetCrashReporterClient(crash_reporter_client_.get()); - crash_reporter::InitializeCrashpad(process_type_.empty(), process_type_); - crash_reporter::InitializeCrashKeys(); - base::android::InitJavaExceptionReporter(); - crash_reporter_runner_ = base::ThreadPool::CreateSequencedTaskRunner( - {base::MayBlock(), base::TaskPriority::BEST_EFFORT, - base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}); - StartPeriodicCrashReportUpload(); -} - -CastCrashUploaderAndroid::~CastCrashUploaderAndroid() = default; - -void CastCrashUploaderAndroid::UploadDumps( - const std::string& uuid, - const std::string& application_feedback, - const bool can_send_usage_stats) { - base::FilePath crash_dump_path; - if (!crash_reporter_client_->GetCrashDumpLocation(&crash_dump_path)) { - LOG(ERROR) << "Could not get crash dump location."; - return; - } - base::FilePath crash_reports_path; - if (!crash_reporter_client_->GetCrashReportsLocation(process_type_, - &crash_reports_path)) { - LOG(ERROR) << "Could not get crash report location."; - return; - } - - JNIEnv* env = base::android::AttachCurrentThread(); - base::android::ScopedJavaLocalRef crash_dump_path_java = - base::android::ConvertUTF8ToJavaString(env, crash_dump_path.value()); - base::android::ScopedJavaLocalRef reports_path_java = - base::android::ConvertUTF8ToJavaString(env, crash_reports_path.value()); - base::android::ScopedJavaLocalRef uuid_java = - base::android::ConvertUTF8ToJavaString(env, uuid); - base::android::ScopedJavaLocalRef application_feedback_java = - base::android::ConvertUTF8ToJavaString(env, application_feedback); - // TODO(servolk): Remove the UploadToStaging param and clean up Java code, if - // dev crash uploading to prod server works fine (b/113130776) - - if (can_send_usage_stats) { - Java_CastCrashHandler_uploadOnce(env, crash_dump_path_java, - reports_path_java, uuid_java, - application_feedback_java, - /* uploadCrashToStaging = */ false); - } else { - Java_CastCrashHandler_removeCrashDumps(env, crash_dump_path_java, - reports_path_java, uuid_java, - application_feedback_java, - /* uploadCrashToStaging = */ false); - } -} - -void CastCrashUploaderAndroid::StartPeriodicCrashReportUpload() { - OnStartPeriodicCrashReportUpload(); - crash_reporter_timer_ = std::make_unique(); - crash_reporter_timer_->Start( - FROM_HERE, base::Minutes(20), this, - &CastCrashUploaderAndroid::OnStartPeriodicCrashReportUpload); -} - -void CastCrashUploaderAndroid::OnStartPeriodicCrashReportUpload() { - crash_reporter_runner_->PostTask( - FROM_HERE, base::BindOnce(&CastCrashUploaderAndroid::UploadCrashReport, - weak_factory_.GetWeakPtr(), - pref_service_->GetBoolean(prefs::kOptInStats))); -} - -void CastCrashUploaderAndroid::UploadCrashReport(bool opt_in_stats) { - DCHECK(crash_reporter_runner_->RunsTasksInCurrentSequence()); - CastCrashUploaderAndroid::UploadDumps("", "", opt_in_stats); -} -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/app/android/cast_crash_uploader_android.h chromium-132.0.6834.159/chromecast/app/android/cast_crash_uploader_android.h --- chromium-132.0.6834.110/chromecast/app/android/cast_crash_uploader_android.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/android/cast_crash_uploader_android.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_APP_ANDROID_CAST_CRASH_UPLOADER_ANDROID_H_ -#define CHROMECAST_APP_ANDROID_CAST_CRASH_UPLOADER_ANDROID_H_ - -#include - -#include -#include - -#include "base/files/file_path.h" -#include "base/memory/weak_ptr.h" -#include "base/task/sequenced_task_runner.h" -#include "base/timer/timer.h" -#include "chromecast/app/cast_crash_uploader.h" -#include "components/prefs/pref_service.h" - -namespace chromecast { -class CastCrashReporterClientAndroid; - -class CastCrashUploaderAndroid : public CastCrashUploader { - public: - void UploadDumps(const std::string& uuid, - const std::string& application_feedback, - const bool can_send_usage_stats) override; - - CastCrashUploaderAndroid(const std::string process_type, - const base::FilePath log_file_path, - PrefService* pref_service); - ~CastCrashUploaderAndroid() override; - - private: - void StartPeriodicCrashReportUpload(); - void OnStartPeriodicCrashReportUpload(); - void UploadCrashReport(bool opt_in_stats); - - // Path to the current process's log file. - base::FilePath log_file_path_; - - PrefService* pref_service_; - - std::string process_type_; - scoped_refptr crash_reporter_runner_; - std::unique_ptr crash_reporter_timer_; - - std::unique_ptr crash_reporter_client_; - base::WeakPtrFactory weak_factory_; -}; - -} // namespace chromecast - -#endif // CHROMECAST_APP_ANDROID_CAST_CRASH_UPLOADER_ANDROID_H_ diff -Nru chromium-132.0.6834.110/chromecast/app/android/cast_jni_loader.cc chromium-132.0.6834.159/chromecast/app/android/cast_jni_loader.cc --- chromium-132.0.6834.110/chromecast/app/android/cast_jni_loader.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/android/cast_jni_loader.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/android/jni_android.h" -#include "base/android/library_loader/library_loader_hooks.h" -#include "base/functional/bind.h" -#include "chromecast/app/cast_main_delegate.h" -#include "content/public/app/content_jni_onload.h" -#include "content/public/app/content_main.h" -#include "content/public/browser/android/compositor.h" - -// This is called by the VM when the shared library is first loaded. -JNI_EXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) { - base::android::InitVM(vm); - if (!content::android::OnJNIOnLoadInit()) - return false; - - content::Compositor::Initialize(); - content::SetContentMainDelegate(new chromecast::shell::CastMainDelegate); - return JNI_VERSION_1_4; -} diff -Nru chromium-132.0.6834.110/chromecast/app/cast_crash_uploader.h chromium-132.0.6834.159/chromecast/app/cast_crash_uploader.h --- chromium-132.0.6834.110/chromecast/app/cast_crash_uploader.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/cast_crash_uploader.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_APP_CAST_CRASH_UPLOADER_H_ -#define CHROMECAST_APP_CAST_CRASH_UPLOADER_H_ - -#include - -#include "components/prefs/pref_service.h" - -namespace chromecast { -class CastCrashUploader { - public: - static std::unique_ptr Create(PrefService*); - virtual ~CastCrashUploader() = default; - - virtual void UploadDumps(const std::string& uuid, - const std::string& application_feedback, - const bool can_send_usage_stats) = 0; -}; -} // namespace chromecast - -#endif // CHROMECAST_APP_CAST_CRASH_UPLOADER_H_ diff -Nru chromium-132.0.6834.110/chromecast/app/cast_crash_uploader_default.cc chromium-132.0.6834.159/chromecast/app/cast_crash_uploader_default.cc --- chromium-132.0.6834.110/chromecast/app/cast_crash_uploader_default.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/cast_crash_uploader_default.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/app/cast_crash_uploader_default.h" -#include - -namespace chromecast { - -// static -std::unique_ptr CastCrashUploader::Create( - PrefService* pref_service) { - return std::make_unique(); -} -void CastCrashUploaderDefault::UploadDumps( - const std::string& uuid, - const std::string& application_feedback, - const bool can_send_usage_stats) { - NOTREACHED() << "TODO(b/258269114): Move non-android implementations of " - "crash reporting here."; -} -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/app/cast_crash_uploader_default.h chromium-132.0.6834.159/chromecast/app/cast_crash_uploader_default.h --- chromium-132.0.6834.110/chromecast/app/cast_crash_uploader_default.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/cast_crash_uploader_default.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,21 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_APP_CAST_CRASH_UPLOADER_DEFAULT_H_ -#define CHROMECAST_APP_CAST_CRASH_UPLOADER_DEFAULT_H_ - -#include "chromecast/app/cast_crash_uploader.h" -#include "components/prefs/pref_service.h" - -namespace chromecast { -class CastCrashUploaderDefault : public CastCrashUploader { - public: - static CastCrashUploader* Create(PrefService*); - void UploadDumps(const std::string& uuid, - const std::string& application_feedback, - const bool can_send_usage_stats) override; -}; -} // namespace chromecast - -#endif // CHROMECAST_APP_CAST_CRASH_UPLOADER_DEFAULT_H_ diff -Nru chromium-132.0.6834.110/chromecast/app/cast_main.cc chromium-132.0.6834.159/chromecast/app/cast_main.cc --- chromium-132.0.6834.110/chromecast/app/cast_main.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/cast_main.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/app/cast_main_delegate.h" -#include "content/public/app/content_main.h" - -int main(int argc, const char** argv) { - chromecast::shell::CastMainDelegate delegate; - content::ContentMainParams params(&delegate); - params.argc = argc; - params.argv = argv; - return content::ContentMain(std::move(params)); -} diff -Nru chromium-132.0.6834.110/chromecast/app/cast_main_delegate.cc chromium-132.0.6834.159/chromecast/app/cast_main_delegate.cc --- chromium-132.0.6834.110/chromecast/app/cast_main_delegate.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/cast_main_delegate.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,363 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/app/cast_main_delegate.h" - -#include -#include -#include -#include - -#include "base/command_line.h" -#include "base/cpu.h" -#include "base/debug/leak_annotations.h" -#include "base/files/file.h" -#include "base/files/file_enumerator.h" -#include "base/files/file_util.h" -#include "base/logging.h" -#include "base/metrics/field_trial.h" -#include "base/no_destructor.h" -#include "base/path_service.h" -#include "base/posix/global_descriptors.h" -#include "build/build_config.h" -#include "chromecast/base/cast_paths.h" -#include "chromecast/base/chromecast_switches.h" -#include "chromecast/base/process_types.h" -#include "chromecast/browser/cast_content_browser_client.h" -#include "chromecast/browser/cast_feature_list_creator.h" -#include "chromecast/chromecast_buildflags.h" -#include "chromecast/common/cast_resource_delegate.h" -#include "chromecast/common/global_descriptors.h" -#include "chromecast/gpu/cast_content_gpu_client.h" -#include "chromecast/renderer/cast_content_renderer_client.h" -#include "components/crash/core/app/crash_reporter_client.h" -#include "components/crash/core/common/crash_key.h" -#include "content/public/app/initialize_mojo_core.h" -#include "content/public/browser/browser_main_runner.h" -#include "content/public/common/content_switches.h" -#include "third_party/abseil-cpp/absl/types/variant.h" -#include "ui/base/resource/resource_bundle.h" - -#if BUILDFLAG(IS_ANDROID) -#include "base/android/apk_assets.h" -#include "chromecast/app/android/cast_crash_reporter_client_android.h" -#include "ui/base/resource/resource_bundle_android.h" -#elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) -#include "chromecast/app/linux/cast_crash_reporter_client.h" -#include "sandbox/policy/switches.h" -#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) - -namespace { - -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) -chromecast::CastCrashReporterClient* GetCastCrashReporter() { - static base::NoDestructor - crash_reporter_client; - return crash_reporter_client.get(); -} -#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) - -#if BUILDFLAG(IS_ANDROID) -const int kMaxCrashFiles = 10; -#endif // BUILDFLAG(IS_ANDROID) - -} // namespace - -namespace chromecast { -namespace shell { - -CastMainDelegate::CastMainDelegate() {} - -CastMainDelegate::~CastMainDelegate() {} - -std::optional CastMainDelegate::BasicStartupComplete() { - RegisterPathProvider(); - - logging::LoggingSettings settings; - settings.logging_dest = - logging::LOG_TO_SYSTEM_DEBUG_LOG | logging::LOG_TO_STDERR; - - const base::CommandLine* command_line(base::CommandLine::ForCurrentProcess()); - std::string process_type = - command_line->GetSwitchValueASCII(switches::kProcessType); - - // Must be created outside of the if scope below to avoid lifetime concerns. - std::string log_path_as_string; - if (command_line->HasSwitch(switches::kLogFile)) { - auto file_path = command_line->GetSwitchValuePath(switches::kLogFile); - DCHECK(!file_path.empty()); - log_path_as_string = file_path.value(); - - settings.logging_dest = logging::LOG_TO_ALL; - settings.log_file_path = log_path_as_string.c_str(); - settings.lock_log = logging::DONT_LOCK_LOG_FILE; - - // If this is the browser process, delete the old log file. Else, append to - // it. - settings.delete_old = process_type.empty() - ? logging::DELETE_OLD_LOG_FILE - : logging::APPEND_TO_OLD_LOG_FILE; - } - -#if BUILDFLAG(IS_ANDROID) - // Browser process logs are recorded for attaching with crash dumps. - if (process_type.empty()) { - base::FilePath log_file; - base::PathService::Get(FILE_CAST_ANDROID_LOG, &log_file); - settings.logging_dest = - logging::LOG_TO_SYSTEM_DEBUG_LOG | logging::LOG_TO_STDERR; - log_path_as_string = log_file.value(); - settings.log_file_path = log_path_as_string.c_str(); - settings.delete_old = logging::DELETE_OLD_LOG_FILE; - } -#endif // BUILDFLAG(IS_ANDROID) - logging::InitLogging(settings); -#if BUILDFLAG(IS_CAST_DESKTOP_BUILD) - logging::SetLogItems(true, true, true, false); -#else - // Timestamp available through logcat -v time. - logging::SetLogItems(true, true, false, false); -#endif // BUILDFLAG(IS_CAST_DESKTOP_BUILD) - -#if BUILDFLAG(IS_ANDROID) - // Only delete the old crash dumps if the current process is the browser - // process. Empty |process_type| signifies browser process. - if (process_type.empty()) { - // Get a listing of all of the crash dump files. - base::FilePath crash_directory; - if (CastCrashReporterClientAndroid::GetCrashReportsLocation( - process_type, &crash_directory)) { - base::FileEnumerator crash_directory_list(crash_directory, false, - base::FileEnumerator::FILES); - std::vector crash_files; - for (base::FilePath file = crash_directory_list.Next(); !file.empty(); - file = crash_directory_list.Next()) { - crash_files.push_back(file); - } - // Delete crash dumps except for the |kMaxCrashFiles| most recent ones. - if (crash_files.size() > kMaxCrashFiles) { - auto newest_first = - [](const base::FilePath& l, const base::FilePath& r) -> bool { - base::File::Info l_info, r_info; - base::GetFileInfo(l, &l_info); - base::GetFileInfo(r, &r_info); - return l_info.last_modified > r_info.last_modified; - }; - std::partial_sort(crash_files.begin(), - crash_files.begin() + kMaxCrashFiles, - crash_files.end(), newest_first); - for (auto file = crash_files.begin() + kMaxCrashFiles; - file != crash_files.end(); ++file) { - base::DeleteFile(*file); - } - } - } - } -#endif // BUILDFLAG(IS_ANDROID) - - if (settings.logging_dest & logging::LOG_TO_FILE) { - LOG(INFO) << "Logging to file: " << settings.log_file_path; - } - return std::nullopt; -} - -void CastMainDelegate::PreSandboxStartup() { -#if defined(ARCH_CPU_ARM_FAMILY) && \ - (BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) - // Create an instance of the CPU class to parse /proc/cpuinfo and cache the - // results. This data needs to be cached when file-reading is still allowed, - // since base::CPU expects to be callable later, when file-reading is no - // longer allowed. - base::CPU cpu_info; -#endif - - const base::CommandLine* command_line(base::CommandLine::ForCurrentProcess()); - std::string process_type = - command_line->GetSwitchValueASCII(switches::kProcessType); - - bool enable_crash_reporter = - !command_line->HasSwitch(switches::kDisableCrashReporter); - if (enable_crash_reporter) { - // TODO(crbug.com/40188745): Complete crash reporting integration on - // Fuchsia. -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) - crash_reporter::SetCrashReporterClient(GetCastCrashReporter()); - - if (process_type != switches::kZygoteProcess) { - CastCrashReporterClient::InitCrashReporter(process_type); - } - crash_reporter::InitializeCrashKeys(); -#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) - } - - InitializeResourceBundle(); -} - -absl::variant CastMainDelegate::RunProcess( - const std::string& process_type, - content::MainFunctionParams main_function_params) { -#if BUILDFLAG(IS_ANDROID) - if (!process_type.empty()) - return std::move(main_function_params); - - // Note: Android must handle running its own browser process. - // See ChromeMainDelegateAndroid::RunProcess. - browser_runner_ = content::BrowserMainRunner::Create(); - int exit_code = browser_runner_->Initialize(std::move(main_function_params)); - // On Android we do not run BrowserMain(), so the above initialization of a - // BrowserMainRunner is all we want to occur. Preserve any error codes > 0. - if (exit_code > 0) - return exit_code; - return 0; -#else - return std::move(main_function_params); -#endif // BUILDFLAG(IS_ANDROID) -} - -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) -void CastMainDelegate::ZygoteForked() { - const base::CommandLine* command_line(base::CommandLine::ForCurrentProcess()); - bool enable_crash_reporter = !command_line->HasSwitch( - switches::kDisableCrashReporter); - if (enable_crash_reporter) { - std::string process_type = - command_line->GetSwitchValueASCII(switches::kProcessType); - CastCrashReporterClient::InitCrashReporter(process_type); - } -} -#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) - -bool CastMainDelegate::ShouldCreateFeatureList(InvokedIn invoked_in) { - return absl::holds_alternative(invoked_in); -} - -bool CastMainDelegate::ShouldInitializeMojo(InvokedIn invoked_in) { - return ShouldCreateFeatureList(invoked_in); -} - -std::optional CastMainDelegate::PostEarlyInitialization( - InvokedIn invoked_in) { - if (ShouldCreateFeatureList(invoked_in)) { - // content is handling the feature list. - return std::nullopt; - } - - DCHECK(cast_feature_list_creator_); - -#if !BUILDFLAG(IS_ANDROID) - // PrefService requires the home directory to be created before the pref store - // can be initialized properly. - base::FilePath home_dir; - CHECK(base::PathService::Get(DIR_CAST_HOME, &home_dir)); - CHECK(base::CreateDirectory(home_dir)); -#endif // !BUILDFLAG(IS_ANDROID) - - // TODO(crbug.com/40791269): If we're able to create the MetricsStateManager - // earlier, clean up the below if and else blocks and call - // MetricsStateManager::InstantiateFieldTrialList(). - // - // The FieldTrialList is a dependency of the feature list. In tests, it is - // constructed as part of the test suite. - const auto* invoked_in_browser = - absl::get_if(&invoked_in); - if (invoked_in_browser && invoked_in_browser->is_running_test) { - DCHECK(base::FieldTrialList::GetInstance()); - } else { - // This is intentionally leaked since it needs to live for the duration of - // the browser process and there's no benefit to cleaning it up at exit. - base::FieldTrialList* leaked_field_trial_list = new base::FieldTrialList(); - ANNOTATE_LEAKING_OBJECT_PTR(leaked_field_trial_list); - std::ignore = leaked_field_trial_list; - } - - // Initialize the base::FeatureList and the PrefService (which it depends on), - // so objects initialized after this point can use features from - // base::FeatureList. - const base::CommandLine* command_line = - base::CommandLine::ForCurrentProcess(); - const bool use_browser_config = - command_line->HasSwitch(switches::kUseCastBrowserPrefConfig); - ProcessType process_type = use_browser_config ? ProcessType::kCastBrowser - : ProcessType::kCastService; - cast_feature_list_creator_->CreatePrefServiceAndFeatureList(process_type); - - content::InitializeMojoCore(); - - return std::nullopt; -} - -void CastMainDelegate::InitializeResourceBundle() { - base::FilePath pak_file; - CHECK(base::PathService::Get(FILE_CAST_PAK, &pak_file)); -#if BUILDFLAG(IS_ANDROID) - // On Android, the renderer runs with a different UID and can never access - // the file system. Use the file descriptor passed in at launch time. - auto* global_descriptors = base::GlobalDescriptors::GetInstance(); - int pak_fd = global_descriptors->MaybeGet(kAndroidPakDescriptor); - base::MemoryMappedFile::Region pak_region; - if (pak_fd >= 0) { - pak_region = global_descriptors->GetRegion(kAndroidPakDescriptor); - - base::File android_pak_file(pak_fd); - ui::ResourceBundle::InitSharedInstanceWithPakFileRegion( - android_pak_file.Duplicate(), pak_region); - ui::ResourceBundle::GetSharedInstance().AddDataPackFromFileRegion( - std::move(android_pak_file), pak_region, ui::k100Percent); - return; - } else { - pak_fd = base::android::OpenApkAsset("assets/cast_shell.pak", &pak_region); - // Loaded from disk for browsertests. - if (pak_fd < 0) { - int flags = base::File::FLAG_OPEN | base::File::FLAG_READ; - pak_fd = base::File(pak_file, flags).TakePlatformFile(); - pak_region = base::MemoryMappedFile::Region::kWholeFile; - } - DCHECK_GE(pak_fd, 0); - global_descriptors->Set(kAndroidPakDescriptor, pak_fd, pak_region); - } - - ui::SetLocalePaksStoredInApk(true); -#endif // BUILDFLAG(IS_ANDROID) - - resource_delegate_.reset(new CastResourceDelegate()); - // TODO(gunsch): Use LOAD_COMMON_RESOURCES once ResourceBundle no longer - // hardcodes resource file names. - ui::ResourceBundle::InitSharedInstanceWithLocale( - "en-US", resource_delegate_.get(), - ui::ResourceBundle::DO_NOT_LOAD_COMMON_RESOURCES); - -#if BUILDFLAG(IS_ANDROID) - ui::ResourceBundle::GetSharedInstance().AddDataPackFromFileRegion( - base::File(pak_fd), pak_region, ui::kScaleFactorNone); -#else - ui::ResourceBundle::GetSharedInstance().AddDataPackFromPath( - pak_file, ui::kScaleFactorNone); -#endif // BUILDFLAG(IS_ANDROID) -} - -content::ContentClient* CastMainDelegate::CreateContentClient() { - return &content_client_; -} - -content::ContentBrowserClient* CastMainDelegate::CreateContentBrowserClient() { - DCHECK(!cast_feature_list_creator_); - cast_feature_list_creator_ = std::make_unique(); - browser_client_ = - CastContentBrowserClient::Create(cast_feature_list_creator_.get()); - return browser_client_.get(); -} - -content::ContentGpuClient* CastMainDelegate::CreateContentGpuClient() { - gpu_client_ = CastContentGpuClient::Create(); - return gpu_client_.get(); -} - -content::ContentRendererClient* -CastMainDelegate::CreateContentRendererClient() { - renderer_client_ = CastContentRendererClient::Create(); - return renderer_client_.get(); -} - -} // namespace shell -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/app/cast_main_delegate.h chromium-132.0.6834.159/chromecast/app/cast_main_delegate.h --- chromium-132.0.6834.110/chromecast/app/cast_main_delegate.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/cast_main_delegate.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,75 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_APP_CAST_MAIN_DELEGATE_H_ -#define CHROMECAST_APP_CAST_MAIN_DELEGATE_H_ - -#include -#include - -#include "build/build_config.h" -#include "chromecast/common/cast_content_client.h" -#include "content/public/app/content_main_delegate.h" - -namespace content { -class BrowserMainRunner; -} // namespace content - -namespace chromecast { - -class CastResourceDelegate; -class CastFeatureListCreator; - -namespace shell { - -class CastContentBrowserClient; -class CastContentGpuClient; -class CastContentRendererClient; - -class CastMainDelegate : public content::ContentMainDelegate { - public: - CastMainDelegate(); - - CastMainDelegate(const CastMainDelegate&) = delete; - CastMainDelegate& operator=(const CastMainDelegate&) = delete; - - ~CastMainDelegate() override; - - // content::ContentMainDelegate implementation: - std::optional BasicStartupComplete() override; - void PreSandboxStartup() override; - absl::variant RunProcess( - const std::string& process_type, - content::MainFunctionParams main_function_params) override; -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) - void ZygoteForked() override; -#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) - bool ShouldCreateFeatureList(InvokedIn invoked_in) override; - bool ShouldInitializeMojo(InvokedIn invoked_in) override; - std::optional PostEarlyInitialization(InvokedIn invoked_in) override; - content::ContentClient* CreateContentClient() override; - content::ContentBrowserClient* CreateContentBrowserClient() override; - content::ContentGpuClient* CreateContentGpuClient() override; - content::ContentRendererClient* CreateContentRendererClient() override; - - private: - void InitializeResourceBundle(); - - std::unique_ptr browser_client_; - std::unique_ptr gpu_client_; - std::unique_ptr renderer_client_; - std::unique_ptr resource_delegate_; - CastContentClient content_client_; - -#if BUILDFLAG(IS_ANDROID) - std::unique_ptr browser_runner_; -#endif // BUILDFLAG(IS_ANDROID) - - std::unique_ptr cast_feature_list_creator_; -}; - -} // namespace shell -} // namespace chromecast - -#endif // CHROMECAST_APP_CAST_MAIN_DELEGATE_H_ diff -Nru chromium-132.0.6834.110/chromecast/app/cast_test_launcher.cc chromium-132.0.6834.159/chromecast/app/cast_test_launcher.cc --- chromium-132.0.6834.110/chromecast/app/cast_test_launcher.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/cast_test_launcher.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,66 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/command_line.h" -#include "base/system/sys_info.h" -#include "base/test/launcher/test_launcher.h" -#include "base/test/test_suite.h" -#include "build/build_config.h" -#include "chromecast/app/cast_main_delegate.h" -#include "content/public/browser/network_service_util.h" -#include "content/public/test/test_launcher.h" -#include "ipc/ipc_channel.h" -#include "mojo/core/embedder/embedder.h" - -#if BUILDFLAG(IS_WIN) -#include "base/win/win_util.h" -#endif // BUILDFLAG(IS_WIN) - -namespace chromecast { -namespace shell { - -class CastTestLauncherDelegate : public content::TestLauncherDelegate { - public: - CastTestLauncherDelegate() {} - - CastTestLauncherDelegate(const CastTestLauncherDelegate&) = delete; - CastTestLauncherDelegate& operator=(const CastTestLauncherDelegate&) = delete; - - ~CastTestLauncherDelegate() override {} - - int RunTestSuite(int argc, char** argv) override { - base::TestSuite test_suite(argc, argv); - // Browser tests are expected not to tear-down various globals . - test_suite.DisableCheckForLeakedGlobals(); - return test_suite.Run(); - } - - protected: -#if !BUILDFLAG(IS_ANDROID) - content::ContentMainDelegate* CreateContentMainDelegate() override { - return new CastMainDelegate(); - } -#endif // BUILDFLAG(IS_ANDROID) -}; - -} // namespace shell -} // namespace chromecast - -int main(int argc, char** argv) { - base::CommandLine::Init(argc, argv); - size_t parallel_jobs = base::NumParallelJobs(/*cores_per_job=*/2); - if (parallel_jobs == 0U) - return 1; - -#if BUILDFLAG(IS_WIN) - // Load and pin user32.dll to avoid having to load it once tests start while - // on the main thread loop where blocking calls are disallowed. - base::win::PinUser32(); -#endif // BUILDFLAG(IS_WIN) - - chromecast::shell::CastTestLauncherDelegate launcher_delegate; - mojo::core::Init(); - content::ForceInProcessNetworkService(); - return content::LaunchTests(&launcher_delegate, parallel_jobs, argc, argv); -} diff -Nru chromium-132.0.6834.110/chromecast/app/linux/cast_crash_reporter_client.cc chromium-132.0.6834.159/chromecast/app/linux/cast_crash_reporter_client.cc --- chromium-132.0.6834.110/chromecast/app/linux/cast_crash_reporter_client.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/linux/cast_crash_reporter_client.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,68 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/app/linux/cast_crash_reporter_client.h" - -#include "base/time/time.h" -#include "chromecast/base/error_codes.h" -#include "chromecast/crash/linux/crash_util.h" -#include "components/crash/core/app/breakpad_linux.h" -#include "content/public/common/content_switches.h" -#include "sandbox/policy/switches.h" - -namespace chromecast { - -namespace { - -uint64_t g_process_start_time_ms = 0u; - -} // namespace - -// static -void CastCrashReporterClient::InitCrashReporter( - const std::string& process_type) { - DCHECK(!g_process_start_time_ms); - g_process_start_time_ms = - (base::TimeTicks::Now() - base::TimeTicks()).InMilliseconds(); - - // Start up breakpad for this process, if applicable. - breakpad::InitCrashReporter(process_type); -} - -// static -uint64_t CastCrashReporterClient::GetProcessStartTime() { - return g_process_start_time_ms; -} - -CastCrashReporterClient::CastCrashReporterClient() {} - -CastCrashReporterClient::~CastCrashReporterClient() {} - -bool CastCrashReporterClient::EnableBreakpadForProcess( - const std::string& process_type) { - return process_type == switches::kRendererProcess || - process_type == switches::kZygoteProcess || - process_type == switches::kGpuProcess || - process_type == switches::kUtilityProcess; -} - -bool CastCrashReporterClient::HandleCrashDump(const char* crashdump_filename, - uint64_t crash_pid) { - // Set the initial error code to ERROR_WEB_CONTENT_RENDER_VIEW_GONE to show - // an error message on next cast_shell run. Though the error code is for - // renderer process crash, the actual messages can be used for browser process - // as well. - SetInitialErrorCode(ERROR_WEB_CONTENT_RENDER_VIEW_GONE); - - // Upload crash dump. If user didn't opt-in crash report, minidump writer - // instantiated within CrashUtil::RequestUploadCrashDump() does nothing. - CrashUtil::RequestUploadCrashDump(crashdump_filename, crash_pid, - GetProcessStartTime()); - - // Always return true to indicate that this crash dump has been processed, - // so that it won't fallback to use chrome's default uploader. - return true; -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/app/linux/cast_crash_reporter_client.h chromium-132.0.6834.159/chromecast/app/linux/cast_crash_reporter_client.h --- chromium-132.0.6834.110/chromecast/app/linux/cast_crash_reporter_client.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/linux/cast_crash_reporter_client.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,38 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_APP_LINUX_CAST_CRASH_REPORTER_CLIENT_H_ -#define CHROMECAST_APP_LINUX_CAST_CRASH_REPORTER_CLIENT_H_ - -#include - -#include - -#include "components/crash/core/app/crash_reporter_client.h" - -namespace chromecast { - -class CastCrashReporterClient : public crash_reporter::CrashReporterClient { - public: - static void InitCrashReporter(const std::string& process_type); - - CastCrashReporterClient(); - - CastCrashReporterClient(const CastCrashReporterClient&) = delete; - CastCrashReporterClient& operator=(const CastCrashReporterClient&) = delete; - - ~CastCrashReporterClient() override; - - // crash_reporter::CrashReporterClient implementation: - bool EnableBreakpadForProcess(const std::string& process_type) override; - bool HandleCrashDump(const char* crashdump_filename, - uint64_t crash_pid) override; - - private: - static uint64_t GetProcessStartTime(); -}; - -} // namespace chromecast - -#endif // CHROMECAST_APP_LINUX_CAST_CRASH_REPORTER_CLIENT_H_ diff -Nru chromium-132.0.6834.110/chromecast/app/linux/cast_crash_reporter_client_unittest.cc chromium-132.0.6834.159/chromecast/app/linux/cast_crash_reporter_client_unittest.cc --- chromium-132.0.6834.110/chromecast/app/linux/cast_crash_reporter_client_unittest.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/linux/cast_crash_reporter_client_unittest.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,152 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include -#include - -#include "base/base_paths.h" -#include "base/files/file.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/functional/bind.h" -#include "base/test/scoped_path_override.h" -#include "base/threading/scoped_blocking_call.h" -#include "base/threading/thread_restrictions.h" -#include "base/values.h" -#include "chromecast/app/linux/cast_crash_reporter_client.h" -#include "chromecast/base/scoped_temp_file.h" -#include "chromecast/crash/app_state_tracker.h" -#include "chromecast/crash/linux/crash_testing_utils.h" -#include "chromecast/crash/linux/crash_util.h" -#include "chromecast/crash/linux/dump_info.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace chromecast { -namespace { - -const char kFakeDumpstateContents[] = "Dumpstate Contents\nDumpdumpdumpdump\n"; -const char kFakeMinidumpContents[] = "Minidump Contents\nLine1\nLine2\n"; - -int WriteFakeDumpStateFile(const std::string& path) { - // Append the correct extension and write the data to file. - base::File dumpstate(base::FilePath(path).AddExtension(".txt.gz"), - base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE); - dumpstate.Write( - 0, kFakeDumpstateContents, sizeof(kFakeDumpstateContents) - 1); - return 0; -} - -} // namespace - -class CastCrashReporterClientTest : public testing::Test { - public: - CastCrashReporterClientTest(const CastCrashReporterClientTest&) = delete; - CastCrashReporterClientTest& operator=(const CastCrashReporterClientTest&) = - delete; - - protected: - CastCrashReporterClientTest() {} - ~CastCrashReporterClientTest() override {} - - static void SetUpTestCase() { - // Set a callback to be used in place of the |dumpstate| executable. - CrashUtil::SetDumpStateCbForTest(base::BindOnce(&WriteFakeDumpStateFile)); - } - - // testing::Test implementation: - void SetUp() override { - // Override the $HOME path. - ASSERT_TRUE(fake_home_dir_.CreateUniqueTempDir()); - home_override_.reset( - new base::ScopedPathOverride(base::DIR_HOME, home_path())); - - // "Launch" YouTube. - AppStateTracker::SetLastLaunchedApp("youtube"); - AppStateTracker::SetCurrentApp("youtube"); - - // "Launch" and switch to Pandora. - AppStateTracker::SetLastLaunchedApp("pandora"); - AppStateTracker::SetCurrentApp("pandora"); - - // "Launch" Netflix. - AppStateTracker::SetLastLaunchedApp("netflix"); - // Netflix crashed. - - // A minidump file is written. - minidump_.Write(kFakeMinidumpContents); - } - - void TearDown() override { - // Assert that the original file has been moved. - ASSERT_FALSE(base::PathExists(minidump_path())); - - // Assert that the file has been moved to "minidumps", with the expected - // contents. - std::string contents; - base::FilePath new_minidump = - home_path().Append("minidumps").Append(minidump_path().BaseName()); - ASSERT_TRUE(base::PathExists(new_minidump)); - ASSERT_TRUE(base::ReadFileToString(new_minidump, &contents)); - ASSERT_EQ(kFakeMinidumpContents, contents); - - // Assert that the dumpstate file has been written with the expected - // contents. - base::FilePath dumpstate = new_minidump.AddExtension(".txt.gz"); - ASSERT_TRUE(base::PathExists(dumpstate)); - ASSERT_TRUE(base::ReadFileToString(dumpstate, &contents)); - ASSERT_EQ(kFakeDumpstateContents, contents); - - // Assert that the lockfile has logged the correct information. - base::FilePath lockfile = - home_path().Append("minidumps").Append("lockfile"); - ASSERT_TRUE(base::PathExists(lockfile)); - std::vector> dumps; - ASSERT_TRUE(FetchDumps(lockfile.value(), &dumps)); - ASSERT_EQ(1u, dumps.size()); - - const DumpInfo& dump_info = *(dumps[0]); - ASSERT_TRUE(dump_info.valid()); - EXPECT_EQ(new_minidump.value(), dump_info.crashed_process_dump()); - EXPECT_EQ(dumpstate.value(), dump_info.logfile()); - EXPECT_EQ("youtube", dump_info.params().previous_app_name); - EXPECT_EQ("pandora", dump_info.params().current_app_name); - EXPECT_EQ("netflix", dump_info.params().last_app_name); - } - - base::FilePath minidump_path() { return minidump_.path(); } - base::FilePath home_path() { return fake_home_dir_.GetPath(); } - - private: - base::ScopedTempDir fake_home_dir_; - ScopedTempFile minidump_; - std::unique_ptr home_override_; -}; - -TEST_F(CastCrashReporterClientTest, EndToEndTestOnIORestrictedThread) { - // Handle a "crash" on an IO restricted thread. - base::ScopedDisallowBlocking disallow_blocking; - CastCrashReporterClient client; - ASSERT_TRUE(client.HandleCrashDump(minidump_path().value().c_str(), 0)); -} - -TEST_F(CastCrashReporterClientTest, EndToEndTestOnNonIORestrictedThread) { - { - // ScopedBlockingCall will DCHECK if blocking isn't allowed at the beginning - // of this test. - base::ScopedBlockingCall test_blocking_allowed( - FROM_HERE, base::BlockingType::WILL_BLOCK); - } - - // Handle a crash on a non-IO restricted thread. - CastCrashReporterClient client; - ASSERT_TRUE(client.HandleCrashDump(minidump_path().value().c_str(), 0)); - - // Assert that the thread is not IO restricted when the function exits. - { - base::ScopedBlockingCall test_blocking_allowed( - FROM_HERE, base::BlockingType::WILL_BLOCK); - } -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_am.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_am.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_am.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_am.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -am,en-GB,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_ar.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ar.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_ar.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ar.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -ar,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_bg.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_bg.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_bg.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_bg.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -bg-BG,bg - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_bn.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_bn.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_bn.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_bn.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -bn-IN,bn,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_ca.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ca.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_ca.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ca.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -ca-ES,ca - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_cs.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_cs.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_cs.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_cs.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -cs-CZ,cs - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_da.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_da.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_da.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_da.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -da-DK,da,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_de.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_de.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_de.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_de.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -de-DE,de,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_el.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_el.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_el.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_el.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -el-GR,el - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_en-GB.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_en-GB.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_en-GB.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_en-GB.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -en-GB,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_es-419.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_es-419.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_es-419.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_es-419.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -es-419,es - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_es.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_es.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_es.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_es.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -es-ES,es - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_et.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_et.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_et.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_et.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -et-EE,et,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_fa.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_fa.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_fa.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_fa.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -fa,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_fi.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_fi.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_fi.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_fi.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -fi-FI,fi,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_fil.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_fil.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_fil.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_fil.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -fil,fil-PH,tl,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_fr.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_fr.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_fr.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_fr.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -fr-FR,fr,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_gu.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_gu.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_gu.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_gu.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -gu-IN,gu,hi-IN,hi,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_he.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_he.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_he.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_he.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -he-IL,he,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_hi.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_hi.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_hi.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_hi.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -hi-IN,hi,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_hr.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_hr.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_hr.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_hr.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -hr-HR,hr,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_hu.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_hu.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_hu.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_hu.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -hu-HU,hu,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_id.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_id.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_id.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_id.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -id-ID,id,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_it.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_it.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_it.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_it.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -it-IT,it,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_ja.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ja.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_ja.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ja.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -ja,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_kn.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_kn.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_kn.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_kn.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -kn-IN,kn,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_ko.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ko.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_ko.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ko.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -ko-KR,ko,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_lt.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_lt.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_lt.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_lt.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -lt,en-US,en,ru,pl - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_lv.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_lv.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_lv.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_lv.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -lv-LV,lv,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_ml.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ml.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_ml.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ml.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -ml-IN,ml,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_mr.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_mr.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_mr.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_mr.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -mr-IN,mr,hi-IN,hi,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_ms.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ms.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_ms.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ms.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -ms-MY,ms,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_nb.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_nb.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_nb.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_nb.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -nb-NO,nb,no,nn,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_nl.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_nl.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_nl.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_nl.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -nl-NL,nl,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_pl.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_pl.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_pl.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_pl.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -pl-PL,pl,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_pt-BR.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_pt-BR.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_pt-BR.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_pt-BR.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -pt-BR,pt,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_pt-PT.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_pt-PT.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_pt-PT.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_pt-PT.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -pt-PT,pt,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_ro.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ro.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_ro.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ro.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -ro-RO,ro,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_ru.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ru.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_ru.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ru.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -ru-RU,ru,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_sk.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_sk.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_sk.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_sk.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -sk-SK,sk,cs,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_sl.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_sl.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_sl.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_sl.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -sl-SI,sl,en-GB,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_sr.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_sr.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_sr.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_sr.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -sr-RS,sr,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_sv.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_sv.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_sv.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_sv.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -sv-SE,sv,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_sw.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_sw.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_sw.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_sw.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -sw,en-GB,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_ta.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ta.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_ta.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_ta.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -ta-IN,ta,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_te.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_te.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_te.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_te.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -te-IN,te,hi-IN,hi,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_th.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_th.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_th.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_th.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -th-TH,th - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_tr.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_tr.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_tr.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_tr.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -tr-TR,tr,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_uk.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_uk.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_uk.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_uk.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -uk-UA,uk,ru,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_vi.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_vi.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_vi.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_vi.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -vi-VN,vi,fr-FR,fr,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_zh-CN.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_zh-CN.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_zh-CN.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_zh-CN.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -zh-CN,zh - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_zh-TW.xtb chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_zh-TW.xtb --- chromium-132.0.6834.110/chromecast/app/resources/chromecast_settings_zh-TW.xtb 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/chromecast_settings_zh-TW.xtb 1970-01-01 00:00:00.000000000 +0000 @@ -1,5 +0,0 @@ - - - -zh-TW,zh,en-US,en - diff -Nru chromium-132.0.6834.110/chromecast/app/resources/shell_devtools_discovery_page.html chromium-132.0.6834.159/chromecast/app/resources/shell_devtools_discovery_page.html --- chromium-132.0.6834.110/chromecast/app/resources/shell_devtools_discovery_page.html 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/resources/shell_devtools_discovery_page.html 1970-01-01 00:00:00.000000000 +0000 @@ -1,57 +0,0 @@ - - -Cast shell remote debugging - - - - -
Inspectable WebContents
-
- - - -

Help

-
- You may have to select the shield icon in the address bar to establish a connection. - See the help - center for more information. -
- - - Binary files /srv/release.debian.org/tmp/3jM8HqcW1Y/chromium-132.0.6834.110/chromecast/app/resources/shell_speaker_icon.png and /srv/release.debian.org/tmp/KMaXv81MMw/chromium-132.0.6834.159/chromecast/app/resources/shell_speaker_icon.png differ diff -Nru chromium-132.0.6834.110/chromecast/app/verify_cast_locales.py chromium-132.0.6834.159/chromecast/app/verify_cast_locales.py --- chromium-132.0.6834.110/chromecast/app/verify_cast_locales.py 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/app/verify_cast_locales.py 1970-01-01 00:00:00.000000000 +0000 @@ -1,61 +0,0 @@ -#!/usr/bin/env python -# Copyright 2017 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -"""Ensures that Chromecast developers are notified of locale changes.""" - -from __future__ import print_function - -import argparse -import sys - -CAST_LOCALES = [ - 'am', 'ar', 'bg', 'bn', 'ca', 'cs', 'da', 'de', 'el', 'en-GB', 'en-US', - 'es-419', 'es', 'et', 'fa', 'fi', 'fil', 'fr', 'gu', 'he', 'hi', 'hr', 'hu', - 'id', 'it', 'ja', 'kn', 'ko', 'lt', 'lv', 'ml', 'mr', 'ms', 'nb', 'nl', - 'pl', 'pt-BR', 'pt-PT', 'ro', 'ru', 'sk', 'sl', 'sr', 'sv', 'sw', 'ta', - 'te', 'th', 'tr', 'uk', 'vi', 'zh-CN', 'zh-TW' -] - -SUCCESS_RETURN_CODE = 0 -FAILURE_RETURN_CODE = 1 - - -# Chromecast OWNERS need to know if the list of locales used in -# //build/config/locales.gni changes, so that the Chromecast build process -# can be updated accordingly when it does. -# -# This script runs a check to verify that the list of locales maintained in GN -# matches CAST_LOCALES above. If a CL changes that list, it must also change -# CAST_LOCALES in this file to make the Cast trybot pass. This change will -# require adding a //chromecast OWNER to the change, keeping the team aware of -# any locale changes. -def main(): - parser = argparse.ArgumentParser() - parser.add_argument('locales', type=str, nargs='+', - help='Locales from the GN locale list') - parser.add_argument('--stamp-file', '-s', type=str, required=True, - help='The script will stamp this file if successful.') - args = parser.parse_args() - - if set(CAST_LOCALES) == set(args.locales): - open(args.stamp_file, 'w') - return SUCCESS_RETURN_CODE - - # The lists do not match. Compute the difference and log it to the developer. - removed_locales = set(CAST_LOCALES) - set(args.locales) - added_locales = set(args.locales) - set(CAST_LOCALES) - - print('CAST_LOCALES no longer matches the locales list from GN!') - if removed_locales: - print('These locales have been removed: {}'.format(list(removed_locales))) - if added_locales: - print('These locales have been added: {}'.format(list(added_locales))) - print(('Please update CAST_LOCALES in {file} and add a reviewer from ' - '//chromecast/OWNERS to your CL. ').format(file=__file__)) - return FAILURE_RETURN_CODE - - -if __name__ == '__main__': - sys.exit(main()) diff -Nru chromium-132.0.6834.110/chromecast/base/DEPS chromium-132.0.6834.159/chromecast/base/DEPS --- chromium-132.0.6834.110/chromecast/base/DEPS 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/DEPS 1970-01-01 00:00:00.000000000 +0000 @@ -1,4 +0,0 @@ -include_rules = [ - "+chromecast/base/jni_headers", - "+chromecast/browser/jni_headers", -] diff -Nru chromium-132.0.6834.110/chromecast/base/OWNERS chromium-132.0.6834.159/chromecast/base/OWNERS --- chromium-132.0.6834.110/chromecast/base/OWNERS 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/OWNERS 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -per-file BUILD.gn=file://chromecast/android/OWNERS diff -Nru chromium-132.0.6834.110/chromecast/base/alarm_manager.cc chromium-132.0.6834.159/chromecast/base/alarm_manager.cc --- chromium-132.0.6834.110/chromecast/base/alarm_manager.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/alarm_manager.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,104 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/alarm_manager.h" - -#include - -#include "base/check.h" -#include "base/functional/bind.h" -#include "base/task/single_thread_task_runner.h" -#include "base/time/clock.h" -#include "base/time/default_clock.h" - -#define MAKE_SURE_OWN_THREAD(callback, ...) \ - if (!task_runner_->BelongsToCurrentThread()) { \ - task_runner_->PostTask( \ - FROM_HERE, base::BindOnce(&AlarmManager::callback, \ - weak_factory_.GetWeakPtr(), ##__VA_ARGS__)); \ - return; \ - } - -namespace chromecast { - -namespace { -int kClockPollInterval = 5; - -void VerifyHandleCallback(base::OnceClosure task, - base::WeakPtr handle) { - if (!handle.get()) { - return; - } - std::move(task).Run(); -} -} // namespace - -AlarmHandle::AlarmHandle() = default; -AlarmHandle::~AlarmHandle() = default; - -AlarmManager::AlarmInfo::AlarmInfo( - base::OnceClosure task, - base::Time time, - scoped_refptr task_runner) - : task_(std::move(task)), - time_(time), - task_runner_(std::move(task_runner)) {} - -AlarmManager::AlarmInfo::~AlarmInfo() {} - -void AlarmManager::AlarmInfo::PostTask() { - task_runner_->PostTask(FROM_HERE, std::move(task_)); -} - -AlarmManager::AlarmManager( - const base::Clock* clock, - scoped_refptr task_runner) - : clock_(clock), - task_runner_(std::move(task_runner)), - weak_factory_(this) { - DCHECK(clock_); - DCHECK(task_runner_); - clock_tick_timer_.SetTaskRunner(task_runner_); - base::TimeDelta polling_frequency = base::Seconds(kClockPollInterval); - clock_tick_timer_.Start(FROM_HERE, polling_frequency, - base::BindRepeating(&AlarmManager::CheckAlarm, - weak_factory_.GetWeakPtr())); -} - -AlarmManager::AlarmManager() - : AlarmManager(base::DefaultClock::GetInstance(), - base::SingleThreadTaskRunner::GetCurrentDefault()) {} - -AlarmManager::~AlarmManager() {} - -std::unique_ptr AlarmManager::PostAlarmTask(base::OnceClosure task, - base::Time time) { - DCHECK(task); - std::unique_ptr handle = std::make_unique(); - AddAlarm(base::BindOnce(&VerifyHandleCallback, std::move(task), - handle->AsWeakPtr()), - time, base::SingleThreadTaskRunner::GetCurrentDefault()); - return handle; -} - -void AlarmManager::AddAlarm( - base::OnceClosure task, - base::Time time, - scoped_refptr task_runner) { - MAKE_SURE_OWN_THREAD(AddAlarm, std::move(task), time, std::move(task_runner)); - next_alarm_.push(std::make_unique(std::move(task), time, - std::move(task_runner))); -} - -void AlarmManager::CheckAlarm() { - DCHECK(task_runner_->BelongsToCurrentThread()); - base::Time now = clock_->Now(); - // Fire appropriate alarms. - while (!next_alarm_.empty() && now >= next_alarm_.top()->time()) { - next_alarm_.top()->PostTask(); - next_alarm_.pop(); - } -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/alarm_manager.h chromium-132.0.6834.159/chromecast/base/alarm_manager.h --- chromium-132.0.6834.110/chromecast/base/alarm_manager.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/alarm_manager.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,132 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_ALARM_MANAGER_H_ -#define CHROMECAST_BASE_ALARM_MANAGER_H_ - -#include -#include -#include - -#include "base/functional/callback.h" -#include "base/memory/raw_ptr.h" -#include "base/memory/ref_counted.h" -#include "base/memory/weak_ptr.h" -#include "base/time/time.h" -#include "base/timer/timer.h" - -namespace base { -class Clock; -class SingleThreadTaskRunner; -} - -namespace chromecast { - -// Alarm handle for scoping the in-flight alarm. -class AlarmHandle final { - public: - AlarmHandle(); - ~AlarmHandle(); - - base::WeakPtr AsWeakPtr() { - return weak_ptr_factory_.GetWeakPtr(); - } - - private: - base::WeakPtrFactory weak_ptr_factory_{this}; -}; - -// Alarm manager allows setting a task for wall clock time rather than for an -// elapsed amount of time. This is different from using long PostDelayedTasks -// that are sensitive to time changes, clock drift, and other factors. -// -// Alarm manager polls the wall clock time every 5 seconds. If the clock is -// equal or past the requested time, the alarm will fire. -class AlarmManager { - public: - // Construct and start the alarm manager. The clock poller will run on the - // caller's thread. - AlarmManager(); - - AlarmManager(const AlarmManager&) = delete; - AlarmManager& operator=(const AlarmManager&) = delete; - - ~AlarmManager(); - - // For testing only. Allows setting a fake clock and using a custom task - // runner. - AlarmManager(const base::Clock* clock, - scoped_refptr task_runner); - - // Add an alarm. - // |task| will be executed at around |time|. - // Returns an AlarmHandle that must be kept alive. If the AlarmHandle is - // destroyed, the alarm will not fire. - // - // Any thread can add alarms. The alarm will be fired on the original - // thread used to set the alarm. - // - // When an alarm is added to the alarm manager, the task is guaranteed to not - // run before the clock passes the requested time. The task may not run even - // if it is past the requested time if the software is suspended. However, - // once woken up, the event will fire within 5 seconds if the target time has - // passed. - [[nodiscard]] std::unique_ptr PostAlarmTask( - base::OnceClosure task, - base::Time time); - - private: - class AlarmInfo { - public: - AlarmInfo(base::OnceClosure task, - base::Time time, - scoped_refptr task_runner); - - AlarmInfo(const AlarmInfo&) = delete; - AlarmInfo& operator=(const AlarmInfo&) = delete; - - ~AlarmInfo(); - - void PostTask(); - - base::Time time() const { return time_; } - - private: - base::OnceClosure task_; - const base::Time time_; - const scoped_refptr task_runner_; - }; - - // Check if an alarm should fire. - void CheckAlarm(); - // Add the alarm to the queue. - void AddAlarm(base::OnceClosure task, - base::Time time, - scoped_refptr task_runner); - - // Ordering alarms by earliest time. - struct alarm_compare { - bool operator()(const std::unique_ptr& lhs, - const std::unique_ptr& rhs) const { - return lhs->time() > rhs->time(); - } - }; - - // Store a list of the alarms to fire with the earliest getting priority. - std::priority_queue, - std::vector>, - alarm_compare> - next_alarm_; - - // Poller for wall clock time. - const raw_ptr clock_; - base::RepeatingTimer clock_tick_timer_; - scoped_refptr task_runner_; - - base::WeakPtrFactory weak_factory_; -}; - -} // namespace chromecast - -#endif // CHROMECAST_BASE_ALARM_MANAGER_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/alarm_manager_unittest.cc chromium-132.0.6834.159/chromecast/base/alarm_manager_unittest.cc --- chromium-132.0.6834.110/chromecast/base/alarm_manager_unittest.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/alarm_manager_unittest.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,497 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/alarm_manager.h" - -#include -#include - -#include "base/functional/bind.h" -#include "base/task/single_thread_task_runner.h" -#include "base/test/simple_test_clock.h" -#include "base/test/task_environment.h" -#include "base/time/clock.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace chromecast { - -class AlarmManagerTest : public ::testing::Test { - protected: - class WallClockDependantTask { - public: - WallClockDependantTask() : fired_(false), weak_factory_(this) {} - base::WeakPtr GetWeakPtr() { - return weak_factory_.GetWeakPtr(); - } - void OnAlarmFire() { fired_ = true; } - bool fired_; - base::WeakPtrFactory weak_factory_; - }; - - base::test::SingleThreadTaskEnvironment task_environment_{ - base::test::TaskEnvironment::TimeSource::MOCK_TIME}; -}; - -TEST_F(AlarmManagerTest, AlarmNotFire) { - WallClockDependantTask task; - ASSERT_FALSE(task.fired_); - - // Create the AlarmManager. - base::Time now = base::Time::Now(); - std::unique_ptr test_clock = - std::make_unique(); - test_clock->SetNow(now); - base::SimpleTestClock* clock = test_clock.get(); - std::unique_ptr manager = std::make_unique( - clock, base::SingleThreadTaskRunner::GetCurrentDefault()); - - base::Time alarm_time = now + base::Minutes(10); - std::unique_ptr handle(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task.GetWeakPtr()), - alarm_time)); - task_environment_.FastForwardBy(base::Minutes(9)); - clock->Advance(base::Minutes(9)); - task_environment_.RunUntilIdle(); - ASSERT_FALSE(task.fired_); -} - -TEST_F(AlarmManagerTest, AlarmFire) { - WallClockDependantTask task; - ASSERT_FALSE(task.fired_); - - // Create the AlarmManager. - base::Time now = base::Time::Now(); - std::unique_ptr test_clock = - std::make_unique(); - test_clock->SetNow(now); - base::SimpleTestClock* clock = test_clock.get(); - std::unique_ptr manager = std::make_unique( - clock, base::SingleThreadTaskRunner::GetCurrentDefault()); - - // Add an alarm. - base::Time alarm_time = now + base::Minutes(10); - std::unique_ptr handle(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task.GetWeakPtr()), - alarm_time)); - clock->Advance(base::Minutes(10)); - task_environment_.FastForwardBy(base::Minutes(10)); - task_environment_.RunUntilIdle(); - ASSERT_TRUE(task.fired_); - - // Fires only once. - task.fired_ = false; - clock->Advance(base::Minutes(10)); - task_environment_.FastForwardBy(base::Minutes(10)); - task_environment_.RunUntilIdle(); - ASSERT_FALSE(task.fired_); -} - -TEST_F(AlarmManagerTest, AlarmPast) { - WallClockDependantTask task; - ASSERT_FALSE(task.fired_); - - // Create the AlarmManager. - base::Time now = base::Time::Now(); - std::unique_ptr test_clock = - std::make_unique(); - test_clock->SetNow(now); - std::unique_ptr manager = std::make_unique( - test_clock.get(), base::SingleThreadTaskRunner::GetCurrentDefault()); - - // Add an alarm in the past. Should fire right away. - base::Time alarm_time = base::Time::Now() - base::Minutes(10); - std::unique_ptr handle(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task.GetWeakPtr()), - alarm_time)); - task_environment_.FastForwardBy(base::Seconds(10)); - task_environment_.RunUntilIdle(); - ASSERT_TRUE(task.fired_); -} - -TEST_F(AlarmManagerTest, AlarmTimeJump) { - WallClockDependantTask task; - ASSERT_FALSE(task.fired_); - - // Create the AlarmManager. - base::Time now = base::Time::Now(); - std::unique_ptr test_clock = - std::make_unique(); - test_clock->SetNow(now); - base::SimpleTestClock* clock = test_clock.get(); - std::unique_ptr manager = std::make_unique( - clock, base::SingleThreadTaskRunner::GetCurrentDefault()); - - // Add an alarm. The time jumps to the future. - base::Time alarm_time = now + base::Minutes(10); - std::unique_ptr handle(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task.GetWeakPtr()), - alarm_time)); - clock->Advance(base::Minutes(10)); - task_environment_.FastForwardBy(base::Minutes(1)); - task_environment_.RunUntilIdle(); - ASSERT_TRUE(task.fired_); -} - -TEST_F(AlarmManagerTest, AlarmJumpFuture) { - WallClockDependantTask task; - ASSERT_FALSE(task.fired_); - - // Create the AlarmManager. - base::Time now = base::Time::Now(); - std::unique_ptr test_clock = - std::make_unique(); - test_clock->SetNow(now); - base::SimpleTestClock* clock = test_clock.get(); - std::unique_ptr manager = std::make_unique( - clock, base::SingleThreadTaskRunner::GetCurrentDefault()); - - // Add an alarm. The time jumps far into the future. - base::Time alarm_time = now + base::Minutes(10); - std::unique_ptr handle(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task.GetWeakPtr()), - alarm_time)); - clock->Advance(base::Minutes(60)); - task_environment_.FastForwardBy(base::Minutes(1)); - task_environment_.RunUntilIdle(); - ASSERT_TRUE(task.fired_); -} - -TEST_F(AlarmManagerTest, AlarmMultiple) { - WallClockDependantTask task1; - WallClockDependantTask task2; - ASSERT_FALSE(task1.fired_); - ASSERT_FALSE(task2.fired_); - - // Create the AlarmManager. - base::Time now = base::Time::Now(); - std::unique_ptr test_clock = - std::make_unique(); - test_clock->SetNow(now); - base::SimpleTestClock* clock = test_clock.get(); - std::unique_ptr manager = std::make_unique( - clock, base::SingleThreadTaskRunner::GetCurrentDefault()); - - // Add first task. - base::Time alarm_time = now + base::Minutes(10); - std::unique_ptr handle1(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task1.GetWeakPtr()), - alarm_time)); - - // Add second task. - alarm_time = now + base::Minutes(12); - std::unique_ptr handle2(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task2.GetWeakPtr()), - alarm_time)); - - // First task should fire. - clock->Advance(base::Minutes(10)); - task_environment_.FastForwardBy(base::Minutes(1)); - task_environment_.RunUntilIdle(); - ASSERT_TRUE(task1.fired_); - ASSERT_FALSE(task2.fired_); - - // Reset state; - task1.fired_ = false; - task2.fired_ = false; - - // Second task should fire. - clock->Advance(base::Minutes(2)); - task_environment_.FastForwardBy(base::Minutes(1)); - task_environment_.RunUntilIdle(); - ASSERT_FALSE(task1.fired_); - ASSERT_TRUE(task2.fired_); -} - -TEST_F(AlarmManagerTest, AlarmMultipleReverseOrder) { - WallClockDependantTask task1; - WallClockDependantTask task2; - ASSERT_FALSE(task1.fired_); - ASSERT_FALSE(task2.fired_); - - // Create the AlarmManager. - base::Time now = base::Time::Now(); - std::unique_ptr test_clock = - std::make_unique(); - test_clock->SetNow(now); - base::SimpleTestClock* clock = test_clock.get(); - std::unique_ptr manager = std::make_unique( - clock, base::SingleThreadTaskRunner::GetCurrentDefault()); - - // Add first task. - base::Time alarm_time = now + base::Minutes(12); - std::unique_ptr handle1(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task1.GetWeakPtr()), - alarm_time)); - - // Add second task. - alarm_time = now + base::Minutes(10); - std::unique_ptr handle2(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task2.GetWeakPtr()), - alarm_time)); - - // Second task should fire. - clock->Advance(base::Minutes(10)); - task_environment_.FastForwardBy(base::Minutes(1)); - task_environment_.RunUntilIdle(); - ASSERT_FALSE(task1.fired_); - ASSERT_TRUE(task2.fired_); - - // Reset state; - task1.fired_ = false; - task2.fired_ = false; - - // First task should fire. - clock->Advance(base::Minutes(2)); - task_environment_.FastForwardBy(base::Minutes(1)); - task_environment_.RunUntilIdle(); - ASSERT_TRUE(task1.fired_); - ASSERT_FALSE(task2.fired_); -} - -TEST_F(AlarmManagerTest, AlarmMultipleSameTime) { - WallClockDependantTask task1; - WallClockDependantTask task2; - WallClockDependantTask task3; - ASSERT_FALSE(task1.fired_); - ASSERT_FALSE(task2.fired_); - ASSERT_FALSE(task3.fired_); - - // Create the AlarmManager. - base::Time now = base::Time::Now(); - std::unique_ptr test_clock = - std::make_unique(); - test_clock->SetNow(now); - base::SimpleTestClock* clock = test_clock.get(); - std::unique_ptr manager = std::make_unique( - clock, base::SingleThreadTaskRunner::GetCurrentDefault()); - - // Add first task. - base::Time alarm_time = now + base::Minutes(12); - std::unique_ptr handle1(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task1.GetWeakPtr()), - alarm_time)); - - // Add second task. - alarm_time = now + base::Minutes(16); - std::unique_ptr handle2(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task2.GetWeakPtr()), - alarm_time)); - - // Add third task. - alarm_time = now + base::Minutes(12); - std::unique_ptr handle3(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task3.GetWeakPtr()), - alarm_time)); - - // First and third task should fire. - clock->Advance(base::Minutes(12)); - task_environment_.FastForwardBy(base::Minutes(1)); - task_environment_.RunUntilIdle(); - ASSERT_TRUE(task1.fired_); - ASSERT_FALSE(task2.fired_); - ASSERT_TRUE(task3.fired_); -} - -TEST_F(AlarmManagerTest, AlarmMultipleShuffle) { - WallClockDependantTask task1; - WallClockDependantTask task2; - WallClockDependantTask task3; - ASSERT_FALSE(task1.fired_); - ASSERT_FALSE(task2.fired_); - ASSERT_FALSE(task3.fired_); - - // Create the AlarmManager. - base::Time now = base::Time::Now(); - std::unique_ptr test_clock = - std::make_unique(); - test_clock->SetNow(now); - base::SimpleTestClock* clock = test_clock.get(); - std::unique_ptr manager = std::make_unique( - clock, base::SingleThreadTaskRunner::GetCurrentDefault()); - - // Add first task. - base::Time alarm_time = now + base::Minutes(15); - std::unique_ptr handle1(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task1.GetWeakPtr()), - alarm_time)); - - // Add second task. - alarm_time = now + base::Minutes(16); - std::unique_ptr handle2(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task2.GetWeakPtr()), - alarm_time)); - - // Add third task. - alarm_time = now + base::Minutes(11); - std::unique_ptr handle3(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task3.GetWeakPtr()), - alarm_time)); - - // Third task should fire. - clock->Advance(base::Minutes(12)); - task_environment_.FastForwardBy(base::Minutes(1)); - task_environment_.RunUntilIdle(); - ASSERT_FALSE(task1.fired_); - ASSERT_FALSE(task2.fired_); - ASSERT_TRUE(task3.fired_); - - clock->Advance(base::Minutes(3)); - task_environment_.FastForwardBy(base::Minutes(1)); - task_environment_.RunUntilIdle(); - ASSERT_TRUE(task1.fired_); - ASSERT_FALSE(task2.fired_); - ASSERT_TRUE(task3.fired_); -} - -TEST_F(AlarmManagerTest, AlarmTwice) { - WallClockDependantTask task1; - WallClockDependantTask task2; - ASSERT_FALSE(task1.fired_); - ASSERT_FALSE(task2.fired_); - - // Create the AlarmManager. - base::Time now = base::Time::Now(); - std::unique_ptr test_clock = - std::make_unique(); - test_clock->SetNow(now); - base::SimpleTestClock* clock = test_clock.get(); - std::unique_ptr manager = std::make_unique( - clock, base::SingleThreadTaskRunner::GetCurrentDefault()); - - // Add first task. - base::Time alarm_time = now + base::Minutes(15); - std::unique_ptr handle1(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task1.GetWeakPtr()), - alarm_time)); - - // Add it again with less time. - alarm_time = now + base::Minutes(1); - std::unique_ptr handle2(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task1.GetWeakPtr()), - alarm_time)); - - // Add second task. - alarm_time = now + base::Minutes(16); - std::unique_ptr handle3(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task2.GetWeakPtr()), - alarm_time)); - - // First task should fire. - clock->Advance(base::Minutes(1)); - task_environment_.FastForwardBy(base::Minutes(1)); - task_environment_.RunUntilIdle(); - ASSERT_TRUE(task1.fired_); - ASSERT_FALSE(task2.fired_); - - task1.fired_ = false; - task2.fired_ = false; - - // First task should fire again because it was added twice. - clock->Advance(base::Minutes(14)); - task_environment_.FastForwardBy(base::Minutes(1)); - task_environment_.RunUntilIdle(); - ASSERT_TRUE(task1.fired_); - ASSERT_FALSE(task2.fired_); -} - -TEST_F(AlarmManagerTest, AlarmCancel) { - std::unique_ptr task1 = - std::make_unique(); - std::unique_ptr task2 = - std::make_unique(); - std::unique_ptr task3 = - std::make_unique(); - ASSERT_FALSE(task1->fired_); - ASSERT_FALSE(task2->fired_); - ASSERT_FALSE(task3->fired_); - - // Create the AlarmManager. - base::Time now = base::Time::Now(); - std::unique_ptr test_clock = - std::make_unique(); - test_clock->SetNow(now); - base::SimpleTestClock* clock = test_clock.get(); - std::unique_ptr manager = std::make_unique( - clock, base::SingleThreadTaskRunner::GetCurrentDefault()); - - // Add first task. - base::Time alarm_time = now + base::Minutes(12); - std::unique_ptr handle1(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task1->GetWeakPtr()), - alarm_time)); - - // Add second task. - alarm_time = now + base::Minutes(16); - std::unique_ptr handle2(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task2->GetWeakPtr()), - alarm_time)); - - // Add third task. - alarm_time = now + base::Minutes(12); - std::unique_ptr handle3(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task3->GetWeakPtr()), - alarm_time)); - - // Remove the first task. - task1.reset(nullptr); - - // Third task should fire. - clock->Advance(base::Minutes(15)); - task_environment_.FastForwardBy(base::Minutes(1)); - task_environment_.RunUntilIdle(); - ASSERT_FALSE(task2->fired_); - ASSERT_TRUE(task3->fired_); -} - -TEST_F(AlarmManagerTest, AlarmDeleteHandle) { - std::unique_ptr task1 = - std::make_unique(); - std::unique_ptr task2 = - std::make_unique(); - std::unique_ptr task3 = - std::make_unique(); - ASSERT_FALSE(task1->fired_); - ASSERT_FALSE(task2->fired_); - ASSERT_FALSE(task3->fired_); - - // Create the AlarmManager. - base::Time now = base::Time::Now(); - std::unique_ptr test_clock = - std::make_unique(); - test_clock->SetNow(now); - base::SimpleTestClock* clock = test_clock.get(); - std::unique_ptr manager = std::make_unique( - clock, base::SingleThreadTaskRunner::GetCurrentDefault()); - - // Add first task. - base::Time alarm_time = now + base::Minutes(12); - std::unique_ptr handle1(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task1->GetWeakPtr()), - alarm_time)); - - // Add second task. - alarm_time = now + base::Minutes(16); - std::unique_ptr handle2(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task2->GetWeakPtr()), - alarm_time)); - - // Add third task. - alarm_time = now + base::Minutes(12); - std::unique_ptr handle3(manager->PostAlarmTask( - base::BindOnce(&WallClockDependantTask::OnAlarmFire, task3->GetWeakPtr()), - alarm_time)); - - // Delete the first task's handle. - handle1.reset(); - - // Third task should fire. - clock->Advance(base::Minutes(15)); - task_environment_.FastForwardBy(base::Minutes(1)); - task_environment_.RunUntilIdle(); - ASSERT_FALSE(task1->fired_); - ASSERT_FALSE(task2->fired_); - ASSERT_TRUE(task3->fired_); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/android/OWNERS chromium-132.0.6834.159/chromecast/base/android/OWNERS --- chromium-132.0.6834.110/chromecast/base/android/OWNERS 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/android/OWNERS 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -file://chromecast/android/OWNERS diff -Nru chromium-132.0.6834.110/chromecast/base/android/dumpstate_writer.cc chromium-132.0.6834.159/chromecast/base/android/dumpstate_writer.cc --- chromium-132.0.6834.110/chromecast/base/android/dumpstate_writer.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/android/dumpstate_writer.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/android/dumpstate_writer.h" - -#include "base/android/jni_android.h" -#include "base/android/jni_string.h" - -// Must come after all headers that specialize FromJniType() / ToJniType(). -#include "chromecast/base/jni_headers/DumpstateWriter_jni.h" - -namespace chromecast { - -// static -void DumpstateWriter::AddDumpValue(const std::string& name, - const std::string& value) { - JNIEnv* env = base::android::AttachCurrentThread(); - Java_DumpstateWriter_addDumpValue( - env, base::android::ConvertUTF8ToJavaString(env, name), - base::android::ConvertUTF8ToJavaString(env, value)); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/android/dumpstate_writer.h chromium-132.0.6834.159/chromecast/base/android/dumpstate_writer.h --- chromium-132.0.6834.110/chromecast/base/android/dumpstate_writer.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/android/dumpstate_writer.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,26 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_ANDROID_DUMPSTATE_WRITER_H_ -#define CHROMECAST_BASE_ANDROID_DUMPSTATE_WRITER_H_ - -#include - -#include - -namespace chromecast { - -// JNI wrapper for DumpstateWriter.java. -class DumpstateWriter { - public: - DumpstateWriter() = delete; - DumpstateWriter(const DumpstateWriter&) = delete; - DumpstateWriter& operator=(const DumpstateWriter&) = delete; - - static void AddDumpValue(const std::string& name, const std::string& value); -}; - -} // namespace chromecast - -#endif // CHROMECAST_BASE_ANDROID_DUMPSTATE_WRITER_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/android/system_time_change_notifier_android.cc chromium-132.0.6834.159/chromecast/base/android/system_time_change_notifier_android.cc --- chromium-132.0.6834.110/chromecast/base/android/system_time_change_notifier_android.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/android/system_time_change_notifier_android.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/android/system_time_change_notifier_android.h" - -// Must come after all headers that specialize FromJniType() / ToJniType(). -#include "chromecast/base/jni_headers/SystemTimeChangeNotifierAndroid_jni.h" - -using jni_zero::JavaParamRef; - -namespace chromecast { - -SystemTimeChangeNotifierAndroid::SystemTimeChangeNotifierAndroid() { - JNIEnv* env = jni_zero::AttachCurrentThread(); - java_notifier_.Reset(Java_SystemTimeChangeNotifierAndroid_create(env)); - Java_SystemTimeChangeNotifierAndroid_initializeFromNative( - env, java_notifier_, reinterpret_cast(this)); -} - -SystemTimeChangeNotifierAndroid::~SystemTimeChangeNotifierAndroid() { - JNIEnv* env = jni_zero::AttachCurrentThread(); - Java_SystemTimeChangeNotifierAndroid_finalizeFromNative(env, java_notifier_); -} - -void SystemTimeChangeNotifierAndroid::OnTimeChanged( - JNIEnv* env, - const JavaParamRef& jobj) { - NotifySystemTimeChanged(); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/android/system_time_change_notifier_android.h chromium-132.0.6834.159/chromecast/base/android/system_time_change_notifier_android.h --- chromium-132.0.6834.110/chromecast/base/android/system_time_change_notifier_android.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/android/system_time_change_notifier_android.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_ANDROID_SYSTEM_TIME_CHANGE_NOTIFIER_ANDROID_H_ -#define CHROMECAST_BASE_ANDROID_SYSTEM_TIME_CHANGE_NOTIFIER_ANDROID_H_ - -#include "base/android/scoped_java_ref.h" -#include "chromecast/base/system_time_change_notifier.h" - -namespace chromecast { - -class SystemTimeChangeNotifierAndroid : public SystemTimeChangeNotifier { - public: - SystemTimeChangeNotifierAndroid(); - - SystemTimeChangeNotifierAndroid(const SystemTimeChangeNotifierAndroid&) = - delete; - SystemTimeChangeNotifierAndroid& operator=( - const SystemTimeChangeNotifierAndroid&) = delete; - - ~SystemTimeChangeNotifierAndroid() override; - - // Called from Java. - void OnTimeChanged(JNIEnv* env, - const base::android::JavaParamRef& jobj); - - private: - base::android::ScopedJavaGlobalRef java_notifier_; -}; - -} // namespace chromecast - -#endif // CHROMECAST_BASE_ANDROID_SYSTEM_TIME_CHANGE_NOTIFIER_ANDROID_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/bind_to_task_runner.h chromium-132.0.6834.159/chromecast/base/bind_to_task_runner.h --- chromium-132.0.6834.110/chromecast/base/bind_to_task_runner.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/bind_to_task_runner.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,54 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_BIND_TO_TASK_RUNNER_H_ -#define CHROMECAST_BASE_BIND_TO_TASK_RUNNER_H_ - -#include -#include - -#include "base/functional/callback.h" -#include "base/location.h" -#include "base/task/bind_post_task.h" -#include "base/task/sequenced_task_runner.h" -#include "base/task/single_thread_task_runner.h" - -// Helpers for using base::BindPostTask() with the TaskRunner for the current -// sequence, ie. base::SequencedTaskRunner::GetCurrentDefault(), or current -// thread, ie, base::SingleThreadTaskRunner::GetCurrentDefault(). -namespace chromecast { - -template -base::OnceCallback BindToCurrentThread( - base::OnceCallback callback, - const base::Location& location = FROM_HERE) { - return base::BindPostTask(base::SingleThreadTaskRunner::GetCurrentDefault(), - std::move(callback), location); -} - -template -base::RepeatingCallback BindToCurrentThread( - base::RepeatingCallback callback, - const base::Location& location = FROM_HERE) { - return base::BindPostTask(base::SingleThreadTaskRunner::GetCurrentDefault(), - std::move(callback), location); -} - -template -base::OnceCallback BindToCurrentSequence( - base::OnceCallback callback, - const base::Location& location = FROM_HERE) { - return base::BindPostTaskToCurrentDefault(std::move(callback), location); -} - -template -base::RepeatingCallback BindToCurrentSequence( - base::RepeatingCallback callback, - const base::Location& location = FROM_HERE) { - return base::BindPostTaskToCurrentDefault(std::move(callback), location); -} - -} // namespace chromecast - -#endif // CHROMECAST_BASE_BIND_TO_TASK_RUNNER_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/bitstream_audio_codecs.cc chromium-132.0.6834.159/chromecast/base/bitstream_audio_codecs.cc --- chromium-132.0.6834.110/chromecast/base/bitstream_audio_codecs.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/bitstream_audio_codecs.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,85 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/bitstream_audio_codecs.h" - -#include -#include - -#include "base/strings/strcat.h" -#include "base/strings/string_util.h" - -namespace chromecast { - -namespace { - -const char* BitstreamAudioCodecToString(int codec) { - switch (codec) { - case kBitstreamAudioCodecNone: - return "None"; - case kBitstreamAudioCodecAc3: - return "AC3"; - case kBitstreamAudioCodecDts: - return "DTS"; - case kBitstreamAudioCodecDtsHd: - return "DTS-HD"; - case kBitstreamAudioCodecEac3: - return "EAC3"; - case kBitstreamAudioCodecPcmSurround: - return "PCM"; - case kBitstreamAudioCodecMpegHAudio: - return "MPEG-H Audio"; - default: - return ""; - } -} - -} // namespace - -BitstreamAudioCodecsInfo BitstreamAudioCodecsInfo::operator&( - const BitstreamAudioCodecsInfo& other) const { - return BitstreamAudioCodecsInfo{codecs & other.codecs, - spatial_rendering & other.spatial_rendering}; -} - -bool BitstreamAudioCodecsInfo::operator==( - const BitstreamAudioCodecsInfo& other) const { - return codecs == other.codecs && spatial_rendering == other.spatial_rendering; -} - -bool BitstreamAudioCodecsInfo::operator!=( - const BitstreamAudioCodecsInfo& other) const { - return !(*this == other); -} - -BitstreamAudioCodecsInfo BitstreamAudioCodecsInfo::ApplyCodecMask( - int mask) const { - return BitstreamAudioCodecsInfo{codecs & mask, spatial_rendering & mask}; -} - -std::string BitstreamAudioCodecsToString(int codecs) { - std::string codec_string = BitstreamAudioCodecToString(codecs); - if (!codec_string.empty()) { - return codec_string; - } - std::vector codec_strings; - for (int codec : - {kBitstreamAudioCodecAc3, kBitstreamAudioCodecDts, - kBitstreamAudioCodecDtsHd, kBitstreamAudioCodecEac3, - kBitstreamAudioCodecPcmSurround, kBitstreamAudioCodecMpegHAudio}) { - if ((codec & codecs) != 0) { - codec_strings.push_back(BitstreamAudioCodecToString(codec)); - } - } - return "[" + base::JoinString(codec_strings, ", ") + "]"; -} - -std::string BitstreamAudioCodecsInfoToString( - const BitstreamAudioCodecsInfo& info) { - return base::StrCat({"[codecs]", BitstreamAudioCodecsToString(info.codecs), - "[spatial_rendering]", - BitstreamAudioCodecsToString(info.spatial_rendering)}); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/bitstream_audio_codecs.h chromium-132.0.6834.159/chromecast/base/bitstream_audio_codecs.h --- chromium-132.0.6834.110/chromecast/base/bitstream_audio_codecs.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/bitstream_audio_codecs.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,46 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_BITSTREAM_AUDIO_CODECS_H_ -#define CHROMECAST_BASE_BITSTREAM_AUDIO_CODECS_H_ - -#include - -namespace chromecast { - -constexpr int kBitstreamAudioCodecNone = 0b000000; -constexpr int kBitstreamAudioCodecAc3 = 0b000001; -constexpr int kBitstreamAudioCodecDts = 0b000010; -constexpr int kBitstreamAudioCodecDtsHd = 0b000100; -constexpr int kBitstreamAudioCodecEac3 = 0b001000; -constexpr int kBitstreamAudioCodecPcmSurround = 0b010000; -constexpr int kBitstreamAudioCodecMpegHAudio = 0b100000; -constexpr int kBitstreamAudioCodecDtsXP2 = 0b1000000; -constexpr int kBitstreamAudioCodecAll = 0b1111111; - -// Supported bitstream audio codecs and their associated properties. -struct BitstreamAudioCodecsInfo { - // Bitmap of supported bitstream audio codecs. - int codecs = kBitstreamAudioCodecNone; - - // Bitmap specifying which of the corresponding codecs in |codecs| support - // spatial rendering. - int spatial_rendering = kBitstreamAudioCodecNone; - - BitstreamAudioCodecsInfo operator&( - const BitstreamAudioCodecsInfo& other) const; - - bool operator==(const BitstreamAudioCodecsInfo& other) const; - bool operator!=(const BitstreamAudioCodecsInfo& other) const; - - BitstreamAudioCodecsInfo ApplyCodecMask(int mask) const; -}; - -std::string BitstreamAudioCodecsToString(int codecs); -std::string BitstreamAudioCodecsInfoToString( - const BitstreamAudioCodecsInfo& info); - -} // namespace chromecast - -#endif // CHROMECAST_BASE_BITSTREAM_AUDIO_CODECS_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/cast_constants.cc chromium-132.0.6834.159/chromecast/base/cast_constants.cc --- chromium-132.0.6834.110/chromecast/base/cast_constants.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/cast_constants.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,11 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/cast_constants.h" - -namespace chromecast { - -const char kChromeResourceScheme[] = "chrome-resource"; - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/cast_constants.h chromium-132.0.6834.159/chromecast/base/cast_constants.h --- chromium-132.0.6834.110/chromecast/base/cast_constants.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/cast_constants.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,14 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_CAST_CONSTANTS_H_ -#define CHROMECAST_BASE_CAST_CONSTANTS_H_ - -namespace chromecast { - -extern const char kChromeResourceScheme[]; - -} // namespace chromecast - -#endif // CHROMECAST_BASE_CAST_CONSTANTS_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/cast_features.cc chromium-132.0.6834.159/chromecast/base/cast_features.cc --- chromium-132.0.6834.110/chromecast/base/cast_features.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/cast_features.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,357 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/cast_features.h" - -#include -#include - -#include "base/command_line.h" -#include "base/containers/contains.h" -#include "base/feature_list.h" -#include "base/metrics/field_trial.h" -#include "base/metrics/field_trial_param_associator.h" -#include "base/metrics/field_trial_params.h" -#include "base/no_destructor.h" -#include "base/strings/string_number_conversions.h" -#include "base/values.h" -#include "build/build_config.h" - -namespace chromecast { -namespace { - -// The name of the default group to use for Cast DCS features. -const char kDefaultDCSFeaturesGroup[] = "default_dcs_features_group"; - -std::unordered_set& GetExperimentIds() { - static base::NoDestructor> g_experiment_ids; - return *g_experiment_ids; -} - -bool g_experiment_ids_initialized = false; - -// The collection of features that have been registered by unit tests -std::vector& GetTestFeatures() { - static base::NoDestructor> - features_for_test; - return *features_for_test; -} - -void SetExperimentIds(const base::Value::List& list) { - DCHECK(!g_experiment_ids_initialized); - std::unordered_set ids; - for (const auto& it : list) { - if (it.is_int()) { - ids.insert(it.GetInt()); - } else { - LOG(ERROR) << "Non-integer value found in experiment id list!"; - } - } - GetExperimentIds().swap(ids); - g_experiment_ids_initialized = true; -} - -} // namespace - -// PLEASE READ! -// Cast Platform Features are listed below. These features may be -// toggled via configs fetched from DCS for devices in the field, or via -// command-line flags set by the developer. For the end-to-end details of the -// system design, please see go/dcs-experiments. -// -// Below are useful steps on how to use these features in your code. -// -// 1) Declaring and defining the feature. -// All Cast Platform Features should be declared in a common file with other -// Cast Platform Features (ex. chromecast/base/cast_features.h). When -// defining your feature, you will need to assign a default value. This is -// the value that the feature will hold until overriden by the server or the -// command line. Here's an exmaple: -// -// BASE_FEATURE(kSuperSecretSauce, "SuperSecretSauce", -// base::FEATURE_DISABLED_BY_DEFAULT); -// -// IMPORTANT NOTE: -// The first parameter that you pass in the definition is the feature's name. -// This MUST match the DCS experiment key for this feature. -// -// While Features elsewhere in Chromium alternatively use dashed-case or -// PascalCase for their names, Chromecast features should use snake_case -// (lowercase letters separated by underscores). This will ensure that DCS -// configs, which are passed around as JSON, remain conformant and readable. -// -// 2) Using the feature in client code. -// Using these features in your code is easy. Here's an example: -// -// #include “base/feature_list.h” -// #include “chromecast/base/chromecast_switches.h” -// -// std::unique_ptr CreateFoo() { -// if (base::FeatureList::IsEnabled(kSuperSecretSauce)) -// return std::make_unique(); -// return std::make_unique(); -// } -// -// base::FeatureList can be called from any thread, in any process, at any -// time after PreCreateThreads(). It will return whether the feature is -// enabled. -// -// 3) Overriding the default value from the server. -// For devices in the field, DCS will issue different configs to different -// groups of devices, allowing us to run experiments on features. These -// feature settings will manifest on the next boot of cast_shell. In the -// example, if the latest config for a particular device set the value of -// kSuperSecretSauce to true, the appropriate code path would be taken. -// Otherwise, the default value, false, would be used. For more details on -// setting up experiments, see go/dcs-launch. -// -// 4) Overriding the default and server values from the command-line. -// While the server value trumps the default values, the command line trumps -// both. Enable features by passing this command line arg to cast_shell: -// -// --enable-features=enable_foo,enable_super_secret_sauce -// -// Features are separated by commas. Disable features by passing: -// -// --disable-features=enable_foo,enable_bar -// -// 5) If you add a new feature to the system you must include it in kFeatures -// This is because the system relies on knowing all of the features so -// it can properly iterate over all features to detect changes. -// - -// Begin Chromecast Feature definitions. - -// Allows applications to access media capture devices (webcams/microphones) -// through getUserMedia API. -BASE_FEATURE(kAllowUserMediaAccess, - "allow_user_media_access", - base::FEATURE_DISABLED_BY_DEFAULT); -// Enables the use of QUIC in Cast-specific NetworkContexts. See -// chromecast/browser/cast_network_contexts.cc for usage. -BASE_FEATURE(kEnableQuic, "enable_quic", base::FEATURE_DISABLED_BY_DEFAULT); -// Enables triple-buffer 720p graphics (overriding default graphics buffer -// settings for a platform). -BASE_FEATURE(kTripleBuffer720, - "enable_triple_buffer_720", - base::FEATURE_DISABLED_BY_DEFAULT); -// Enables single-buffered graphics (overriding default graphics buffer -// settings and takes precedence over triple-buffer feature). -BASE_FEATURE(kSingleBuffer, - "enable_single_buffer", - base::FEATURE_DISABLED_BY_DEFAULT); -// Disable idle sockets closing on memory pressure. See -// chromecast/browser/cast_network_contexts.cc for usage. -BASE_FEATURE(kDisableIdleSocketsCloseOnMemoryPressure, - "disable_idle_sockets_close_on_memory_pressure", - base::FEATURE_DISABLED_BY_DEFAULT); - -BASE_FEATURE(kEnableGeneralAudienceBrowsing, - "enable_general_audience_browsing", - base::FEATURE_DISABLED_BY_DEFAULT); - -BASE_FEATURE(kEnableSideGesturePassThrough, - "enable_side_gesture_pass_through", - base::FEATURE_DISABLED_BY_DEFAULT); - -// Uses AudioManagerAndroid, instead of CastAudioManagerAndroid. This will -// disable lots of Cast features, so it should only be used for development and -// testing. -BASE_FEATURE(kEnableChromeAudioManagerAndroid, - "enable_chrome_audio_manager_android", - base::FEATURE_DISABLED_BY_DEFAULT); - -// Enables CastAudioOutputDevice for audio output on Android. When disabled, -// CastAudioManagerAndroid will be used. -BASE_FEATURE(kEnableCastAudioOutputDevice, - "enable_cast_audio_output_device", - base::FEATURE_DISABLED_BY_DEFAULT); - -// End Chromecast Feature definitions. -const base::Feature* kFeatures[] = { - &kAllowUserMediaAccess, - &kEnableQuic, - &kTripleBuffer720, - &kSingleBuffer, - &kDisableIdleSocketsCloseOnMemoryPressure, - &kEnableGeneralAudienceBrowsing, - &kEnableSideGesturePassThrough, - &kEnableChromeAudioManagerAndroid, - &kEnableCastAudioOutputDevice, -}; - -std::vector GetInternalFeatures(); - -const std::vector& GetFeatures() { - static const base::NoDestructor> features( - [] { - std::vector features(std::begin(kFeatures), - std::end(kFeatures)); - auto internal_features = GetInternalFeatures(); - features.insert(features.end(), internal_features.begin(), - internal_features.end()); - return features; - }()); - if (GetTestFeatures().size() > 0) - return GetTestFeatures(); - return *features; -} - -void InitializeFeatureList(const base::Value::Dict& dcs_features, - const base::Value::List& dcs_experiment_ids, - const std::string& cmd_line_enable_features, - const std::string& cmd_line_disable_features, - const std::string& extra_enable_features, - const std::string& extra_disable_features) { - DCHECK(!base::FeatureList::GetInstance()); - - // Set the experiments. - SetExperimentIds(dcs_experiment_ids); - - std::string all_enable_features = - cmd_line_enable_features + "," + extra_enable_features; - std::string all_disable_features = - cmd_line_disable_features + "," + extra_disable_features; - - // Initialize the FeatureList from the command line. - auto feature_list = std::make_unique(); - feature_list->InitFromCommandLine(all_enable_features, all_disable_features); - - // Override defaults from the DCS config. - for (const auto kv : dcs_features) { - // Each feature must have its own FieldTrial object. Since experiments are - // controlled server-side for Chromecast, and this class is designed with a - // client-side experimentation framework in mind, these parameters are - // carefully chosen: - // - The field trial name is unused for our purposes. However, we need to - // maintain a 1:1 mapping with Features in order to properly store and - // access parameters associated with each Feature. Therefore, use the - // Feature's name as the FieldTrial name to ensure uniqueness. - // - We don't care about the group_id. - // - const std::string& feature_name = kv.first; - auto* field_trial = base::FieldTrialList::CreateFieldTrial( - feature_name, kDefaultDCSFeaturesGroup); - - // |field_trial| is null only if the trial has already been forced to - // another group. This shouldn't happen, unless we've processed a - // --force-fieldtrial commandline argument that overrides this to some other - // group. - if (!field_trial) { - LOG(ERROR) << "A trial was already created for a DCS feature: " - << feature_name; - continue; - } - - if (kv.second.is_bool()) { - // A boolean entry simply either enables or disables a feature. - feature_list->RegisterFieldTrialOverride( - feature_name, - kv.second.GetBool() ? base::FeatureList::OVERRIDE_ENABLE_FEATURE - : base::FeatureList::OVERRIDE_DISABLE_FEATURE, - field_trial); - continue; - } - - if (kv.second.is_dict()) { - // A dictionary entry implies that the feature is enabled. - feature_list->RegisterFieldTrialOverride( - feature_name, base::FeatureList::OVERRIDE_ENABLE_FEATURE, - field_trial); - - // If the feature has not been overriden from the command line, set its - // parameters accordingly. - if (!feature_list->IsFeatureOverriddenFromCommandLine( - feature_name, base::FeatureList::OVERRIDE_DISABLE_FEATURE)) { - // Build a map of the FieldTrial parameters and associate it to the - // FieldTrial. - base::FieldTrialParams params; - for (const auto params_kv : kv.second.GetDict()) { - if (params_kv.second.is_string()) { - params[params_kv.first] = params_kv.second.GetString(); - } else { - LOG(ERROR) << "Entry in params dict for \"" << feature_name << "\"" - << " feature is not a string. Skipping."; - } - } - - // Register the params, so that they can be queried by client code. - bool success = base::AssociateFieldTrialParams( - feature_name, kDefaultDCSFeaturesGroup, params); - DCHECK(success); - } - continue; - } - - // Other base::Value types are not supported. - LOG(ERROR) << "A DCS feature mapped to an unsupported value. key: " - << feature_name << " type: " << kv.second.type(); - } - - base::FeatureList::SetInstance(std::move(feature_list)); -} - -bool IsFeatureEnabled(const base::Feature& feature) { - DCHECK(base::Contains(GetFeatures(), &feature)) << feature.name; - return base::FeatureList::IsEnabled(feature); -} - -base::Value::Dict GetOverriddenFeaturesForStorage( - const base::Value::Dict& features) { - base::Value::Dict persistent_dict; - - // |features| maps feature names to either a boolean or a dict of params. - for (const auto feature : features) { - if (feature.second.is_bool()) { - persistent_dict.Set(feature.first, feature.second.GetBool()); - continue; - } - - if (feature.second.is_dict()) { - const base::Value* params_dict = &feature.second; - base::Value::Dict params; - - for (const auto [param_key, param_val] : params_dict->GetDict()) { - if (param_val.is_bool()) { - params.Set(param_key, param_val.GetBool() ? "true" : "false"); - } else if (param_val.is_int()) { - params.Set(param_key, base::NumberToString(param_val.GetInt())); - } else if (param_val.is_double()) { - params.Set(param_key, base::NumberToString(param_val.GetDouble())); - } else if (param_val.is_string()) { - params.Set(param_key, param_val.GetString()); - } else { - LOG(ERROR) << "Entry in params dict for \"" << feature.first << "\"" - << " is not of a supported type (key: " << param_key - << ", type: " << param_val.type(); - } - } - persistent_dict.Set(feature.first, std::move(params)); - continue; - } - - // Other base::Value types are not supported. - LOG(ERROR) << "A DCS feature mapped to an unsupported value. key: " - << feature.first << " type: " << feature.second.type(); - } - - return persistent_dict; -} - -const std::unordered_set& GetDCSExperimentIds() { - DCHECK(g_experiment_ids_initialized); - return GetExperimentIds(); -} - -void ResetCastFeaturesForTesting() { - g_experiment_ids_initialized = false; - base::FeatureList::ClearInstanceForTesting(); - GetTestFeatures().clear(); -} - -void SetFeaturesForTest(std::vector features) { - GetTestFeatures() = std::move(features); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/cast_features.h chromium-132.0.6834.159/chromecast/base/cast_features.h --- chromium-132.0.6834.110/chromecast/base/cast_features.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/cast_features.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,80 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_CAST_FEATURES_H_ -#define CHROMECAST_BASE_CAST_FEATURES_H_ - -#include -#include -#include -#include -#include - -#include "base/feature_list.h" -#include "base/values.h" - -namespace chromecast { - -// Add Cast Features here. -BASE_DECLARE_FEATURE(kAllowUserMediaAccess); -BASE_DECLARE_FEATURE(kEnableQuic); -BASE_DECLARE_FEATURE(kTripleBuffer720); -BASE_DECLARE_FEATURE(kSingleBuffer); -BASE_DECLARE_FEATURE(kDisableIdleSocketsCloseOnMemoryPressure); -BASE_DECLARE_FEATURE(kEnableGeneralAudienceBrowsing); -BASE_DECLARE_FEATURE(kEnableSideGesturePassThrough); -BASE_DECLARE_FEATURE(kEnableChromeAudioManagerAndroid); -BASE_DECLARE_FEATURE(kEnableCastAudioOutputDevice); - -// Get an iterable list of all of the cast features for checking all features as -// a collection. -const std::vector& GetFeatures(); - -// Below are utilities needed by the Cast receiver to persist feature -// information. Client code which is simply querying the status of a feature -// will not need to use these utilities. - -// Initialize the global base::FeatureList instance, taking into account -// overrides from DCS and the command line. |dcs_features| and -// |dcs_experiment_ids| are read from the PrefService in the browser process. -// |cmd_line_enable_features| and |cmd_line_disable_features| should be passed -// to this function, unmodified from the command line. |extra_enable_features| -// should contain any extra features to be enabled. -// -// This function should be called before the browser's main loop. After this is -// called, the other functions in this file may be called on any thread. -// TODO(juke): Keep type info of params by passing in base::flat_map and -// std::vector instead of base::Value. -void InitializeFeatureList(const base::Value::Dict& dcs_features, - const base::Value::List& dcs_experiment_ids, - const std::string& cmd_line_enable_features, - const std::string& cmd_line_disable_features, - const std::string& extra_enable_features, - const std::string& extra_disable_features); - -// Determine whether or not a feature is enabled. This replaces -// base::FeatureList::IsEnabled for Cast builds. -bool IsFeatureEnabled(const base::Feature& feature); - -// Given a dictionary of features, create a copy that is ready to be persisted -// to disk. Encodes all values as strings, which is how the FieldTrial -// classes expect the param data. -base::Value::Dict GetOverriddenFeaturesForStorage( - const base::Value::Dict& features); - -// Query the set of experiment ids set for this run. Intended only for metrics -// reporting. Must be called after InitializeFeatureList(). May be called on any -// thread. -const std::unordered_set& GetDCSExperimentIds(); - -// Reset static state to ensure clean unittests. For tests only. -void ResetCastFeaturesForTesting(); - -// Set the response to GetFeatures(). Calls to this function should -// be cleaned up by a call to ResetCastFeaturesForTesting() otherwise -// your test will leak the overridden feature state. -void SetFeaturesForTest(std::vector features); -} // namespace chromecast - -#endif // CHROMECAST_BASE_CAST_FEATURES_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/cast_features_internal.cc chromium-132.0.6834.159/chromecast/base/cast_features_internal.cc --- chromium-132.0.6834.110/chromecast/base/cast_features_internal.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/cast_features_internal.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,13 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include - -#include "base/feature_list.h" - -namespace chromecast { -std::vector GetInternalFeatures() { - return std::vector(); -} -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/cast_features_unittest.cc chromium-132.0.6834.159/chromecast/base/cast_features_unittest.cc --- chromium-132.0.6834.110/chromecast/base/cast_features_unittest.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/cast_features_unittest.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,306 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/cast_features.h" - -#include "base/metrics/field_trial_params.h" -#include "base/values.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace chromecast { -namespace { - -const char kTestBooleanFeatureName[] = "test_boolean_feature"; -const char kTestBooleanFeatureName2[] = "test_boolean_feature_2"; -const char kTestBooleanFeatureName3[] = "test_boolean_feature_3"; -const char kTestBooleanFeatureName4[] = "test_boolean_feature_4"; - -const char kTestParamsFeatureName[] = "test_params_feature"; - -} // namespace - -class CastFeaturesTest : public testing::Test { - public: - CastFeaturesTest() {} - - CastFeaturesTest(const CastFeaturesTest&) = delete; - CastFeaturesTest& operator=(const CastFeaturesTest&) = delete; - - ~CastFeaturesTest() override {} - - // testing::Test implementation: - void SetUp() override { - original_feature_list_ = base::FeatureList::ClearInstanceForTesting(); - ResetCastFeaturesForTesting(); - } - void TearDown() override { - ResetCastFeaturesForTesting(); - base::FeatureList::RestoreInstanceForTesting( - std::move(original_feature_list_)); - } - - private: - std::unique_ptr original_feature_list_; -}; - -TEST_F(CastFeaturesTest, EnableDisableMultipleBooleanFeatures) { - // Declare several boolean features. - static BASE_FEATURE(bool_feature, kTestBooleanFeatureName, - base::FEATURE_DISABLED_BY_DEFAULT); - static BASE_FEATURE(bool_feature_2, kTestBooleanFeatureName2, - base::FEATURE_ENABLED_BY_DEFAULT); - static BASE_FEATURE(bool_feature_3, kTestBooleanFeatureName3, - base::FEATURE_DISABLED_BY_DEFAULT); - static BASE_FEATURE(bool_feature_4, kTestBooleanFeatureName4, - base::FEATURE_ENABLED_BY_DEFAULT); - - // Properly register them - chromecast::SetFeaturesForTest( - {&bool_feature, &bool_feature_2, &bool_feature_3, &bool_feature_4}); - - // Override those features with DCS configs. - base::Value::List experiments; - base::Value::Dict features; - features.Set(kTestBooleanFeatureName, false); - features.Set(kTestBooleanFeatureName2, false); - features.Set(kTestBooleanFeatureName3, true); - features.Set(kTestBooleanFeatureName4, true); - - InitializeFeatureList(features, experiments, "", "", "", ""); - - // Test that features are properly enabled (they should match the - // DCS config). - ASSERT_FALSE(chromecast::IsFeatureEnabled(bool_feature)); - ASSERT_FALSE(chromecast::IsFeatureEnabled(bool_feature_2)); - ASSERT_TRUE(chromecast::IsFeatureEnabled(bool_feature_3)); - ASSERT_TRUE(chromecast::IsFeatureEnabled(bool_feature_4)); -} - -TEST_F(CastFeaturesTest, EnableSingleFeatureWithParams) { - // Define a feature with params. - static BASE_FEATURE(test_feature, kTestParamsFeatureName, - base::FEATURE_DISABLED_BY_DEFAULT); - chromecast::SetFeaturesForTest({&test_feature}); - - // Pass params via DCS. - base::Value::List experiments; - base::Value::Dict features; - base::Value::Dict params; - params.Set("foo_key", "foo"); - params.Set("bar_key", "bar"); - params.Set("doub_key", "3.14159"); - params.Set("long_doub_key", "1.23459999999999999"); - params.Set("int_key", "4242"); - params.Set("bool_key", "true"); - features.Set(kTestParamsFeatureName, std::move(params)); - - InitializeFeatureList(features, experiments, "", "", "", ""); - - // Test that this feature is enabled, and params are correct. - ASSERT_TRUE(chromecast::IsFeatureEnabled(test_feature)); - ASSERT_EQ("foo", - base::GetFieldTrialParamValueByFeature(test_feature, "foo_key")); - ASSERT_EQ("bar", - base::GetFieldTrialParamValueByFeature(test_feature, "bar_key")); - ASSERT_EQ(3.14159, base::GetFieldTrialParamByFeatureAsDouble( - test_feature, "doub_key", 0.000)); - ASSERT_EQ(1.23459999999999999, base::GetFieldTrialParamByFeatureAsDouble( - test_feature, "long_doub_key", 0.000)); - ASSERT_EQ(4242, base::GetFieldTrialParamByFeatureAsInt(test_feature, - "int_key", -1)); - ASSERT_EQ(true, base::GetFieldTrialParamByFeatureAsBool(test_feature, - "bool_key", false)); -} - -TEST_F(CastFeaturesTest, CommandLineOverridesDcsAndDefault) { - // Declare several boolean features. - static BASE_FEATURE(bool_feature, kTestBooleanFeatureName, - base::FEATURE_DISABLED_BY_DEFAULT); - static BASE_FEATURE(bool_feature_2, kTestBooleanFeatureName2, - base::FEATURE_ENABLED_BY_DEFAULT); - static BASE_FEATURE(bool_feature_3, kTestBooleanFeatureName3, - base::FEATURE_DISABLED_BY_DEFAULT); - static BASE_FEATURE(bool_feature_4, kTestBooleanFeatureName4, - base::FEATURE_ENABLED_BY_DEFAULT); - - // Override those features with DCS configs. - base::Value::List experiments; - base::Value::Dict features; - features.Set(kTestBooleanFeatureName, false); - features.Set(kTestBooleanFeatureName2, false); - features.Set(kTestBooleanFeatureName3, true); - features.Set(kTestBooleanFeatureName4, true); - - // Also override a param feature with DCS config. - static BASE_FEATURE(params_feature, kTestParamsFeatureName, - base::FEATURE_ENABLED_BY_DEFAULT); - chromecast::SetFeaturesForTest({&bool_feature, &bool_feature_2, - &bool_feature_3, &bool_feature_4, - ¶ms_feature}); - - base::Value::Dict params; - params.Set("foo_key", "foo"); - features.Set(kTestParamsFeatureName, std::move(params)); - - // Now override with command line flags. Command line flags should have the - // final say. - std::string enabled_features = std::string(kTestBooleanFeatureName) - .append(",") - .append(kTestBooleanFeatureName2); - - std::string disabled_features = std::string(kTestBooleanFeatureName4) - .append(",") - .append(kTestParamsFeatureName); - - InitializeFeatureList(features, experiments, enabled_features, - disabled_features, "", ""); - - // Test that features are properly enabled (they should match the - // DCS config). - ASSERT_TRUE(chromecast::IsFeatureEnabled(bool_feature)); - ASSERT_TRUE(chromecast::IsFeatureEnabled(bool_feature_2)); - ASSERT_TRUE(chromecast::IsFeatureEnabled(bool_feature_3)); - ASSERT_FALSE(chromecast::IsFeatureEnabled(bool_feature_4)); - - // Test that the params feature is disabled, and params are not set. - ASSERT_FALSE(chromecast::IsFeatureEnabled(params_feature)); - ASSERT_EQ("", - base::GetFieldTrialParamValueByFeature(params_feature, "foo_key")); -} - -TEST_F(CastFeaturesTest, SetEmptyExperiments) { - // Override those features with DCS configs. - base::Value::List experiments; - base::Value::Dict features; - - InitializeFeatureList(features, experiments, "", "", "", ""); - ASSERT_EQ(0u, GetDCSExperimentIds().size()); -} - -TEST_F(CastFeaturesTest, SetGoodExperiments) { - // Override those features with DCS configs. - base::Value::List experiments; - base::Value::Dict features; - - int32_t ids[] = {12345678, 123, 0, -1}; - std::unordered_set expected; - for (int32_t id : ids) { - experiments.Append(id); - expected.insert(id); - } - - InitializeFeatureList(features, experiments, "", "", "", ""); - ASSERT_EQ(expected, GetDCSExperimentIds()); -} - -TEST_F(CastFeaturesTest, SetSomeGoodExperiments) { - // Override those features with DCS configs. - base::Value::List experiments; - base::Value::Dict features; - experiments.Append(1234); - experiments.Append("foobar"); - experiments.Append(true); - experiments.Append(1); - experiments.Append(1.23456); - - std::unordered_set expected; - expected.insert(1234); - expected.insert(1); - - InitializeFeatureList(features, experiments, "", "", "", ""); - ASSERT_EQ(expected, GetDCSExperimentIds()); -} - -TEST_F(CastFeaturesTest, SetAllBadExperiments) { - // Override those features with DCS configs. - base::Value::List experiments; - base::Value::Dict features; - experiments.Append("foobar"); - experiments.Append(true); - experiments.Append(1.23456); - - std::unordered_set expected; - - InitializeFeatureList(features, experiments, "", "", "", ""); - ASSERT_EQ(expected, GetDCSExperimentIds()); -} - -TEST_F(CastFeaturesTest, GetOverriddenFeaturesForStorage) { - base::Value::Dict features; - features.Set("bool_key", false); - features.Set("bool_key_2", true); - - base::Value::Dict params; - params.Set("foo_key", "foo"); - params.Set("bar_key", "bar"); - params.Set("doub_key", 3.14159); - params.Set("long_doub_key", 1.234599999999999); - params.Set("int_key", 4242); - params.Set("negint_key", -273); - params.Set("bool_key", true); - features.Set("params_key", std::move(params)); - - auto dict = GetOverriddenFeaturesForStorage(features); - ASSERT_EQ(3u, dict.size()); - auto bval = dict.FindBool("bool_key"); - ASSERT_TRUE(bval.has_value()); - ASSERT_EQ(false, *bval); - bval = dict.FindBool("bool_key_2"); - ASSERT_TRUE(bval.has_value()); - ASSERT_EQ(true, *bval); - - const auto* dval = dict.FindDict("params_key"); - const std::string* sval = nullptr; - ASSERT_TRUE(dval); - ASSERT_EQ(7u, dval->size()); - sval = dval->FindString("foo_key"); - ASSERT_TRUE(sval); - ASSERT_EQ("foo", *sval); - sval = dval->FindString("bar_key"); - ASSERT_TRUE(sval); - ASSERT_EQ("bar", *sval); - sval = dval->FindString("doub_key"); - ASSERT_TRUE(sval); - ASSERT_EQ("3.14159", *sval); - sval = dval->FindString("long_doub_key"); - ASSERT_TRUE(sval); - ASSERT_EQ("1.234599999999999", *sval); - sval = dval->FindString("int_key"); - ASSERT_TRUE(sval); - ASSERT_EQ("4242", *sval); - sval = dval->FindString("negint_key"); - ASSERT_TRUE(sval); - ASSERT_EQ("-273", *sval); - sval = dval->FindString("bool_key"); - ASSERT_TRUE(sval); - ASSERT_EQ("true", *sval); -} - -TEST_F(CastFeaturesTest, GetOverriddenFeaturesForStorage_BadParams) { - base::Value::Dict features; - features.Set("bool_key", false); - features.Set("str_key", "foobar"); - features.Set("int_key", 12345); - features.Set("doub_key", 4.5678); - - base::Value::Dict params; - params.Set("foo_key", "foo"); - features.Set("params_key", std::move(params)); - - auto dict = GetOverriddenFeaturesForStorage(features); - ASSERT_EQ(2u, dict.size()); - auto bval = dict.FindBool("bool_key"); - ASSERT_TRUE(bval.has_value()); - ASSERT_EQ(false, *bval); - - const auto* dval = dict.FindDict("params_key"); - ASSERT_TRUE(dval); - ASSERT_EQ(1u, dval->size()); - const auto* sval = dval->FindString("foo_key"); - ASSERT_TRUE(sval); - ASSERT_EQ("foo", *sval); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/cast_paths.cc chromium-132.0.6834.159/chromecast/base/cast_paths.cc --- chromium-132.0.6834.110/chromecast/base/cast_paths.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/cast_paths.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,117 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/cast_paths.h" - -#include "base/base_paths.h" -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/logging.h" -#include "base/path_service.h" -#include "build/build_config.h" -#include "chromecast/chromecast_buildflags.h" -#include "third_party/widevine/cdm/buildflags.h" - -#if BUILDFLAG(IS_FUCHSIA) -#include "base/fuchsia/file_utils.h" -#endif - -#if BUILDFLAG(BUNDLE_WIDEVINE_CDM) -#include "third_party/widevine/cdm/widevine_cdm_common.h" // nogncheck -#endif - -namespace chromecast { - -bool PathProvider(int key, base::FilePath* result) { - switch (key) { - case DIR_CAST_HOME: { -#if BUILDFLAG(IS_FUCHSIA) - // On Fuchsia, use the component's local /data directory. - base::FilePath home(base::kPersistedDataDirectoryPath); -#else - base::FilePath home = base::GetHomeDir(); -#endif -#if BUILDFLAG(IS_CAST_DESKTOP_BUILD) - // When running a development instance as a regular user, use - // a data directory under $HOME (similar to Chrome). - *result = home.Append(".config/cast_shell"); -#else - // When running on the actual device, $HOME is set to the user's - // directory under the data partition. - *result = home; -#endif - return true; - } -#if BUILDFLAG(IS_ANDROID) - case FILE_CAST_ANDROID_LOG: { - base::FilePath base_dir; - CHECK(base::PathService::Get(base::DIR_ANDROID_APP_DATA, &base_dir)); - *result = base_dir.AppendASCII("cast_shell.log"); - return true; - } -#endif // BUILDFLAG(IS_ANDROID) - case FILE_CAST_CONFIG: { - base::FilePath data_dir; -#if BUILDFLAG(IS_ANDROID) - CHECK(base::PathService::Get(base::DIR_ANDROID_APP_DATA, &data_dir)); - *result = data_dir.Append("cast_shell.conf"); -#else - CHECK(base::PathService::Get(DIR_CAST_HOME, &data_dir)); - *result = data_dir.Append(".eureka.conf"); -#endif // BUILDFLAG(IS_ANDROID) - return true; - } - case FILE_CAST_CRL: { - base::FilePath data_dir; -#if BUILDFLAG(IS_ANDROID) - CHECK(base::PathService::Get(base::DIR_ANDROID_APP_DATA, &data_dir)); - *result = data_dir.Append("cast_shell.crl"); -#else - CHECK(base::PathService::Get(DIR_CAST_HOME, &data_dir)); - *result = data_dir.Append(".eureka.crl"); -#endif // BUILDFLAG(IS_ANDROID) - return true; - } - case FILE_CAST_PAK: { - base::FilePath base_dir; -#if BUILDFLAG(IS_ANDROID) - CHECK(base::PathService::Get(base::DIR_ANDROID_APP_DATA, &base_dir)); - *result = base_dir.Append("paks/cast_shell.pak"); -#else - CHECK(base::PathService::Get(base::DIR_ASSETS, &base_dir)); - *result = base_dir.Append("assets/cast_shell.pak"); -#endif // BUILDFLAG(IS_ANDROID) - return true; - } -#if BUILDFLAG(BUNDLE_WIDEVINE_CDM) - case DIR_BUNDLED_WIDEVINE_CDM: { - base::FilePath base_dir; - CHECK(base::PathService::Get(base::DIR_MODULE, &base_dir)); -#if !BUILDFLAG(IS_CAST_DESKTOP_BUILD) - base_dir = base_dir.AppendASCII("lib"); -#endif - *result = base_dir.AppendASCII(kWidevineCdmBaseDirectory); - return true; - } -#endif // BUILDFLAG(BUNDLE_WIDEVINE_CDM) - case FILE_CAST_BROWSER_CONFIG: { - base::FilePath data_dir; -#if BUILDFLAG(IS_ANDROID) - CHECK(base::PathService::Get(base::DIR_ANDROID_APP_DATA, &data_dir)); - *result = data_dir.Append("cast_browser.conf"); -#else - CHECK(base::PathService::Get(DIR_CAST_HOME, &data_dir)); - *result = data_dir.Append(".cast_browser.conf"); -#endif // BUILDFLAG(IS_ANDROID) - return true; - } - } - return false; -} - -void RegisterPathProvider() { - base::PathService::RegisterProvider(PathProvider, PATH_START, PATH_END); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/cast_paths.h chromium-132.0.6834.159/chromecast/base/cast_paths.h --- chromium-132.0.6834.110/chromecast/base/cast_paths.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/cast_paths.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,40 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_CAST_PATHS_H_ -#define CHROMECAST_BASE_CAST_PATHS_H_ - -#include "build/build_config.h" -#include "third_party/widevine/cdm/buildflags.h" - -// This file declares path keys for the chromecast module. These can be used -// with the PathService to access various special directories and files. - -namespace chromecast { - -enum { - PATH_START = 8000, - - DIR_CAST_HOME, // Return a modified $HOME which works for both - // development use and the actual device. - -#if BUILDFLAG(IS_ANDROID) - FILE_CAST_ANDROID_LOG, // Log file location for Android. -#endif - FILE_CAST_CONFIG, // Config/preferences file path. - FILE_CAST_CRL, // CRL persistent cache file path. - FILE_CAST_PAK, // cast_shell.pak file path. -#if BUILDFLAG(BUNDLE_WIDEVINE_CDM) - DIR_BUNDLED_WIDEVINE_CDM, -#endif - FILE_CAST_BROWSER_CONFIG, - PATH_END -}; - -// Call once to register the provider for the path keys defined above. -void RegisterPathProvider(); - -} // namespace chromecast - -#endif // CHROMECAST_BASE_CAST_PATHS_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/cast_resource.cc chromium-132.0.6834.159/chromecast/base/cast_resource.cc --- chromium-132.0.6834.110/chromecast/base/cast_resource.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/cast_resource.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,23 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/cast_resource.h" - -namespace chromecast { - -void CastResource::SetCastResourceClient(Client* client) { - client_ = client; -} - -void CastResource::RegisterWithClient() { - if (client_) - client_->RegisterCastResource(this); -} - -void CastResource::NotifyResourceReleased(Resource remain) { - if (client_) - client_->OnResourceReleased(this, remain); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/cast_resource.h chromium-132.0.6834.159/chromecast/base/cast_resource.h --- chromium-132.0.6834.110/chromecast/base/cast_resource.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/cast_resource.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,105 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_CAST_RESOURCE_H_ -#define CHROMECAST_BASE_CAST_RESOURCE_H_ - -#include "base/memory/raw_ptr.h" - -namespace chromecast { - -// A CastResource is a user of 1 or more Resources (primary screen, audio, -// etc). As a user, it is responsible for doing any cast-specific component -// initialization when the Resources it uses are granted. This initialization -// is referred to as "acquiring" the Resources. Conversely, when the Resources -// it uses are revoked, it must deinitialize these cast-specific components. -// This deinitialization is referred to as "releasing" the Resources. -// TODO(maclellant): RENAME/DESIGN THIS CLASS IN COMING REFACTOR. -class CastResource { - public: - // Resources necessary to run cast apps. CastResource may contain union of the - // following types. - // TODO(yucliu): Split video resources and graphic resources. - enum Resource { - kResourceNone = 0, - // All resources necessary to render sounds, for example, audio pipeline, - // speaker, etc. - kResourceAudio = 1 << 0, - // All resources necessary to render videos or images, for example, video - // pipeline, primary graphics plane, display, etc. - kResourceScreenPrimary = 1 << 1, - // All resources necessary to render overlaid images, for example, secondary - // graphics plane, LCD, etc. - kResourceScreenSecondary = 1 << 2, - // Collection of resources used for display only combined with bitwise or. - kResourceDisplayOnly = (kResourceScreenPrimary | kResourceScreenSecondary), - // Collection of all resources combined with bitwise or. - kResourceAll = - (kResourceAudio | kResourceScreenPrimary | kResourceScreenSecondary), - }; - - // A Client is responsible for notifying all registered CastResource's when - // Resources are granted/revoked so that they can acquire/release those - // Resources. When a CastResource is done acquiring/releasing, it responds - // to the Client that it has completed. A Client can have multiple registered - // CastResource's, but each CastResouce has 1 Client that it responds to. - class Client { - public: - // Called to register a CastResource with a Client. After registering, a - // CastResource will start getting notified when to acquire/release - // Resources. The Client does not take ownership of |cast_resource|. It can - // be called from any thread. - virtual void RegisterCastResource(CastResource* cast_resource) = 0; - - // TODO(esum): Add OnResourceAcquired() here once AcquireResource is - // allowed to be asynchronous. - - // Called when part or all resources are released. It can be called from any - // thread. - // |cast_resource| the CastResource that is released. The pointer may be - // invalid. Client can't call functions with that pointer. - // |remain| the unreleased resource of CastResource. If kResourceNone is - // returned, Client will remove the resource from its watching - // list. - virtual void OnResourceReleased(CastResource* cast_resource, - Resource remain) = 0; - - protected: - virtual ~Client() {} - }; - - CastResource(const CastResource&) = delete; - CastResource& operator=(const CastResource&) = delete; - - // Sets the Client for the CastResource to respond to when it is done with - // Acquire/ReleaseResource. - void SetCastResourceClient(Client* client); - // Called to acquire resources after OEM has granted them, and before - // they start getting used by consumers. Implementation must be synchronous - // since consumers will start using the resource immediately afterwards. - // TODO(esum): We should allow this method to be asynchronous in case an - // implementer needs to make expensive calls and doesn't want to block the - // UI thread (b/26239576). For now, don't do anything expensive in your - // implementation; if you really need to, then this bug has to be resolved. - virtual void AcquireResource(Resource resource) = 0; - // Called to release resources. Implementation should call - // Client::OnResourceReleased when resource is released on its side. - virtual void ReleaseResource(Resource resource) = 0; - - protected: - CastResource() : client_(nullptr) {} - virtual ~CastResource() {} - - // For derived classes to register themselves with their Client through - // Client::RegisterCastResource. - void RegisterWithClient(); - void NotifyResourceReleased(Resource remain); - - private: - raw_ptr client_; -}; - -} // namespace chromecast - -#endif // CHROMECAST_BASE_CAST_RESOURCE_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/cast_sys_info_android.cc chromium-132.0.6834.159/chromecast/base/cast_sys_info_android.cc --- chromium-132.0.6834.110/chromecast/base/cast_sys_info_android.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/cast_sys_info_android.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,128 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/cast_sys_info_android.h" - -#include -#include -#include - -#include "base/android/build_info.h" -#include "base/android/jni_android.h" -#include "base/android/jni_string.h" -#include "base/system/sys_info.h" -#include "chromecast/base/cast_sys_info_util.h" -#include "chromecast/base/version.h" - -// Must come after all headers that specialize FromJniType() / ToJniType(). -#include "chromecast/base/jni_headers/CastSysInfoAndroid_jni.h" - -namespace chromecast { - -CastSysInfoAndroid::CastSysInfoAndroid() - : build_info_(base::android::BuildInfo::GetInstance()) {} - -CastSysInfoAndroid::~CastSysInfoAndroid() {} - -CastSysInfo::BuildType CastSysInfoAndroid::GetBuildType() { - return CAST_IS_DEBUG_BUILD() ? BUILD_ENG : BUILD_PRODUCTION; -} - -std::string CastSysInfoAndroid::GetSerialNumber() { - JNIEnv* env = base::android::AttachCurrentThread(); - return base::android::ConvertJavaStringToUTF8( - Java_CastSysInfoAndroid_getSerialNumber(env)); -} - -std::string CastSysInfoAndroid::GetProductName() { - return build_info_->device(); -} - -std::string CastSysInfoAndroid::GetDeviceModel() { - return build_info_->model(); -} - -std::string CastSysInfoAndroid::GetManufacturer() { - return build_info_->manufacturer(); -} - -std::string CastSysInfoAndroid::GetSystemBuildNumber() { - return base::SysInfo::GetAndroidBuildID(); -} - -std::string CastSysInfoAndroid::GetSystemReleaseChannel() { - return ""; -} - -std::string CastSysInfoAndroid::GetBoardName() { - JNIEnv* env = base::android::AttachCurrentThread(); - return base::android::ConvertJavaStringToUTF8( - Java_CastSysInfoAndroid_getBoard(env)); -} - -std::string CastSysInfoAndroid::GetBoardRevision() { - return ""; -} - -std::string CastSysInfoAndroid::GetFactoryCountry() { - return GetAndroidProperty("ro.boot.wificountrycode", ""); -} - -std::vector CastSysInfoAndroid::GetFactoryLocaleList() { - const std::string factory_locale_list = - GetAndroidProperty("ro.product.factory_locale_list", ""); - if (!factory_locale_list.empty()) { - std::vector results; - std::stringstream stream(factory_locale_list); - while (stream.good()) { - std::string locale; - getline(stream, locale, ','); - results.push_back(locale); - } - if (!results.empty()) { - return results; - } - } - // This duplicates the read-only property portion of - // frameworks/base/core/jni/AndroidRuntime.cpp in the Android tree, which is - // effectively the "factory locale", i.e. the locale chosen by Android - // assuming the other persist.sys.* properties are not set. - const std::string locale = GetAndroidProperty("ro.product.locale", ""); - if (!locale.empty()) { - return {locale}; - } - - const std::string language = - GetAndroidProperty("ro.product.locale.language", "en"); - const std::string region = - GetAndroidProperty("ro.product.locale.region", "US"); - return {language + "-" + region}; -} - -std::string CastSysInfoAndroid::GetWifiInterface() { - return ""; -} - -std::string CastSysInfoAndroid::GetApInterface() { - return ""; -} - -std::string CastSysInfoAndroid::GetProductSsidSuffix() { - return GetAndroidProperty("ro.odm.cast.ssid_suffix", ""); -} - -std::string CastSysInfoAndroid::GetAndroidProperty( - const std::string& key, - const std::string& default_value) { - char value[PROP_VALUE_MAX]; - int ret = __system_property_get(key.c_str(), value); - if (ret <= 0) { - DVLOG(1) << "No value set for property: " << key; - return default_value; - } - - return std::string(value); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/cast_sys_info_android.h chromium-132.0.6834.159/chromecast/base/cast_sys_info_android.h --- chromium-132.0.6834.110/chromecast/base/cast_sys_info_android.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/cast_sys_info_android.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_CAST_SYS_INFO_ANDROID_H_ -#define CHROMECAST_BASE_CAST_SYS_INFO_ANDROID_H_ - -#include -#include - -#include "chromecast/public/cast_sys_info.h" - -namespace base { -namespace android { -class BuildInfo; -} -} - -namespace chromecast { - -class CastSysInfoAndroid : public CastSysInfo { - public: - CastSysInfoAndroid(); - - CastSysInfoAndroid(const CastSysInfoAndroid&) = delete; - CastSysInfoAndroid& operator=(const CastSysInfoAndroid&) = delete; - - ~CastSysInfoAndroid() override; - - // CastSysInfo implementation: - BuildType GetBuildType() override; - std::string GetSerialNumber() override; - std::string GetProductName() override; - std::string GetDeviceModel() override; - std::string GetManufacturer() override; - std::string GetSystemBuildNumber() override; - std::string GetSystemReleaseChannel() override; - std::string GetBoardName() override; - std::string GetBoardRevision() override; - std::string GetFactoryCountry() override; - std::vector GetFactoryLocaleList() override; - std::string GetWifiInterface() override; - std::string GetApInterface() override; - std::string GetProductSsidSuffix() override; - - static std::string GetAndroidProperty(const std::string& key, - const std::string& default_value); - - private: - const base::android::BuildInfo* const build_info_; -}; - -} // namespace chromecast - -#endif // CHROMECAST_BASE_CAST_SYS_INFO_ANDROID_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/cast_sys_info_android_factory.cc chromium-132.0.6834.159/chromecast/base/cast_sys_info_android_factory.cc --- chromium-132.0.6834.110/chromecast/base/cast_sys_info_android_factory.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/cast_sys_info_android_factory.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,16 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/cast_sys_info_android.h" - -#include - -namespace chromecast { - -// static -std::unique_ptr CreateSysInfo() { - return std::make_unique(); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/cast_sys_info_dummy.cc chromium-132.0.6834.159/chromecast/base/cast_sys_info_dummy.cc --- chromium-132.0.6834.110/chromecast/base/cast_sys_info_dummy.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/cast_sys_info_dummy.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,202 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/cast_sys_info_dummy.h" - -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/json/json_reader.h" -#include "base/logging.h" - -namespace chromecast { - -namespace { -const char kJsonKeyProductName[] = "product_name"; -const char kJsonKeySerialNumber[] = "serial_number"; -const char kJsonKeyDeviceModel[] = "device_model"; -const char kJsonKeyManufacture[] = "manufacturer"; - -const char kDefaultProductName[] = "cast_shell"; -const char kDefaultSerialNumber[] = "dummy.serial.number"; -const char kDefaultDeviceModel[] = "dummy model"; -const char kDefaultManufacturer[] = "google"; - -std::string GetStringValue(const base::Value& sys_info_file, - const std::string& key, - const std::string& default_val) { - DCHECK(sys_info_file.is_dict()); - - const std::string* val = sys_info_file.GetDict().FindString(key); - if (!val) { - LOG(WARNING) << "Json key not found: " << key; - return default_val; - } - return *val; -} -} // namespace - -CastSysInfoDummy::CastSysInfoDummy() - : build_type_(BUILD_ENG), - serial_number_("dummy.serial.number"), - product_name_("cast_shell"), - device_model_("dummy model"), - board_name_("dummy board"), - manufacturer_("google"), - system_build_number_(__DATE__ " - " __TIME__), - factory_country_("US"), - factory_locale_list_({"en-US"}) {} - -CastSysInfoDummy::CastSysInfoDummy(const std::string& sys_info_file) - : CastSysInfoDummy() { - std::string content; - if (!base::ReadFileToString(base::FilePath(sys_info_file), &content)) { - LOG(ERROR) << "Failed to read sys info file: " << sys_info_file; - return; - } - - auto value = base::JSONReader::Read(content); - if (!value || !value->is_dict()) { - LOG(ERROR) - << "Invaild sys info json file, using the default values instead."; - return; - } - - product_name_ = - GetStringValue(*value, kJsonKeyProductName, kDefaultProductName); - serial_number_ = - GetStringValue(*value, kJsonKeySerialNumber, kDefaultSerialNumber); - device_model_ = - GetStringValue(*value, kJsonKeyDeviceModel, kDefaultDeviceModel); - manufacturer_ = - GetStringValue(*value, kJsonKeyManufacture, kDefaultManufacturer); -} - -CastSysInfoDummy::~CastSysInfoDummy() {} - -CastSysInfo::BuildType CastSysInfoDummy::GetBuildType() { - return build_type_; -} - -std::string CastSysInfoDummy::GetSystemReleaseChannel() { - return system_release_channel_; -} - -std::string CastSysInfoDummy::GetSerialNumber() { - return serial_number_; -} - -std::string CastSysInfoDummy::GetProductName() { - return product_name_; -} - -std::string CastSysInfoDummy::GetDeviceModel() { - return device_model_; -} - -std::string CastSysInfoDummy::GetBoardName() { - return board_name_; -} - -std::string CastSysInfoDummy::GetBoardRevision() { - return board_revision_; -} - -std::string CastSysInfoDummy::GetManufacturer() { - return manufacturer_; -} - -std::string CastSysInfoDummy::GetSystemBuildNumber() { - return system_build_number_; -} - -std::string CastSysInfoDummy::GetFactoryCountry() { - return factory_country_; -} - -std::vector CastSysInfoDummy::GetFactoryLocaleList() { - return factory_locale_list_; -} - -std::string CastSysInfoDummy::GetWifiInterface() { - return wifi_interface_; -} - -std::string CastSysInfoDummy::GetApInterface() { - return ap_interface_; -} - -std::string CastSysInfoDummy::GetProductSsidSuffix() { - return ssid_suffix_; -} - -void CastSysInfoDummy::SetBuildTypeForTesting( - CastSysInfo::BuildType build_type) { - build_type_ = build_type; -} - -void CastSysInfoDummy::SetSystemReleaseChannelForTesting( - const std::string& system_release_channel) { - system_release_channel_ = system_release_channel; -} - -void CastSysInfoDummy::SetSerialNumberForTesting( - const std::string& serial_number) { - serial_number_ = serial_number; -} - -void CastSysInfoDummy::SetProductNameForTesting( - const std::string& product_name) { - product_name_ = product_name; -} - -void CastSysInfoDummy::SetDeviceModelForTesting( - const std::string& device_model) { - device_model_ = device_model; -} - -void CastSysInfoDummy::SetBoardNameForTesting(const std::string& board_name) { - board_name_ = board_name; -} - -void CastSysInfoDummy::SetBoardRevisionForTesting( - const std::string& board_revision) { - board_revision_ = board_revision; -} - -void CastSysInfoDummy::SetManufacturerForTesting( - const std::string& manufacturer) { - manufacturer_ = manufacturer; -} - -void CastSysInfoDummy::SetSystemBuildNumberForTesting( - const std::string& system_build_number) { - system_build_number_ = system_build_number; -} - -void CastSysInfoDummy::SetFactoryCountryForTesting( - const std::string& factory_country) { - factory_country_ = factory_country; -} - -void CastSysInfoDummy::SetFactoryLocaleListForTesting( - const std::vector& factory_locale_list) { - factory_locale_list_ = factory_locale_list; -} - -void CastSysInfoDummy::SetWifiInterfaceForTesting( - const std::string& wifi_interface) { - wifi_interface_ = wifi_interface; -} - -void CastSysInfoDummy::SetApInterfaceForTesting( - const std::string& ap_interface) { - ap_interface_ = ap_interface; -} - -void CastSysInfoDummy::SetProductSsidSuffixForTesting( - const std::string& ssid_suffix) { - ssid_suffix_ = ssid_suffix; -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/cast_sys_info_dummy.h chromium-132.0.6834.159/chromecast/base/cast_sys_info_dummy.h --- chromium-132.0.6834.110/chromecast/base/cast_sys_info_dummy.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/cast_sys_info_dummy.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,79 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_CAST_SYS_INFO_DUMMY_H_ -#define CHROMECAST_BASE_CAST_SYS_INFO_DUMMY_H_ - -#include - -// Note(slan): This file is needed by internal targets which cannot depend on -// "//base". Amend this include with a comment so gn check ignores it. -#include "chromecast/public/cast_sys_info.h" - -namespace chromecast { - -// Dummy implementation of CastSysInfo. Fields can be overwritten for test. -class CastSysInfoDummy : public CastSysInfo { - public: - CastSysInfoDummy(); - CastSysInfoDummy(const std::string& sys_info_file); - - CastSysInfoDummy(const CastSysInfoDummy&) = delete; - CastSysInfoDummy& operator=(const CastSysInfoDummy&) = delete; - - ~CastSysInfoDummy() override; - - // CastSysInfo implementation: - BuildType GetBuildType() override; - std::string GetSystemReleaseChannel() override; - std::string GetSerialNumber() override; - std::string GetProductName() override; - std::string GetDeviceModel() override; - std::string GetBoardName() override; - std::string GetBoardRevision() override; - std::string GetManufacturer() override; - std::string GetSystemBuildNumber() override; - std::string GetFactoryCountry() override; - std::vector GetFactoryLocaleList() override; - std::string GetWifiInterface() override; - std::string GetApInterface() override; - std::string GetProductSsidSuffix() override; - - void SetBuildTypeForTesting(BuildType build_type); - void SetSystemReleaseChannelForTesting( - const std::string& system_release_channel); - void SetSerialNumberForTesting(const std::string& serial_number); - void SetProductNameForTesting(const std::string& product_name); - void SetDeviceModelForTesting(const std::string& device_model); - void SetBoardNameForTesting(const std::string& board_name); - void SetBoardRevisionForTesting(const std::string& board_revision); - void SetManufacturerForTesting(const std::string& manufacturer); - void SetSystemBuildNumberForTesting(const std::string& system_build_number); - void SetFactoryCountryForTesting(const std::string& factory_country); - void SetFactoryLocaleListForTesting( - const std::vector& factory_locale_list); - void SetWifiInterfaceForTesting(const std::string& wifi_interface); - void SetApInterfaceForTesting(const std::string& ap_interface); - void SetProductSsidSuffixForTesting(const std::string& ssid_suffix); - - private: - BuildType build_type_; - std::string system_release_channel_; - std::string serial_number_; - std::string product_name_; - std::string device_model_; - std::string board_name_; - std::string board_revision_; - std::string manufacturer_; - std::string system_build_number_; - std::string factory_country_; - std::vector factory_locale_list_; - std::string wifi_interface_; - std::string ap_interface_; - std::string ssid_suffix_; -}; - -} // namespace chromecast - -#endif // CHROMECAST_BASE_CAST_SYS_INFO_DUMMY_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/cast_sys_info_shlib.cc chromium-132.0.6834.159/chromecast/base/cast_sys_info_shlib.cc --- chromium-132.0.6834.110/chromecast/base/cast_sys_info_shlib.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/cast_sys_info_shlib.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,27 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/public/cast_sys_info_shlib.h" - -#include "base/command_line.h" -#include "chromecast/base/cast_sys_info_dummy.h" -#include "chromecast/base/chromecast_switches.h" -#include "chromecast/base/init_command_line_shlib.h" - -namespace chromecast { - -// static -CastSysInfo* CastSysInfoShlib::Create(const std::vector& argv) { - InitCommandLineShlib(argv); - auto* cmd_line = base::CommandLine::ForCurrentProcess(); - - if (cmd_line->HasSwitch(switches::kSysInfoFilePath)) { - return new CastSysInfoDummy( - cmd_line->GetSwitchValueASCII(switches::kSysInfoFilePath)); - } - - return new CastSysInfoDummy(); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/cast_sys_info_util.h chromium-132.0.6834.159/chromecast/base/cast_sys_info_util.h --- chromium-132.0.6834.110/chromecast/base/cast_sys_info_util.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/cast_sys_info_util.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_CAST_SYS_INFO_UTIL_H_ -#define CHROMECAST_BASE_CAST_SYS_INFO_UTIL_H_ - -#include -#include - -namespace chromecast { - -class CastSysInfo; - -std::unique_ptr CreateSysInfo(); - -} // namespace chromecast - -#endif // CHROMECAST_BASE_CAST_SYS_INFO_UTIL_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/cast_sys_info_util_shlib.cc chromium-132.0.6834.159/chromecast/base/cast_sys_info_util_shlib.cc --- chromium-132.0.6834.110/chromecast/base/cast_sys_info_util_shlib.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/cast_sys_info_util_shlib.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include - -#include "base/command_line.h" -#include "base/memory/ptr_util.h" -#include "chromecast/base/cast_sys_info_util.h" -#include "chromecast/public/cast_sys_info_shlib.h" -#include "chromecast/public/cast_sys_info.h" - -namespace chromecast { - -std::unique_ptr CreateSysInfo() { - base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); - return base::WrapUnique(CastSysInfoShlib::Create(command_line->argv())); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/cast_sys_info_util_simple.cc chromium-132.0.6834.159/chromecast/base/cast_sys_info_util_simple.cc --- chromium-132.0.6834.110/chromecast/base/cast_sys_info_util_simple.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/cast_sys_info_util_simple.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,18 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include - -#include "chromecast/base/cast_sys_info_util.h" - -#include "chromecast/base/cast_sys_info_dummy.h" - -namespace chromecast { - -// static -std::unique_ptr CreateSysInfo() { - return std::make_unique(); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/chromecast_switches.cc chromium-132.0.6834.159/chromecast/base/chromecast_switches.cc --- chromium-132.0.6834.110/chromecast/base/chromecast_switches.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/chromecast_switches.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,343 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/chromecast_switches.h" - -#include "base/command_line.h" -#include "base/logging.h" -#include "base/strings/string_number_conversions.h" - -namespace switches { - -// Value indicating whether flag from command line switch is true. -const char kSwitchValueTrue[] = "true"; - -// Value indicating whether flag from command line switch is false. -const char kSwitchValueFalse[] = "false"; - -// Server url to upload crash data to. -// Default is "https://clients2.google.com/cr/report" for prod devices. -// Default is "https://clients2.google.com/cr/staging_report" for non prod. -const char kCrashServerUrl[] = "crash-server-url"; - -// Switch to enable daemon-mode in crash_uploader. -const char kCrashUploaderDaemon[] = "daemon"; - -// Switch to disable Crash reporting -const char kDisableCrashReporter[] = "disable-crash-reporter"; - -// Switch to disable Crashpad forwarding -const char kDisableCrashpadForwarding[] = "disable-crashpad-forwarding"; - -// Switch to dumpstate binary path. -const char kDumpstateBinPath[] = "dumpstate-path"; - -// Enable file accesses. It should not be enabled for most Cast devices. -const char kEnableLocalFileAccesses[] = "enable-local-file-accesses"; - -// Override the URL to which metrics logs are sent for debugging. -const char kOverrideMetricsUploadUrl[] = "override-metrics-upload-url"; - -// Only connect to WLAN interfaces. -const char kRequireWlan[] = "require-wlan"; - -// Pass the app id information to the renderer process, to be used for logging. -// last-launched-app should be the app that just launched and is spawning the -// renderer. -const char kLastLaunchedApp[] = "last-launched-app"; -// previous-app should be the app that was running when last-launched-app -// started. -const char kPreviousApp[] = "previous-app"; - -// Flag indicating that a resource provider must be set up to provide cast -// receiver with resources. Apps cannot start until provided resources. -// This flag implies --alsa-check-close-timeout=0. -const char kAcceptResourceProvider[] = "accept-resource-provider"; - -// Name of the device the amp mixer should be opened on. If this flag is not -// specified it will default to the same device as kAlsaVolumeDeviceName. -const char kAlsaAmpDeviceName[] = "alsa-amp-device-name"; - -// Name of the simple mixer control element that the ALSA-based media library -// should use to toggle powersave mode on the system. -const char kAlsaAmpElementName[] = "alsa-amp-element-name"; - -// Time in ms to wait before closing the PCM handle when no more mixer inputs -// remain. Assumed to be 0 if --accept-resource-provider is present. -const char kAlsaCheckCloseTimeout[] = "alsa-check-close-timeout"; - -// Flag that enables resampling audio with sample rate below 32kHz up to 48kHz. -// Should be set to true for internal audio products. -const char kAlsaEnableUpsampling[] = "alsa-enable-upsampling"; - -// Optional flag to set a fixed sample rate for the alsa device. -// Deprecated: Use --audio-output-sample-rate instead. -const char kAlsaFixedOutputSampleRate[] = "alsa-fixed-output-sample-rate"; - -// Name of the device the mute mixer should be opened on. If this flag is not -// specified it will default to the same device as kAlsaVolumeDeviceName. -const char kAlsaMuteDeviceName[] = "alsa-mute-device-name"; - -// Name of the simple mixer control element that the ALSA-based media library -// should use to mute the system. -const char kAlsaMuteElementName[] = "alsa-mute-element-name"; - -// Minimum number of available frames for scheduling a transfer. -const char kAlsaOutputAvailMin[] = "alsa-output-avail-min"; - -// Size of the ALSA output buffer in frames. This directly sets the latency of -// the output device. Latency can be calculated by multiplying the sample rate -// by the output buffer size. -const char kAlsaOutputBufferSize[] = "alsa-output-buffer-size"; - -// Size of the ALSA output period in frames. The period of an ALSA output device -// determines how many frames elapse between hardware interrupts. -const char kAlsaOutputPeriodSize[] = "alsa-output-period-size"; - -// How many frames need to be in the output buffer before output starts. -const char kAlsaOutputStartThreshold[] = "alsa-output-start-threshold"; - -// Name of the device the volume control mixer should be opened on. Will use the -// same device as kAlsaOutputDevice and fall back to "default" if -// kAlsaOutputDevice is not supplied. -const char kAlsaVolumeDeviceName[] = "alsa-volume-device-name"; - -// Name of the simple mixer control element that the ALSA-based media library -// should use to control the volume. -const char kAlsaVolumeElementName[] = "alsa-volume-element-name"; - -// Number of audio output channels. This will be used to send audio buffer with -// specific number of channels to ALSA and generate loopback audio. Default -// value is 2. -const char kAudioOutputChannels[] = "audio-output-channels"; - -// Specify fixed sample rate for audio output stream. If this flag is not -// specified the StreamMixer will choose sample rate based on the sample rate of -// the media stream. -const char kAudioOutputSampleRate[] = "audio-output-sample-rate"; - -// Calibrated max output volume dBa for voice content at 1 meter, if known. -const char kMaxOutputVolumeDba1m[] = "max-output-volume-dba1m"; - -// Enable dynamically changing the channel count in the mixer depending on the -// input streams. -const char kMixerEnableDynamicChannelCount[] = - "mixer-enable-dynamic-channel-count"; - -// Specify the start threshold frames for audio output when using our mixer. -// This is mostly used to override the default value to a larger value, for -// platforms that can't handle the default start threshold without running into -// audio underruns. -const char kMixerSourceAudioReadyThresholdMs[] = - "mixer-source-audio-ready-threshold-ms"; - -// Specify the buffer size for audio output when using our mixer. This is mostly -// used to override the default value to a larger value, for platforms that -// can't handle an audio buffer so small without running into audio underruns. -const char kMixerSourceInputQueueMs[] = "mixer-source-input-queue-ms"; - -// Some platforms typically have very little 'free' memory, but plenty is -// available in buffers+cached. For such platforms, configure this amount -// as the portion of buffers+cached memory that should be treated as -// unavailable. If this switch is not used, a simple pressure heuristic based -// purely on free memory will be used. -const char kMemPressureSystemReservedKb[] = "mem-pressure-system-reserved-kb"; - -// Used to pass initial screen resolution to GPU process. This allows us to set -// screen size correctly (so no need to resize when first window is created). -const char kCastInitialScreenWidth[] = "cast-initial-screen-width"; -const char kCastInitialScreenHeight[] = "cast-initial-screen-height"; -const char kGraphicsBufferCount[] = "graphics-buffer-count"; - -// Overrides the vsync interval used by the GPU process to refresh the display. -const char kVSyncInterval[] = "vsync-interval"; - -// When present, desktop cast_shell will create 1080p window (provided display -// resolution is high enough). Otherwise, cast_shell defaults to 720p. -const char kDesktopWindow1080p[] = "desktop-window-1080p"; - -// When present overrides the screen resolution used by CanDisplayType API, -// instead of using the values obtained from avsettings. -const char kForceMediaResolutionHeight[] = "force-media-resolution-height"; -const char kForceMediaResolutionWidth[] = "force-media-resolution-width"; - -// Enables input event handling by the window manager. -const char kEnableInput[] = "enable-input"; - -// Background color used when Chromium hasn't rendered anything yet. -const char kCastAppBackgroundColor[] = "cast-app-background-color"; - -// The number of pixels from the very left or right of the screen to consider as -// a valid origin for the left or right swipe gesture. Overrides the default -// value in cast_system_gesture_handler.cc. -const char kSystemGestureStartWidth[] = "system-gesture-start-width"; - -// The number of pixels from the very top or bottom of the screen to consider as -// a valid origin for the top or bottom swipe gesture. Overrides the default -// value in cast_system_gesture_handler.cc. -const char kSystemGestureStartHeight[] = "system-gesture-start-height"; - -// The number of pixels up from the bottom of the screen to consider as a valid -// origin for a bottom swipe gesture. If set, overrides the value of both the -// above system-gesture-start-height flag and the default value in -// cast_system_gesture_handler.cc. -const char kBottomSystemGestureStartHeight[] = "bottom-gesture-start-height"; - -// The number of pixels from the start of a left swipe gesture to consider as a -// 'back' gesture. -const char kBackGestureHorizontalThreshold[] = - "back-gesture-horizontal-threshold"; - -// Whether to enable detection and dispatch of a 'drag from the top' gesture. -const char kEnableTopDragGesture[] = "enable-top-drag-gesture"; - -// Whether in hospitality mode -const char kManagedMode[] = "managed-mode"; - -// Endpoint that the mixer service listens on. This is a path for a UNIX domain -// socket (default is /tmp/mixer-service). -const char kMixerServiceEndpoint[] = "mixer-service-endpoint"; - -// TCP port that the mixer service listens on on non-Linux platforms. -// (default 12854). -const char kMixerServicePort[] = "mixer-service-port"; - -extern const char kCastMemoryPressureCriticalFraction[] = - "memory-pressure-critical-fraction"; -extern const char kCastMemoryPressureModerateFraction[] = - "memory-pressure-moderate-fraction"; - -// Rather than use the renderer hosted remotely in the media service, fall back -// to the default renderer within content_renderer. Does not change the behavior -// of the media service. -const char kDisableMojoRenderer[] = "disable-mojo-renderer"; - -// Forces the use of the mojo renderer. In other words, the renderer process -// will run a mojo renderer and CastRenderer will run in the browser process. -// This is necessary for devices that use CastRenderer. -// -// For this flag to have any effect, note that you must build the cast web -// runtime with the gn arg "enable_cast_renderer" set to true, and "renderer" -// must be included in the list "mojo_media_services". -// -// This flag has lower priority than "disable-mojo-renderer". -const char kForceMojoRenderer[] = "force-mojo-renderer"; - -// Per-product customization of force update UI remote url, also used in -// testing. -const char kForceUpdateRemoteUrl[] = "force-update-remote-url"; - -// System info file path. Default is an empty string, which -// means that dummy info will be used. -const char kSysInfoFilePath[] = "sys-info-file-path"; - -// Defer initialization of the base::FeatureList in an external service process, -// allowing the process to include its own non-default features. -const char kDeferFeatureList[] = "defer-feature-list"; - -// Rather than share a common pref config file with cast_service, use a -// dedicated browser pref config file. This must be set when `cast_browser` is -// running in a different process from `cast_service`. -const char kUseCastBrowserPrefConfig[] = "use-cast-browser-pref-config"; - -// Creates the service broker inside of this process. Only one process should -// host the service broker. -const char kInProcessBroker[] = "in-process-broker"; - -// Command-line arg to change the Unix domain socket path to connect to the -// Cast Mojo broker. -const char kCastMojoBrokerPath[] = "cast-mojo-broker-path"; - -} // namespace switches - -namespace chromecast { - -bool GetSwitchValueBoolean(const std::string& switch_string, - const bool default_value) { - const base::CommandLine* command_line = - base::CommandLine::ForCurrentProcess(); - if (command_line->HasSwitch(switch_string)) { - if (command_line->GetSwitchValueASCII(switch_string) != - switches::kSwitchValueTrue && - command_line->GetSwitchValueASCII(switch_string) != - switches::kSwitchValueFalse && - command_line->GetSwitchValueASCII(switch_string) != "") { - LOG(WARNING) << "Invalid switch value " << switch_string << "=" - << command_line->GetSwitchValueASCII(switch_string) - << "; assuming default value of " << default_value; - return default_value; - } - return command_line->GetSwitchValueASCII(switch_string) != - switches::kSwitchValueFalse; - } - return default_value; -} - -int GetSwitchValueInt(const std::string& switch_name, const int default_value) { - const base::CommandLine* command_line = - base::CommandLine::ForCurrentProcess(); - if (!command_line->HasSwitch(switch_name)) { - return default_value; - } - - int arg_value; - if (!base::StringToInt(command_line->GetSwitchValueASCII(switch_name), - &arg_value)) { - LOG(DFATAL) << "--" << switch_name << " only accepts integers as arguments"; - return default_value; - } - return arg_value; -} - -int GetSwitchValueNonNegativeInt(const std::string& switch_name, - const int default_value) { - DCHECK_GE(default_value, 0) - << "--" << switch_name << " must have a non-negative default value"; - - int value = GetSwitchValueInt(switch_name, default_value); - if (value < 0) { - LOG(DFATAL) << "--" << switch_name << " must have a non-negative value"; - return default_value; - } - return value; -} - -double GetSwitchValueDouble(const std::string& switch_name, - const double default_value) { - const base::CommandLine* command_line = - base::CommandLine::ForCurrentProcess(); - if (!command_line->HasSwitch(switch_name)) { - return default_value; - } - - double arg_value; - if (!base::StringToDouble(command_line->GetSwitchValueASCII(switch_name), - &arg_value)) { - LOG(DFATAL) << "--" << switch_name << " only accepts numbers as arguments"; - return default_value; - } - return arg_value; -} - -uint32_t GetSwitchValueColor(const std::string& switch_name, - const uint32_t default_value) { - const base::CommandLine* command_line = - base::CommandLine::ForCurrentProcess(); - if (!command_line->HasSwitch(switch_name)) { - return default_value; - } - - uint32_t arg_value = 0; - if (!base::HexStringToUInt( - command_line->GetSwitchValueASCII(switch_name).substr(1), - &arg_value)) { - LOG(ERROR) << "Invalid value for " << switch_name << " (" - << command_line->GetSwitchValueASCII(switch_name) - << "), using default."; - return default_value; - } - return arg_value; -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/chromecast_switches.h chromium-132.0.6834.159/chromecast/base/chromecast_switches.h --- chromium-132.0.6834.110/chromecast/base/chromecast_switches.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/chromecast_switches.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,156 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_CHROMECAST_SWITCHES_H_ -#define CHROMECAST_BASE_CHROMECAST_SWITCHES_H_ - -#include -#include - -#include "build/build_config.h" - -namespace switches { - -// Switch values -extern const char kSwitchValueTrue[]; -extern const char kSwitchValueFalse[]; - -// Switches for crash_uploader -extern const char kCrashServerUrl[]; -extern const char kCrashUploaderDaemon[]; - -// Disable Crash Reporting -extern const char kDisableCrashReporter[]; - -// Disable Crashpad forwarding -extern const char kDisableCrashpadForwarding[]; - -// Path to dumpstate binary to be used for crash reporting. -// This gives Chromium's crash reporter the flexibility to switch -// between multiple implementations of dumpstate tool. -extern const char kDumpstateBinPath[]; - -// Content-implementation switches -extern const char kEnableLocalFileAccesses[]; - -// Metrics switches -extern const char kOverrideMetricsUploadUrl[]; - -// Network switches -extern const char kRequireWlan[]; - -// Switches to communicate app state information -extern const char kLastLaunchedApp[]; -extern const char kPreviousApp[]; - -// Cast Receiver switches -extern const char kAcceptResourceProvider[]; - -// ALSA-based CMA switches. (Only valid for audio products.) -// TODO(sergeyu): kAlsaEnableUpsampling and kAlsaCheckCloseTimeout are -// implemented in StreamMixer, which is not ALSA-specific - it's also used on -// Fuchsia. Rename these flags. -extern const char kAlsaAmpDeviceName[]; -extern const char kAlsaAmpElementName[]; -extern const char kAlsaCheckCloseTimeout[]; -extern const char kAlsaEnableUpsampling[]; -extern const char kAlsaFixedOutputSampleRate[]; -extern const char kAlsaMuteDeviceName[]; -extern const char kAlsaMuteElementName[]; -extern const char kAlsaOutputAvailMin[]; -extern const char kAlsaOutputBufferSize[]; -extern const char kAlsaOutputPeriodSize[]; -extern const char kAlsaOutputStartThreshold[]; -extern const char kAlsaVolumeDeviceName[]; -extern const char kAlsaVolumeElementName[]; -extern const char kAudioOutputChannels[]; -extern const char kAudioOutputSampleRate[]; -extern const char kMaxOutputVolumeDba1m[]; -extern const char kMixerEnableDynamicChannelCount[]; -extern const char kMixerSourceAudioReadyThresholdMs[]; -extern const char kMixerSourceInputQueueMs[]; - -// Memory pressure switches -extern const char kMemPressureSystemReservedKb[]; - -// GPU process switches -extern const char kCastInitialScreenWidth[]; -extern const char kCastInitialScreenHeight[]; -extern const char kGraphicsBufferCount[]; -extern const char kVSyncInterval[]; - -// Graphics switches -extern const char kDesktopWindow1080p[]; -extern const char kForceMediaResolutionHeight[]; -extern const char kForceMediaResolutionWidth[]; - -// UI switches -extern const char kEnableInput[]; -extern const char kSystemGestureStartWidth[]; -extern const char kSystemGestureStartHeight[]; -extern const char kBottomSystemGestureStartHeight[]; -extern const char kBackGestureHorizontalThreshold[]; -extern const char kEnableTopDragGesture[]; -extern const char kManagedMode[]; - -// Background color used when Chromium hasn't rendered anything yet. -extern const char kCastAppBackgroundColor[]; - -extern const char kMixerServiceEndpoint[]; -extern const char kMixerServicePort[]; - -extern const char kCastMemoryPressureCriticalFraction[]; -extern const char kCastMemoryPressureModerateFraction[]; - -extern const char kDisableMojoRenderer[]; -extern const char kForceMojoRenderer[]; - -// OTA update related switches. -extern const char kForceUpdateRemoteUrl[]; - -extern const char kSysInfoFilePath[]; - -// Switches for Cast browser decoupling. -extern const char kDeferFeatureList[]; -extern const char kUseCastBrowserPrefConfig[]; -extern const char kInProcessBroker[]; - -extern const char kCastMojoBrokerPath[]; - -} // namespace switches - -namespace chromecast { - -// Gets boolean value from switch |switch_string|. -// --|switch_string| -> true -// --|switch_string|="true" -> true -// --|switch_string|="false" -> false -// no switch named |switch_string| -> |default_value| -bool GetSwitchValueBoolean(const std::string& switch_string, - const bool default_value); - -// Gets an integer value from switch |switch_name|. If the switch is not present -// in the command line, or the value is not an integer, the |default_value| is -// returned. -int GetSwitchValueInt(const std::string& switch_name, const int default_value); - -// Gets a non-negative integer value from switch |switch_name|. If the switch is -// not present in the command line, or the value is not a non-negative integer, -// the |default_value| is returned. -int GetSwitchValueNonNegativeInt(const std::string& switch_name, - const int default_value); - -// Gets a floating point value from switch |switch_name|. If the switch is not -// present in the command line, or the value is not a number, the -// |default_value| is returned. -double GetSwitchValueDouble(const std::string& switch_name, - const double default_value); - -// Gets a color value from the format "#AARRGGBB" (hex). -uint32_t GetSwitchValueColor(const std::string& switch_name, - const uint32_t default_value); - -} // namespace chromecast - -#endif // CHROMECAST_BASE_CHROMECAST_SWITCHES_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/component/component.cc chromium-132.0.6834.159/chromecast/base/component/component.cc --- chromium-132.0.6834.110/chromecast/base/component/component.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/component/component.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,426 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/component/component.h" - -#include -#include - -#include "base/atomicops.h" -#include "base/functional/bind.h" -#include "base/functional/callback_helpers.h" -#include "base/location.h" -#include "base/memory/raw_ptr.h" -#include "base/task/single_thread_task_runner.h" - -namespace chromecast { - -namespace { - -const base::subtle::AtomicWord kEnabledBit = 0x40000000; - -} // namespace - -namespace subtle { - -class DependencyCount : public base::RefCountedThreadSafe { - public: - explicit DependencyCount(ComponentBase* component) - : component_(component), - task_runner_(base::SingleThreadTaskRunner::GetCurrentDefault()), - dep_count_(0), - disabling_(false) { - DCHECK(component_); - } - - DependencyCount(const DependencyCount&) = delete; - DependencyCount& operator=(const DependencyCount&) = delete; - - void Detach() { - DCHECK(task_runner_->BelongsToCurrentThread()); - component_ = nullptr; - } - - void Disable() { - DCHECK(task_runner_->BelongsToCurrentThread()); - DCHECK(!disabling_); - disabling_ = true; - - std::set dependents(strong_dependents_); - for (DependencyBase* dependent : dependents) - dependent->Disable(); - - while (true) { - AtomicWord deps = base::subtle::NoBarrier_Load(&dep_count_); - AtomicWord old_deps = base::subtle::Acquire_CompareAndSwap( - &dep_count_, deps, deps & ~kEnabledBit); - if (old_deps == deps) { - if ((deps & ~kEnabledBit) == 0) - DisableComplete(); - return; - } - } - } - - void Enable() { - DCHECK(task_runner_->BelongsToCurrentThread()); - disabling_ = false; - while (true) { - AtomicWord deps = base::subtle::NoBarrier_Load(&dep_count_); - DCHECK(!(deps & kEnabledBit)); - AtomicWord old_deps = base::subtle::Release_CompareAndSwap( - &dep_count_, deps, deps | kEnabledBit); - if (old_deps == deps) - break; - } - - for (DependencyBase* dependent : strong_dependents_) - dependent->Ready(component_); - } - - ComponentBase* WeakAcquireDep() { - while (true) { - AtomicWord deps = base::subtle::NoBarrier_Load(&dep_count_); - if (!(deps & kEnabledBit)) - return nullptr; - AtomicWord old_deps = - base::subtle::Acquire_CompareAndSwap(&dep_count_, deps, deps + 1); - // We depend on the fact that a component must be disabled (meaning that - // we will never reach this point) before it is destroyed. Therefore if - // we do reach this point, it is safe to return the raw pointer. - if (old_deps == deps) - return component_; - } - } - - void StrongAcquireDep(DependencyBase* dependent) { - DCHECK(dependent); - DCHECK(task_runner_->BelongsToCurrentThread()); - if (!component_) { - dependent->Disable(); - return; - } - - strong_dependents_.insert(dependent); - AtomicWord count = base::subtle::NoBarrier_AtomicIncrement(&dep_count_, 1); - DCHECK_GT(count, 0); - - if (count & kEnabledBit) { - dependent->Ready(component_); - } else { - component_->Enable(); - } - } - - void StrongReleaseDep(DependencyBase* dependent) { - DCHECK(dependent); - DCHECK(task_runner_->BelongsToCurrentThread()); - strong_dependents_.erase(dependent); - ReleaseDep(); - } - - void ReleaseDep() { - AtomicWord after = base::subtle::Barrier_AtomicIncrement(&dep_count_, -1); - DCHECK_GE(after, 0); - if (after == 0) - DisableComplete(); - } - - bool DependsOn(ComponentBase* component) { - DCHECK(task_runner_->BelongsToCurrentThread()); - if (!component_) - return false; - if (component_ == component) - return true; - return component_->DependsOn(component); - } - - private: - friend class base::RefCountedThreadSafe; - using AtomicWord = base::subtle::AtomicWord; - - ~DependencyCount() {} - - void DisableComplete() { - if (!task_runner_->BelongsToCurrentThread()) { - task_runner_->PostTask( - FROM_HERE, base::BindOnce(&DependencyCount::DisableComplete, this)); - return; - } - // Need to make sure that Enable() was not called in the meantime. - if (base::subtle::NoBarrier_Load(&dep_count_) != 0 || !disabling_) - return; - // Ensure that we don't call DisableComplete() more than once per Disable(). - disabling_ = false; - DCHECK(component_); - DCHECK(strong_dependents_.empty()); - component_->DependencyCountDisableComplete(); - } - - raw_ptr component_; - const scoped_refptr task_runner_; - AtomicWord dep_count_; - bool disabling_; - std::set strong_dependents_; -}; - -DependencyBase::DependencyBase(const WeakReferenceBase& dependency, - ComponentBase* dependent) - : dependent_(dependent), - dependency_(nullptr), - counter_(dependency.counter_) { - DCHECK(dependent_); - dependent_->AddDependency(this); -} - -DependencyBase::~DependencyBase() {} - -void DependencyBase::StartUsing() { - DCHECK(thread_checker_.CalledOnValidThread()); - DCHECK(!dependency_); - counter_->StrongAcquireDep(this); -} - -void DependencyBase::StopUsing() { - DCHECK(thread_checker_.CalledOnValidThread()); - if (!dependency_) - return; - dependency_ = nullptr; - counter_->StrongReleaseDep(this); -} - -void DependencyBase::Ready(ComponentBase* dependency) { - DCHECK(thread_checker_.CalledOnValidThread()); - DCHECK(!dependency_); - DCHECK(dependency); - dependency_ = dependency; - dependent_->DependencyReady(); -} - -void DependencyBase::Disable() { - DCHECK(thread_checker_.CalledOnValidThread()); - dependent_->Disable(); -} - -bool DependencyBase::DependsOn(ComponentBase* component) { - return counter_->DependsOn(component); -} - -WeakReferenceBase::WeakReferenceBase(const ComponentBase& dependency) - : counter_(dependency.counter_) { - DCHECK(counter_); -} - -WeakReferenceBase::WeakReferenceBase(const DependencyBase& dependency) - : counter_(dependency.counter_) { - DCHECK(counter_); -} - -WeakReferenceBase::WeakReferenceBase(const WeakReferenceBase& other) - : counter_(other.counter_) { - DCHECK(counter_); -} - -WeakReferenceBase::WeakReferenceBase(WeakReferenceBase&& other) - : counter_(std::move(other.counter_)) { - DCHECK(counter_); -} - -WeakReferenceBase::~WeakReferenceBase() {} - -ScopedReferenceBase::ScopedReferenceBase( - const scoped_refptr& counter) - : counter_(counter) { - DCHECK(counter_); - dependency_ = counter_->WeakAcquireDep(); -} - -ScopedReferenceBase::ScopedReferenceBase(ScopedReferenceBase&& other) - : counter_(std::move(other.counter_)), dependency_(other.dependency_) { - DCHECK(counter_); - other.dependency_ = nullptr; -} - -ScopedReferenceBase::~ScopedReferenceBase() { - if (dependency_) - counter_->ReleaseDep(); -} - -} // namespace subtle - -ComponentBase::ComponentBase() - : task_runner_(base::SingleThreadTaskRunner::GetCurrentDefault()), - state_(kStateDisabled), - async_call_in_progress_(false), - pending_dependency_count_(0), - observers_(new base::ObserverListThreadSafe()) { - counter_ = new subtle::DependencyCount(this); -} - -ComponentBase::~ComponentBase() { - DCHECK(task_runner_->BelongsToCurrentThread()); - DCHECK_EQ(kStateDisabled, state_) << "Components must be disabled " - << "before being destroyed"; - counter_->Detach(); -} - -void ComponentBase::Enable() { - DCHECK(task_runner_->BelongsToCurrentThread()); - if (state_ == kStateEnabling || state_ == kStateEnabled || - state_ == kStateDestroying) { - return; - } - state_ = kStateEnabling; - - if (strong_dependencies_.empty()) { - TryOnEnable(); - } else { - // Enable all strong dependencies first. - pending_dependency_count_ = strong_dependencies_.size(); - for (subtle::DependencyBase* dependency : strong_dependencies_) - dependency->StartUsing(); - } -} - -void ComponentBase::DependencyReady() { - DCHECK(task_runner_->BelongsToCurrentThread()); - if (state_ != kStateEnabling) - return; - DCHECK_GT(pending_dependency_count_, 0); - --pending_dependency_count_; - if (pending_dependency_count_ == 0) - TryOnEnable(); -} - -void ComponentBase::TryOnEnable() { - DCHECK_EQ(kStateEnabling, state_); - if (async_call_in_progress_) - return; - async_call_in_progress_ = true; - OnEnable(); -} - -void ComponentBase::OnEnableComplete(bool success) { - // Always post a task, to prevent the stack from getting too deep. - task_runner_->PostTask( - FROM_HERE, base::BindOnce(&ComponentBase::OnEnableCompleteInternal, - base::Unretained(this), success)); -} - -void ComponentBase::OnEnableCompleteInternal(bool success) { - async_call_in_progress_ = false; - DCHECK(state_ == kStateEnabling || state_ == kStateDisabling || - state_ == kStateDestroying); - if (state_ != kStateEnabling) { - if (success) { - TryOnDisable(); - } else { - OnDisableCompleteInternal(); - } - return; - } - - if (success) { - state_ = kStateEnabled; - counter_->Enable(); - } else { - Disable(); - } - observers_->Notify(FROM_HERE, &Observer::OnComponentEnabled, this, success); -} - -void ComponentBase::Destroy() { - DCHECK(task_runner_->BelongsToCurrentThread()); - DCHECK_NE(kStateDestroying, state_); - if (state_ == kStateDisabled) { - delete this; - } else { - bool should_disable = (state_ != kStateDisabling); - state_ = kStateDestroying; - if (should_disable) - counter_->Disable(); - } -} - -void ComponentBase::AddObserver(Observer* observer) { - DCHECK(observer); - observers_->AddObserver(observer); -} - -void ComponentBase::RemoveObserver(Observer* observer) { - observers_->RemoveObserver(observer); -} - -void ComponentBase::Disable() { - DCHECK(task_runner_->BelongsToCurrentThread()); - if (state_ == kStateDisabling || state_ == kStateDisabled || - state_ == kStateDestroying) { - return; - } - state_ = kStateDisabling; - counter_->Disable(); -} - -void ComponentBase::DependencyCountDisableComplete() { - DCHECK(task_runner_->BelongsToCurrentThread()); - if (state_ == kStateDisabling || state_ == kStateDestroying) - TryOnDisable(); -} - -void ComponentBase::TryOnDisable() { - DCHECK(state_ == kStateDisabling || state_ == kStateDestroying); - if (async_call_in_progress_) - return; - async_call_in_progress_ = true; - OnDisable(); -} - -void ComponentBase::OnDisableComplete() { - // Always post a task, to prevent calls to Disable() from within Enable(). - task_runner_->PostTask( - FROM_HERE, base::BindOnce(&ComponentBase::OnDisableCompleteInternal, - base::Unretained(this))); -} - -void ComponentBase::OnDisableCompleteInternal() { - async_call_in_progress_ = false; - DCHECK(state_ == kStateEnabling || state_ == kStateDisabling || - state_ == kStateDestroying); - if (state_ == kStateEnabling) { - TryOnEnable(); - return; - } - - if (state_ == kStateDestroying) { - StopUsingDependencies(); - observers_->Notify(FROM_HERE, &Observer::OnComponentDisabled, this); - state_ = kStateDisabled; - delete this; - } else { - state_ = kStateDisabled; - StopUsingDependencies(); - observers_->Notify(FROM_HERE, &Observer::OnComponentDisabled, this); - } -} - -void ComponentBase::AddDependency(subtle::DependencyBase* dependency) { - DCHECK_EQ(kStateDisabled, state_); - DCHECK(!dependency->DependsOn(this)) << "Circular dependency detected"; - strong_dependencies_.push_back(dependency); -} - -void ComponentBase::StopUsingDependencies() { - for (subtle::DependencyBase* dependency : strong_dependencies_) - dependency->StopUsing(); -} - -bool ComponentBase::DependsOn(ComponentBase* component) { - for (subtle::DependencyBase* dependency : strong_dependencies_) { - if (dependency->DependsOn(component)) - return true; - } - return false; -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/component/component.h chromium-132.0.6834.159/chromecast/base/component/component.h --- chromium-132.0.6834.110/chromecast/base/component/component.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/component/component.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,327 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// A component is a large, long-lived set of functionality that may be enabled -// or disabled at runtime. Some examples include: the multizone features, -// MetricsRecorder, or OpencastController. Components may depend on each other -// (ie, a component may call the public methods of other components); the -// Component infrastructure ensures that when a component is disabled, nothing -// that depends on it will call any of its methods until it is enabled again. -// -// Components may be used without a dependency relationship via a weak -// reference. A weak reference does not allow direct access to the component; -// instead, it must be either used to create a strict dependency (see below), or -// be converted to a scoped reference via Try(). Scoped references must be -// checked for validity before use (they are convertible to bool); an invalid -// scoped reference must not be used. Scoped references should be short-lived; -// to encourage this, they are only move-constructible and cannot be copied or -// assigned. -// -// If component Y depends on Component X, then Y has a Dependency reference -// to X. This causes Y to be disabled as X is being disabled (before X's -// OnDisable() method is called). Similarly, this dependency will cause X to be -// enabled when Y is being enabled (X will be enabled before Y's OnEnable() -// method is called). A component may freely access any of its dependencies -// as long as it is enabled. When a component is disabled, it must ensure that -// none of its dependencies will be used again until it is enabled. It is -// recommended to set up dependencies in your component's constructor; it is an -// error to add a dependency to a component that is not disabled. -// -// When a component is disabled, it will first recursively disable any other -// components that depend on it. It will also disable the creation of -// new scoped references. It then waits for all scoped references to be -// destroyed before calling OnDisable() to actually disable the component. -// -// Components MUST be disabled before they are deleted. For ease of use, a -// Destroy() method is provided. When Destroy() is called, it prevents the -// component from being enabled ever again, and then disables it, deleting it -// once it is disabled. -// -// Example usage: -// -// class MetricsRecorder : public Component { -// public: -// virtual ~MetricsRecorder() {} -// virtual void RecordEvent(const std::string& event) = 0; -// }; -// -// class SetupManager : public Component { -// public: -// virtual ~SetupManager() {} -// virtual int GetMultizoneDelay() = 0; -// }; -// -// class Multizone : public Component { -// public: -// virtual ~Multizone() {} -// virtual void DoMultizoneStuff() = 0; -// }; -// -// class MetricsRecorderImpl : public MetricsRecorder { -// public: -// void OnEnable() override { -// // ... Enable metrics reporting ... -// OnEnableComplete(true); -// } -// -// // Release all resources; public methods will not be called after this. -// void OnDisable() override { -// OnDisableComplete(); -// } -// -// void RecordEvent(const std::string& event) override { -// // ... Record an event ... -// } -// }; -// -// class SetupManagerImpl : public SetupManager { -// public: -// void OnEnable() override { -// // ... Enable setup manager ... -// // OnEnableComplete() may be called asynchronously. -// base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( -// FROM_HERE, base::BindOnce(&SetupManagerImpl::CompleteEnable, -// base::Unretained(this))); -// } -// -// void CompleteEnable() { -// OnEnableComplete(true); -// } -// -// void OnDisable() override { -// OnDisableComplete(); -// } -// -// int GetMultizoneDelay() override { return 0; } -// }; -// -// class MultizoneImpl : public Multizone { -// public: -// MultizoneImpl(const MetricsRecorder::WeakRef& metrics_recorder, -// const SetupManager::WeakRef& setup_manager) -// : metrics_recorder_(metrics_recorder, this), -// setup_manager_(setup_manager) { -// // We can try to use weak deps even before this component is enabled. -// // However, we MUST NOT attempt to use any strong dependencies. -// if (auto setup = setup_manager_.Try()) { -// int delay = setup->GetMultizoneDelay(); -// // ... Do something with delay ... -// } -// } -// -// void OnEnable() override { -// // ... Enable multizone ... -// // Can use strong dependencies directly -// metrics_recorder_->RecordEvent("enable multizone"); -// OnEnableComplete(); -// } -// -// void OnDisable() override { -// // Can still use strong dependencies here. However, this method MUST -// // ensure that strong dependencies will NOT be used after it returns. -// metrics_recorder_->RecordEvent("disable multizone"); -// OnDisableComplete(); -// } -// -// void DoMultizoneStuff() { -// metrics_recorder_->RecordEvent("multizone stuff"); -// // You have to Try() every time you use a weak dependency. -// if (auto setup = setup_manager_.Try()) { -// int delay = setup->GetMultizoneDelay(); -// // ... Do something with delay ... -// } -// } -// -// private: -// MetricsRecorder::Dependency metrics_recorder_; -// SetupManager::WeakRef setup_manager_; -// }; - -#ifndef CHROMECAST_BASE_COMPONENT_COMPONENT_H_ -#define CHROMECAST_BASE_COMPONENT_COMPONENT_H_ - -#include - -#include "base/check.h" -#include "base/functional/callback.h" -#include "base/memory/ref_counted.h" -#include "base/memory/weak_ptr.h" -#include "base/observer_list_threadsafe.h" -#include "base/threading/thread_checker.h" -#include "chromecast/base/component/component_internal.h" - -namespace base { -class SingleThreadTaskRunner; -} // namespace base - -namespace chromecast { - -class ComponentBase { - public: - class Observer { - public: - // Called when a component finishes being enabled. If the component was - // enabled successfully, |success| will be |true|. Note that access to - // |component| is not guaranteed to be safe; since the observers are - // notified asynchronously, |component| may have been already deleted. - virtual void OnComponentEnabled(ComponentBase* component, bool success) {} - // Called when a component has been disabled. Access to |component| is not - // guaranteed to be safe. - virtual void OnComponentDisabled(ComponentBase* component) {} - - protected: - virtual ~Observer() {} - }; - - ComponentBase(const ComponentBase&) = delete; - ComponentBase& operator=(const ComponentBase&) = delete; - - virtual ~ComponentBase(); - - // Enables this component if possible. Attempts to enable all strong - // dependencies first. It is OK to call Disable() while the component is in - // the process of being enabled. All components MUST be created/enabled/ - // disabled/destroyed on the same thread. - // Note that enabling a component may occur asynchronously; components must - // always be accessed through a Dependency or WeakReference to ensure safety. - // TODO(kmackay) Consider allowing components to be used on any thread. - void Enable(); - - // Disables this component; disabling may complete asynchronously. It is OK to - // call Enable() again while the component is being disabled. Note that a - // component MUST be disabled (or never enabled) before it is deleted. - void Disable(); - - // Deletes this component, disabling it first if necessary. - void Destroy(); - - void AddObserver(Observer* observer); - void RemoveObserver(Observer* observer); - - protected: - ComponentBase(); - - // Enables the component implementation. This method must set things up so - // that any public method calls are valid, and then call OnEnableComplete(), - // passing in |true| if the enable was successful, |false| otherwise. - // OnEnableComplete() may be called from any thread. OnEnable() will not be - // called again until after the component has been disabled, and will not be - // called during an ongoing OnDisable() call (so if OnDisable() is called, - // then OnEnable() will not be called until OnDisableComplete() has been - // called). This method is called only on the thread that the component was - // created on. - virtual void OnEnable() = 0; - - // Disables the component implementation. This is not called until there are - // no more live dependencies, so there will be no more public method calls - // to the component until after OnEnable() is called again. This method must - // do whatever is necessary to ensure that no more calls to dependencies of - // this component will be made, and then call the |disabled_cb|. The - // |disabled_cb| may be called from any thread. This method is called only on - // the thread that the component was created on. - virtual void OnDisable() = 0; - - // Handles the success/failure of a call to OnEnable(). When OnEnable() is - // called, it must eventually call OnEnableComplete() (after the component is - // ready to be used by dependents), passing in |true| if the component was - // enabled successfully. If |success| is false, then OnDisable() will be - // called immediately to return the component to a consistent disabled state. - // May be called on any thread. - void OnEnableComplete(bool success); - - // Handles the completion of a call to OnDisable(). When OnDisable() is - // called, it must eventually call OnDisableComplete() (after ensuring that - // none of the component's strong dependencies will be used anymore). May be - // called on any thread. - void OnDisableComplete(); - - private: - friend class subtle::DependencyCount; - friend class subtle::DependencyBase; - friend class subtle::WeakReferenceBase; - - enum State { - kStateDisabled, - kStateDisabling, - kStateEnabled, - kStateEnabling, - kStateDestroying - }; - - void DependencyReady(); - void TryOnEnable(); - void OnEnableCompleteInternal(bool success); - void DependencyCountDisableComplete(); - void TryOnDisable(); - void OnDisableCompleteInternal(); - void AddDependency(subtle::DependencyBase* dependency); - void StopUsingDependencies(); - // Returns |true| if |component| is a transitive dependency of this component. - bool DependsOn(ComponentBase* component); - - const scoped_refptr task_runner_; - scoped_refptr counter_; - std::vector strong_dependencies_; - State state_; - // |true| when a call to OnEnable()/OnDisable() is in progress. - bool async_call_in_progress_; - int pending_dependency_count_; - const scoped_refptr> observers_; -}; - -template -class StrongDependency : public subtle::DependencyBase { - public: - StrongDependency(const WeakReference& dependency, ComponentBase* dependent) - : subtle::DependencyBase(dependency, dependent) {} - - StrongDependency(const StrongDependency&) = delete; - StrongDependency& operator=(const StrongDependency&) = delete; - - C* operator->() const { - DCHECK(dependency_); - return static_cast(dependency_); - } -}; - -template -class WeakReference : public subtle::WeakReferenceBase { - public: - explicit WeakReference(const C& dependency) : WeakReferenceBase(dependency) {} - explicit WeakReference(const StrongDependency& dependency) - : subtle::WeakReferenceBase(dependency) {} - - // Explicitly allow copy. - WeakReference(const WeakReference& other) = default; - WeakReference(WeakReference&& other) = default; - - // Disallow assignment. - void operator=(const WeakReference&) = delete; - - // Try to get a scoped reference. Expected usage: - // if (auto ref = weak.Try()) { - // // ... use ref ... - // } - subtle::Ref_DO_NOT_DECLARE Try() const { - return subtle::Ref_DO_NOT_DECLARE(counter_); - } -}; - -template -class Component : public ComponentBase { - public: - using WeakRef = WeakReference; - using Dependency = StrongDependency; - - Component() = default; - - Component(const Component&) = delete; - Component& operator=(const Component&) = delete; - - WeakRef GetRef() { return WeakRef(*static_cast(this)); } -}; - -} // namespace chromecast - -#endif // CHROMECAST_BASE_COMPONENT_COMPONENT_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/component/component_internal.h chromium-132.0.6834.159/chromecast/base/component/component_internal.h --- chromium-132.0.6834.110/chromecast/base/component/component_internal.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/component/component_internal.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,118 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_COMPONENT_COMPONENT_INTERNAL_H_ -#define CHROMECAST_BASE_COMPONENT_COMPONENT_INTERNAL_H_ - -#include "base/check.h" -#include "base/functional/callback.h" -#include "base/memory/raw_ptr.h" -#include "base/memory/ref_counted.h" -#include "base/memory/weak_ptr.h" -#include "base/threading/thread_checker.h" - -namespace chromecast { - -template -class WeakReference; - -class ComponentBase; - -namespace subtle { - -class WeakReferenceBase; - -// Manages thread-safe dependency counting. Instances of this class are -// RefCountedThreadSafe since they must live as long as any dependent. -class DependencyCount; - -// Base class for strong dependencies. A strong dependency is tied to a -// specific dependent component instance. This allows dependents to be -// disabled before the component they depend on. May be used on any thread. -class DependencyBase { - public: - DependencyBase(const WeakReferenceBase& dependency, ComponentBase* dependent); - - DependencyBase(const DependencyBase&) = delete; - DependencyBase& operator=(const DependencyBase&) = delete; - - ~DependencyBase(); - - void StartUsing(); - void StopUsing(); - bool DependsOn(ComponentBase* component); - - protected: - const raw_ptr dependent_; - raw_ptr dependency_; - - private: - friend class DependencyCount; - friend class WeakReferenceBase; - - void Ready(ComponentBase* dependency); - void Disable(); - - const scoped_refptr counter_; - base::ThreadChecker thread_checker_; -}; - -// Base class for weak dependencies. Weak dependencies cannot be used -// directly; they must be converted to a strong dependency or a temp -// dependency first. May be converted on any thread. -class WeakReferenceBase { - protected: - friend class DependencyBase; - - explicit WeakReferenceBase(const ComponentBase& dependency); - explicit WeakReferenceBase(const DependencyBase& dependency); - WeakReferenceBase(const WeakReferenceBase& other); - WeakReferenceBase(WeakReferenceBase&& other); - ~WeakReferenceBase(); - - const scoped_refptr counter_; -}; - -// Base class for temp dependencies. Temp dependencies are meant for -// short-term use only, but can be used from any thread. -class ScopedReferenceBase { - protected: - explicit ScopedReferenceBase(const scoped_refptr& counter); - ScopedReferenceBase(ScopedReferenceBase&& other); - ~ScopedReferenceBase(); - - const scoped_refptr counter_; - raw_ptr dependency_; -}; - -// This class is not intended to be long-lived, and should not be declared as -// a variable type (eg, don't use it as a member variable). Instead, use auto -// (see WeakReference::Try() for an example). -template -class Ref_DO_NOT_DECLARE : public ScopedReferenceBase { - public: - Ref_DO_NOT_DECLARE(Ref_DO_NOT_DECLARE&& other) = default; - - C* operator->() const { - DCHECK(dependency_); - return static_cast(dependency_); - } - - explicit operator bool() const { return (dependency_ != nullptr); } - - private: - friend class WeakReference; - - explicit Ref_DO_NOT_DECLARE(const scoped_refptr& counter) - : ScopedReferenceBase(counter) {} - - Ref_DO_NOT_DECLARE(const Ref_DO_NOT_DECLARE& other) = delete; - Ref_DO_NOT_DECLARE& operator=(const Ref_DO_NOT_DECLARE& rhs) = delete; - Ref_DO_NOT_DECLARE& operator=(Ref_DO_NOT_DECLARE&& rhs) = delete; -}; - -} // namespace subtle -} // namespace chromecast - -#endif // CHROMECAST_BASE_COMPONENT_COMPONENT_INTERNAL_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/component/component_unittest.cc chromium-132.0.6834.159/chromecast/base/component/component_unittest.cc --- chromium-132.0.6834.110/chromecast/base/component/component_unittest.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/component/component_unittest.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,387 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/component/component.h" - -#include - -#include "base/functional/bind.h" -#include "base/run_loop.h" -#include "base/task/single_thread_task_runner.h" -#include "base/test/task_environment.h" -#include "build/build_config.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace chromecast { - -class ComponentTest : public ::testing::Test { - protected: - base::test::SingleThreadTaskEnvironment task_environment_; -}; - -using ComponentDeathTest = ComponentTest; - -class ComponentB; -class ComponentC; -class ComponentA : public Component { - public: - void MakeSelfDependency() { - a_.reset(new Component::Dependency(GetRef(), this)); - } - - void MakeCircularDependency(const Component::WeakRef& b) { - b_.reset(new Component::Dependency(b, this)); - } - - void MakeTransitiveCircularDependency( - const Component::WeakRef& c) { - c_.reset(new Component::Dependency(c, this)); - } - - void OnEnable() override { - if (!fail_enable_) { - enabled_ = true; - Test(); - } - base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, base::BindOnce(&ComponentA::OnEnableComplete, - base::Unretained(this), !fail_enable_)); - } - - void OnDisable() override { - if (enabled_) - Test(); - enabled_ = false; - base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, - base::BindOnce(&ComponentA::OnDisableComplete, base::Unretained(this))); - } - - void Test() { - EXPECT_TRUE(enabled_); - EXPECT_FALSE(fail_enable_); - } - - bool enabled() const { return enabled_; } - void FailEnable() { fail_enable_ = true; } - - private: - bool enabled_ = false; - bool fail_enable_ = false; - - std::unique_ptr::Dependency> a_; - std::unique_ptr::Dependency> b_; - std::unique_ptr::Dependency> c_; -}; - -class ComponentB : public Component { - public: - explicit ComponentB(const ComponentA::WeakRef& a) : a_(a, this) {} - - void OnEnable() override { - if (!fail_enable_) { - enabled_ = true; - Test(); - } - base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, base::BindOnce(&ComponentB::OnEnableComplete, - base::Unretained(this), !fail_enable_)); - } - - void OnDisable() override { - if (enabled_) - Test(); - enabled_ = false; - base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, - base::BindOnce(&ComponentB::OnDisableComplete, base::Unretained(this))); - } - - void Test() { - EXPECT_TRUE(enabled_); - EXPECT_FALSE(fail_enable_); - a_->Test(); - } - - bool enabled() const { return enabled_; } - void FailEnable() { fail_enable_ = true; } - - private: - bool enabled_ = false; - bool fail_enable_ = false; - - ComponentA::Dependency a_; -}; - -class ComponentC : public Component { - public: - explicit ComponentC(const ComponentB::WeakRef& b) : b_(b, this) {} - - void OnEnable() override { - if (!fail_enable_) { - enabled_ = true; - Test(); - } - base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, base::BindOnce(&ComponentC::OnEnableComplete, - base::Unretained(this), !fail_enable_)); - } - - void OnDisable() override { - if (enabled_) - Test(); - enabled_ = false; - base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, - base::BindOnce(&ComponentC::OnDisableComplete, base::Unretained(this))); - } - - void Test() { - EXPECT_TRUE(enabled_); - EXPECT_FALSE(fail_enable_); - b_->Test(); - } - - bool enabled() const { return enabled_; } - void FailEnable() { fail_enable_ = true; } - - private: - bool enabled_ = false; - bool fail_enable_ = false; - - ComponentB::Dependency b_; -}; - -std::string DeathRegex(const std::string& regex) { -#if BUILDFLAG(IS_ANDROID) - return ""; -#else - return regex; -#endif -} - -#if (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) && GTEST_HAS_DEATH_TEST -TEST_F(ComponentDeathTest, SelfDependency) { - GTEST_FLAG_SET(death_test_style, "threadsafe"); - ComponentA a; - EXPECT_DEATH(a.MakeSelfDependency(), DeathRegex("Circular dependency")); -} - -TEST_F(ComponentDeathTest, CircularDependency) { - GTEST_FLAG_SET(death_test_style, "threadsafe"); - ComponentA a; - ComponentB b(a.GetRef()); - EXPECT_DEATH(a.MakeCircularDependency(b.GetRef()), - DeathRegex("Circular dependency")); -} - -TEST_F(ComponentDeathTest, TransitiveCircularDependency) { - GTEST_FLAG_SET(death_test_style, "threadsafe"); - ComponentA a; - ComponentB b(a.GetRef()); - ComponentC c(b.GetRef()); - EXPECT_DEATH(a.MakeTransitiveCircularDependency(c.GetRef()), - DeathRegex("Circular dependency")); -} -#endif // (!defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)) && - // GTEST_HAS_DEATH_TEST - -TEST_F(ComponentTest, SimpleEnable) { - std::unique_ptr a(new ComponentA()); - a->Enable(); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(a->enabled()); - a.release()->Destroy(); -} - -TEST_F(ComponentTest, TransitiveEnable) { - std::unique_ptr a(new ComponentA()); - std::unique_ptr b(new ComponentB(a->GetRef())); - std::unique_ptr c(new ComponentC(b->GetRef())); - c->Enable(); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(a->enabled()); - EXPECT_TRUE(b->enabled()); - EXPECT_TRUE(c->enabled()); - a.release()->Destroy(); - b.release()->Destroy(); - c.release()->Destroy(); -} - -TEST_F(ComponentTest, FailEnable) { - std::unique_ptr a(new ComponentA()); - a->FailEnable(); - a->Enable(); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(a->enabled()); - a.release()->Destroy(); -} - -TEST_F(ComponentTest, TransitiveFailEnable) { - std::unique_ptr a(new ComponentA()); - std::unique_ptr b(new ComponentB(a->GetRef())); - std::unique_ptr c(new ComponentC(b->GetRef())); - a->FailEnable(); - c->Enable(); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(a->enabled()); - EXPECT_FALSE(b->enabled()); - EXPECT_FALSE(c->enabled()); - a.release()->Destroy(); - b.release()->Destroy(); - c.release()->Destroy(); -} - -TEST_F(ComponentTest, DisableWhileEnabling) { - std::unique_ptr a(new ComponentA()); - a->Enable(); - a->Disable(); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(a->enabled()); - a.release()->Destroy(); -} - -TEST_F(ComponentTest, EnableTwice) { - std::unique_ptr a(new ComponentA()); - a->Enable(); - a->Enable(); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(a->enabled()); - a.release()->Destroy(); -} - -TEST_F(ComponentTest, DisableTwice) { - std::unique_ptr a(new ComponentA()); - a->Enable(); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(a->enabled()); - a->Disable(); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(a->enabled()); - a->Disable(); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(a->enabled()); - a.release()->Destroy(); -} - -TEST_F(ComponentTest, DisableAfterFailedEnable) { - std::unique_ptr a(new ComponentA()); - a->FailEnable(); - a->Enable(); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(a->enabled()); - a->Disable(); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(a->enabled()); - a.release()->Destroy(); -} - -TEST_F(ComponentTest, DisableAfterNeverEnabled) { - std::unique_ptr a(new ComponentA()); - a->Disable(); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(a->enabled()); - a.release()->Destroy(); -} - -TEST_F(ComponentTest, DisableDependencyWhileEnabling) { - std::unique_ptr a(new ComponentA()); - std::unique_ptr b(new ComponentB(a->GetRef())); - std::unique_ptr c(new ComponentC(b->GetRef())); - b->Enable(); - base::RunLoop().RunUntilIdle(); - c->Enable(); - a->Disable(); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(a->enabled()); - EXPECT_FALSE(b->enabled()); - EXPECT_FALSE(c->enabled()); - a.release()->Destroy(); - b.release()->Destroy(); - c.release()->Destroy(); -} - -TEST_F(ComponentTest, EnableDisableEnable) { - std::unique_ptr a(new ComponentA()); - a->Enable(); - a->Disable(); - a->Enable(); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(a->enabled()); - a.release()->Destroy(); -} - -TEST_F(ComponentTest, DisableEnableDisable) { - std::unique_ptr a(new ComponentA()); - a->Enable(); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(a->enabled()); - a->Disable(); - a->Enable(); - a->Disable(); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(a->enabled()); - a.release()->Destroy(); -} - -TEST_F(ComponentTest, TransitiveEnableDisableEnable) { - std::unique_ptr a(new ComponentA()); - std::unique_ptr b(new ComponentB(a->GetRef())); - std::unique_ptr c(new ComponentC(b->GetRef())); - a->Enable(); - base::RunLoop().RunUntilIdle(); - c->Enable(); - a->Disable(); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(a->enabled()); - EXPECT_FALSE(b->enabled()); - EXPECT_FALSE(c->enabled()); - c->Enable(); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(a->enabled()); - EXPECT_TRUE(b->enabled()); - EXPECT_TRUE(c->enabled()); - a.release()->Destroy(); - b.release()->Destroy(); - c.release()->Destroy(); -} - -TEST_F(ComponentTest, WeakRefs) { - std::unique_ptr a(new ComponentA()); - ComponentA::WeakRef weak = a->GetRef(); - EXPECT_FALSE(weak.Try()); - a->Enable(); - EXPECT_FALSE(weak.Try()); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(weak.Try()); - weak.Try()->Test(); - a->Disable(); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(weak.Try()); - a.release()->Destroy(); -} - -TEST_F(ComponentTest, WeakRefsKeepEnabled) { - std::unique_ptr a(new ComponentA()); - ComponentA::WeakRef weak = a->GetRef(); - EXPECT_FALSE(weak.Try()); - a->Enable(); - EXPECT_FALSE(weak.Try()); - base::RunLoop().RunUntilIdle(); - { - auto held_ref = weak.Try(); - EXPECT_TRUE(held_ref); - held_ref->Test(); - a->Disable(); - base::RunLoop().RunUntilIdle(); - // The held ref keeps |a| enabled until it goes out of scope. - EXPECT_TRUE(a->enabled()); - } - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(a->enabled()); - EXPECT_FALSE(weak.Try()); - a.release()->Destroy(); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/device_capabilities.h chromium-132.0.6834.159/chromecast/base/device_capabilities.h --- chromium-132.0.6834.110/chromecast/base/device_capabilities.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/device_capabilities.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,257 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_DEVICE_CAPABILITIES_H_ -#define CHROMECAST_BASE_DEVICE_CAPABILITIES_H_ - -#include -#include - -#include "base/memory/raw_ptr.h" -#include "base/memory/ref_counted.h" -#include "base/values.h" - -namespace chromecast { - -// Device capabilities are a set of features used to determine what operations -// are available on the device. They are identified by a key (string) and a -// value (base::Value). The class serves 2 main purposes: -// -// 1) Provide an interface for updating default capabilities and querying their -// current value. Default capabilities are known to the system beforehand -// and used by modules throughout Chromecast to control behavior of operations. -// -// 2) Store dynamic capabilities. Dynamic capabilities are not known to the -// system beforehand and are introduced by external parties. These capabilites -// are stored and then forwarded to app servers that use them to determine how -// to interact with the device. -// -// Capabilities can be classified as either "public" or "private". Capabilities -// of both types can be used by the Chromecast platform to control internal -// behaviors, but only public capabilities will be advertised to app servers. -// Once a capability is set, it retains its privacy classification permanently; -// attempting to change the privacy of a capability results in an error. -// Private capabilities can only be added by Validators. Calling SetCapability() -// on a path without a Validator will default to setting the capability as -// public. -// -// Thread Safety: -// Observers can be added from any thread. Each Observer is guaranteed to be -// notified on same thread that it was added on and must be removed on the same -// thread that it was added on. -// -// Validators can be registered from any thread. Each Validator's Validate() -// method is guaranteed to be called on same thread that the Validator was -// registered on. The Validator must be unregistered on the same thread -// that it was registered on. -// -// All other methods can be called safely from any thread. - -// TODO(esum): -// 1) Add WifiSupported, HotspotSupported, and MultizoneSupported capabilities. -// 2) It's not ideal to have the accessors (BluetoothSupported(), etc.) not -// be valid initially until the capability gets registered. We might want -// to use some kind of builder class to solve this. -class DeviceCapabilities { - public: - class Observer { - public: - // Called when DeviceCapabilities gets written to in any way. |path| - // is full path to capability that has been updated. - virtual void OnCapabilitiesChanged(const std::string& path) = 0; - - protected: - virtual ~Observer() {} - }; - - // When another module attempts to update the value for a capability, - // a manager may want to validate the change or even modify the new value. - // Managers that wish to perform this validation should inherit from the - // Validator class and implement its interface. - class Validator { - public: - Validator(const Validator&) = delete; - Validator& operator=(const Validator&) = delete; - - // |path| is full path to capability, which could include paths expanded on - // the capability key that gets registered through the Register() method. - // For example, if a key of "foo" is registered for a Validator, |path| - // could be "foo", "foo.bar", "foo.bar.what", etc. |proposed_value| is new - // value being proposed for |path|. Determines if |proposed_value| is valid - // change for |path|. This method may be asynchronous, but multiple calls - // to it must be handled serially. Returns response through - // SetPublicValidatedValue() or SetPrivateValidatedValue(). - virtual void Validate(const std::string& path, - base::Value proposed_value) = 0; - - protected: - explicit Validator(DeviceCapabilities* capabilities); - virtual ~Validator() {} - - DeviceCapabilities* capabilities() const { return capabilities_; } - - // Meant to be called when Validate() has finished. |path| is full path to - // capability. |new_value| is new validated value to be used in - // DeviceCapabilities. This method passes these parameters to - // DeviceCapabilities, where |path| is updated internally to |new_value|. - // TODO(seantopping): Change this interface so that Validators are not the - // only means of accessing private capabilities. - void SetPublicValidatedValue(const std::string& path, - base::Value new_value) const; - void SetPrivateValidatedValue(const std::string& path, - base::Value new_value) const; - - private: - const raw_ptr capabilities_; - }; - - // Class used to store/own capabilities-related data. It is immutable and - // RefCountedThreadSafe, so client code can freely query it throughout its - // lifetime without worrying about the data getting invalidated in any way. - class Data : public base::RefCountedThreadSafe { - public: - Data(const Data&) = delete; - Data& operator=(const Data&) = delete; - - // Accessor for complete capabilities in dictionary format. - const base::Value::Dict& dictionary() const { return dictionary_; } - - // Accessor for complete capabilities string in JSON format. - const std::string& json_string() const { return json_string_; } - - private: - friend class base::RefCountedThreadSafe; - // DeviceCapabilities should be the only one responsible for Data - // construction. See CreateData() methods. - friend class DeviceCapabilities; - - // Constructs empty dictionary with no capabilities. - Data(); - // Uses |dictionary| as capabilities dictionary. - explicit Data(base::Value::Dict dictionary); - ~Data(); - - const base::Value::Dict dictionary_; - std::string json_string_; - }; - - // Default Capability keys - static const char kKeyAssistantSupported[]; - static const char kKeyBluetoothSupported[]; - static const char kKeyDisplaySupported[]; - static const char kKeyHiResAudioSupported[]; - - DeviceCapabilities(const DeviceCapabilities&) = delete; - DeviceCapabilities& operator=(const DeviceCapabilities&) = delete; - - // This class should get destroyed after all Validators have been - // unregistered, all Observers have been removed, and the class is no longer - // being accessed. - virtual ~DeviceCapabilities() {} - - // Create empty instance with no capabilities. Although the class is not - // singleton, there is meant to be a single instance owned by another module. - // The instance should be created early enough for all managers to register - // themselves, and then live long enough for all managers to unregister. - static std::unique_ptr Create(); - // Creates an instance where all the default capabilities are initialized - // to a predefined default value, and no Validators are registered. For use - // only in unit tests. - static std::unique_ptr CreateForTesting(); - - // Registers a Validator for a capability. A given key must only be - // registered once, and must be unregistered before calling Register() again. - // If the capability has a value of Dictionary type, |key| must be just - // the capability's top-level key and not include path expansions to levels - // farther down. For example, "foo" is a valid value for |key|, but "foo.bar" - // is not. Note that if "foo.bar" is updated in SetCapability(), the - // Validate() method for "foo"'s Validator will be called, with a |path| of - // "foo.bar". Note that this method does not add or modify the capability. - // To do this, SetCapability() should be called, or Validators can call - // SetPublicValidatedValue() or SetPrivateValidatedValue(). This method is - // synchronous to ensure Validators know exactly when they may start receiving - // validation requests. - virtual void Register(const std::string& key, - Validator* validator) = 0; - // Unregisters Validator for |key|. |validator| argument must match - // |validator| argument that was passed in to Register() for |key|. Note that - // the capability and its value remain untouched. This method is synchronous - // to ensure Validators know exactly when they will stop receiving validation - // requests. - virtual void Unregister(const std::string& key, - const Validator* validator) = 0; - // Gets the Validator currently registered for |key|. Returns nullptr if - // no Validator is registered. - virtual Validator* GetValidator(const std::string& key) const = 0; - - // Accessors for default capabilities. Note that the capability must be added - // through SetCapability() (or Set[Private]ValidatedValue() for Validators) - // before accessors are called. - virtual bool AssistantSupported() const = 0; - virtual bool BluetoothSupported() const = 0; - virtual bool DisplaySupported() const = 0; - virtual bool HiResAudioSupported() const = 0; - - // Returns a deep copy of the value at |path|. If the capability at |path| - // does not exist, a null scoped_ptr is returned. - virtual base::Value GetCapability(const std::string& path) const = 0; - - // Use this method to access dictionary and JSON string. No deep copying is - // performed, so this method is inexpensive. Note that any capability updates - // that occur after GetAllData() has been called will not be reflected in the - // returned scoped_refptr. You can think of this method as taking a snapshot - // of the capabilities when it gets called. All capabilities (those set by - // SetPrivateValidatedValue() and SetPublicValidatedValue()) will be present - // in the returned Data object. - virtual scoped_refptr GetAllData() const = 0; - // Similar to GetAllData(), but this only returns public capabilities. - virtual scoped_refptr GetPublicData() const = 0; - - // Updates the value at |path| to |proposed_value| if |path| already exists - // and adds new capability if |path| doesn't. Note that if a key has been - // registered that is at the beginning of |path|, then the Validator will be - // used to determine if |proposed_value| is accepted. - // Ex: If "foo" has a Validator registered, a |path| of "foo.bar" - // will cause |proposed_value| to go through the Validator's Validate() - // method. Client code may use the Observer interface to determine the - // ultimate value used. - // This method is asynchronous. By default, this method will classify the new - // value at |path| as a public capability; if a Validator is present, it may - // classify the value as public or private via SetPublicValidatedValue() or - // SetPrivateValidatedValue() respectively. - virtual void SetCapability(const std::string& path, - base::Value proposed_value) = 0; - - // Iterates through entries in |dict| and calls SetCapability() for each one. - // This method is asynchronous. - virtual void MergeDictionary(const base::Value::Dict& dict) = 0; - - // Adds/removes an observer. It doesn't take the ownership of |observer|. - virtual void AddCapabilitiesObserver(Observer* observer) = 0; - virtual void RemoveCapabilitiesObserver(Observer* observer) = 0; - - protected: - DeviceCapabilities() {} - - // For derived implementation classes to create Data instances since they do - // not have access to Data constructors. - // Creates empty dictionary with no capabilities. - static scoped_refptr CreateData(); - // Uses |dictionary| as capabilities dictionary. - static scoped_refptr CreateData(base::Value::Dict dictionary); - - private: - // Internally update the capability residing at |path| to |new_value|. This - // capability will be visible in GetAllData() and GetPublicData(). - virtual void SetPublicValidatedValue(const std::string& path, - base::Value new_value) = 0; - // Similar to SetPublicValidatedValue(), but this capability will only be - // visible in GetAllData(). - virtual void SetPrivateValidatedValue(const std::string& path, - base::Value new_value) = 0; -}; - -} // namespace chromecast - -#endif // CHROMECAST_BASE_DEVICE_CAPABILITIES_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/device_capabilities_impl.cc chromium-132.0.6834.159/chromecast/base/device_capabilities_impl.cc --- chromium-132.0.6834.110/chromecast/base/device_capabilities_impl.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/device_capabilities_impl.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,418 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/device_capabilities_impl.h" - -#include - -#include - -#include "base/containers/contains.h" -#include "base/functional/bind.h" -#include "base/functional/callback_helpers.h" -#include "base/json/json_writer.h" -#include "base/logging.h" -#include "base/memory/ptr_util.h" -#include "base/not_fatal_until.h" -#include "base/strings/string_util.h" -#include "base/task/single_thread_task_runner.h" -#include "base/values.h" - -namespace chromecast { - -namespace { - -const char kPathSeparator = '.'; - -// Determines if a key passed to Register() is valid. No path separators can -// be present in the key and it must not be empty. -bool IsValidRegisterKey(const std::string& key) { - return !key.empty() && !base::Contains(key, kPathSeparator); -} - -// Determines if a path is valid. This is true if there are no empty keys -// anywhere in the path (ex: .foo, foo., foo..bar are all invalid). -bool IsValidPath(const std::string& path) { - return !path.empty() && *path.begin() != kPathSeparator && - *path.rbegin() != kPathSeparator && - path.find("..") == std::string::npos; -} - -// Given a path, gets the first key present in the path (ex: for path "foo.bar" -// return "foo"). -std::string GetFirstKey(const std::string& path) { - std::size_t length_to_first_separator = path.find(kPathSeparator); - return (length_to_first_separator == std::string::npos) - ? path - : path.substr(0, length_to_first_separator); -} - -} // namespace - -// static Default Capability Keys -const char DeviceCapabilities::kKeyAssistantSupported[] = "assistant_supported"; -const char DeviceCapabilities::kKeyBluetoothSupported[] = "bluetooth_supported"; -const char DeviceCapabilities::kKeyDisplaySupported[] = "display_supported"; -const char DeviceCapabilities::kKeyHiResAudioSupported[] = - "hi_res_audio_supported"; - -// static -std::unique_ptr DeviceCapabilities::Create() { - return base::WrapUnique(new DeviceCapabilitiesImpl); -} - -// static -std::unique_ptr DeviceCapabilities::CreateForTesting() { - DeviceCapabilities* capabilities = new DeviceCapabilitiesImpl; - capabilities->SetCapability(kKeyBluetoothSupported, base::Value(false)); - capabilities->SetCapability(kKeyDisplaySupported, base::Value(true)); - capabilities->SetCapability(kKeyHiResAudioSupported, base::Value(false)); - capabilities->SetCapability(kKeyAssistantSupported, base::Value(true)); - return base::WrapUnique(capabilities); -} - -scoped_refptr DeviceCapabilities::CreateData() { - return base::WrapRefCounted(new Data); -} - -scoped_refptr DeviceCapabilities::CreateData( - base::Value::Dict dictionary) { - return base::WrapRefCounted(new Data(std::move(dictionary))); -} - -DeviceCapabilities::Validator::Validator(DeviceCapabilities* capabilities) - : capabilities_(capabilities) { - DCHECK(capabilities); -} - -void DeviceCapabilities::Validator::SetPublicValidatedValue( - const std::string& path, - base::Value new_value) const { - capabilities_->SetPublicValidatedValue(path, std::move(new_value)); -} - -void DeviceCapabilities::Validator::SetPrivateValidatedValue( - const std::string& path, - base::Value new_value) const { - capabilities_->SetPrivateValidatedValue(path, std::move(new_value)); -} - -DeviceCapabilities::Data::Data() { - base::JSONWriter::Write(dictionary_, &json_string_); -} - -DeviceCapabilities::Data::Data(base::Value::Dict dictionary) - : dictionary_(std::move(dictionary)) { - base::JSONWriter::Write(dictionary_, &json_string_); -} - -DeviceCapabilitiesImpl::Data::~Data() {} - -DeviceCapabilitiesImpl::ValidatorInfo::ValidatorInfo(Validator* validator) - : validator_(validator), - task_runner_(base::SingleThreadTaskRunner::GetCurrentDefault()) { - DCHECK(validator_); - DCHECK(task_runner_.get()); -} - -DeviceCapabilitiesImpl::ValidatorInfo::~ValidatorInfo() { - // Check that ValidatorInfo is being destroyed on the same thread that it was - // constructed on. - DCHECK(task_runner_->BelongsToCurrentThread()); -} - -void DeviceCapabilitiesImpl::ValidatorInfo::Validate( - const std::string& path, - base::Value proposed_value) const { - // Check that we are running Validate on the same thread that ValidatorInfo - // was constructed on. - DCHECK(task_runner_->BelongsToCurrentThread()); - validator_->Validate(path, std::move(proposed_value)); -} - -DeviceCapabilitiesImpl::DeviceCapabilitiesImpl() - : all_data_(CreateData()), - public_data_(CreateData()), - task_runner_for_writes_( - base::SingleThreadTaskRunner::GetCurrentDefault()), - observer_list_(new base::ObserverListThreadSafe) { - DCHECK(task_runner_for_writes_.get()); -} - -DeviceCapabilitiesImpl::~DeviceCapabilitiesImpl() { - // Make sure that any registered Validators have unregistered at this point - DCHECK(validator_map_.empty()) - << "Some validators weren't properly unregistered: " << [this] { - std::vector keys; - for (const auto& pair : validator_map_) { - keys.push_back(pair.first); - } - return base::JoinString(keys, ", "); - }(); - // Make sure that all observers have been removed at this point - observer_list_->AssertEmpty(); -} - -void DeviceCapabilitiesImpl::Register(const std::string& key, - Validator* validator) { - DCHECK(IsValidRegisterKey(key)); - DCHECK(validator); - - base::AutoLock auto_lock(validation_lock_); - // Check that a validator has not already been registered for this key - DCHECK_EQ(0u, validator_map_.count(key)); - validator_map_[key] = std::make_unique(validator); -} - -void DeviceCapabilitiesImpl::Unregister(const std::string& key, - const Validator* validator) { - base::AutoLock auto_lock(validation_lock_); - auto validator_it = validator_map_.find(key); - CHECK(validator_it != validator_map_.end(), base::NotFatalUntil::M130); - // Check that validator being unregistered matches the original for |key|. - // This prevents managers from accidentally unregistering incorrect - // validators. - DCHECK_EQ(validator, validator_it->second->validator()); - // Check that validator is unregistering on same thread that it was - // registered on - DCHECK(validator_it->second->task_runner()->BelongsToCurrentThread()); - validator_map_.erase(validator_it); -} - -DeviceCapabilities::Validator* DeviceCapabilitiesImpl::GetValidator( - const std::string& key) const { - base::AutoLock auto_lock(validation_lock_); - auto validator_it = validator_map_.find(key); - return validator_it == validator_map_.end() - ? nullptr - : validator_it->second->validator(); -} - -bool DeviceCapabilitiesImpl::BluetoothSupported() const { - scoped_refptr data_ref = GetAllData(); - auto bluetooth_supported = - data_ref->dictionary().FindBool(kKeyBluetoothSupported); - DCHECK(bluetooth_supported); - return *bluetooth_supported; -} - -bool DeviceCapabilitiesImpl::DisplaySupported() const { - scoped_refptr data_ref = GetAllData(); - auto display_supported = - data_ref->dictionary().FindBool(kKeyDisplaySupported); - DCHECK(display_supported); - return *display_supported; -} - -bool DeviceCapabilitiesImpl::HiResAudioSupported() const { - scoped_refptr data_ref = GetAllData(); - auto hi_res_audio_supported = - data_ref->dictionary().FindBool(kKeyHiResAudioSupported); - DCHECK(hi_res_audio_supported); - return *hi_res_audio_supported; -} - -bool DeviceCapabilitiesImpl::AssistantSupported() const { - scoped_refptr data_ref = GetAllData(); - auto assistant_supported = - data_ref->dictionary().FindBool(kKeyAssistantSupported); - DCHECK(assistant_supported); - return *assistant_supported; -} - -base::Value DeviceCapabilitiesImpl::GetCapability( - const std::string& path) const { - scoped_refptr data_ref = GetAllData(); - const base::Value* value = data_ref->dictionary().FindByDottedPath(path); - return value ? value->Clone() : base::Value(); -} - -scoped_refptr DeviceCapabilitiesImpl::GetAllData() - const { - // Need to acquire lock here when copy constructing all_data_ otherwise we - // could concurrently be writing to scoped_refptr in SetPublicValidatedValue() - // or SetPrivateValidatedValue(), which could cause a bad scoped_refptr read. - base::AutoLock auto_lock(data_lock_); - return all_data_; -} - -scoped_refptr DeviceCapabilitiesImpl::GetPublicData() - const { - // Need to acquire lock here when copy constructing public_data_ otherwise we - // could concurrently be writing to scoped_refptr in SetPublicValidatedValue() - // or SetPrivateValidatedValue(), which could cause a bad scoped_refptr read. - base::AutoLock auto_lock(data_lock_); - return public_data_; -} - -void DeviceCapabilitiesImpl::SetCapability(const std::string& path, - base::Value proposed_value) { - if (!IsValidPath(path)) { - LOG(DFATAL) << "Invalid capability path encountered for SetCapability()"; - return; - } - - { - base::AutoLock auto_lock(validation_lock_); - // Check for Validator registered under first key per the Register() - // interface. - auto validator_it = validator_map_.find(GetFirstKey(path)); - if (validator_it != validator_map_.end()) { - // We do not want to post a task directly for the Validator's Validate() - // method here because if another thread is in the middle of unregistering - // that Validator, there will be an outstanding call to Validate() that - // occurs after it has unregistered. Since ValidatorInfo gets destroyed - // in Unregister() on same thread that validation should run on, we can - // post a task to the Validator's thread with weak_ptr. This way, if the - // Validator gets unregistered, the call to Validate will get skipped. - validator_it->second->task_runner()->PostTask( - FROM_HERE, base::BindOnce(&ValidatorInfo::Validate, - validator_it->second->AsWeakPtr(), path, - std::move(proposed_value))); - return; - } - } - // Since we are done checking for a registered Validator at this point, we - // can release the lock. All further member access will be for capabilities. - // By default, a capability without a validator will be public. - SetPublicValidatedValue(path, std::move(proposed_value)); -} - -void DeviceCapabilitiesImpl::MergeDictionary(const base::Value::Dict& dict) { - for (const auto [key, value] : dict) { - SetCapability(key, value.Clone()); - } -} - -void DeviceCapabilitiesImpl::AddCapabilitiesObserver(Observer* observer) { - DCHECK(observer); - observer_list_->AddObserver(observer); -} - -void DeviceCapabilitiesImpl::RemoveCapabilitiesObserver(Observer* observer) { - DCHECK(observer); - observer_list_->RemoveObserver(observer); -} - -void DeviceCapabilitiesImpl::SetPublicValidatedValue(const std::string& path, - base::Value new_value) { - // All internal writes/modifications of capabilities must occur on same - // thread to avoid race conditions. - if (!task_runner_for_writes_->BelongsToCurrentThread()) { - task_runner_for_writes_->PostTask( - FROM_HERE, - base::BindOnce(&DeviceCapabilitiesImpl::SetPublicValidatedValue, - base::Unretained(this), path, std::move(new_value))); - return; - } - - DCHECK(IsValidPath(path)); - - // If the capability exists, it must be public (present in all_data_ and - // public_data_). We cannot change the privacy of an already existing - // capability. - bool is_private = all_data_->dictionary().Find(path) && - !public_data_->dictionary().Find(path); - if (is_private) { - NOTREACHED() << "Cannot make a private capability '" << path << "' public."; - } - - // We don't need to acquire lock here when reading public_data_ because we - // know that all writes to public_data_ must occur serially on thread that - // we're on. - const base::Value* cur_value = - public_data_->dictionary().FindByDottedPath(path); - bool capability_unchanged = cur_value && *cur_value == new_value; - if (capability_unchanged) { - DVLOG(1) << "Ignoring unchanged public capability: " << path; - return; - } - - // In this sequence, we create deep copies for both dictionaries, modify the - // copies, and then do a pointer swap. We do this to have minimal time spent - // in the data_lock_. If we were to lock and modify the capabilities - // dictionary directly, there may be expensive writes that block other - // threads. - scoped_refptr new_public_data = GenerateDataWithNewValue( - public_data_->dictionary(), path, new_value.Clone()); - scoped_refptr new_data = GenerateDataWithNewValue( - all_data_->dictionary(), path, std::move(new_value)); - - { - base::AutoLock auto_lock(data_lock_); - // Using swap instead of assignment operator here because it's a little - // faster. Avoids an extra call to AddRef()/Release(). - public_data_.swap(new_public_data); - all_data_.swap(new_data); - } - - // Even though ObserverListThreadSafe notifications are always asynchronous - // (posts task even if to same thread), no locks should be held at this point - // in the code. This is just to be safe that no deadlocks occur if Observers - // call DeviceCapabilities methods in OnCapabilitiesChanged(). - observer_list_->Notify(FROM_HERE, &Observer::OnCapabilitiesChanged, path); -} - -void DeviceCapabilitiesImpl::SetPrivateValidatedValue(const std::string& path, - base::Value new_value) { - // All internal writes/modifications of capabilities must occur on same - // thread to avoid race conditions. - if (!task_runner_for_writes_->BelongsToCurrentThread()) { - task_runner_for_writes_->PostTask( - FROM_HERE, - base::BindOnce(&DeviceCapabilitiesImpl::SetPrivateValidatedValue, - base::Unretained(this), path, std::move(new_value))); - return; - } - - DCHECK(IsValidPath(path)); - - // If the capability exists, it must be private (present in all_data_ only). - // We cannot change the privacy of an already existing capability. - const auto* is_public = public_data_->dictionary().Find(path); - if (is_public) { - NOTREACHED() << "Cannot make a public capability '" << path << "' private."; - } - - // We don't need to acquire lock here when reading all_data_ because we know - // that all writes to all_data_ must occur serially on thread that we're on. - const base::Value* cur_value = all_data_->dictionary().FindByDottedPath(path); - bool capability_unchanged = cur_value && *cur_value == new_value; - if (capability_unchanged) { - DVLOG(1) << "Ignoring unchanged capability: " << path; - return; - } - - // In this sequence, we create a deep copy, modify the deep copy, and then - // do a pointer swap. We do this to have minimal time spent in the - // data_lock_. If we were to lock and modify the capabilities - // dictionary directly, there may be expensive writes that block other - // threads. - scoped_refptr new_data = GenerateDataWithNewValue( - all_data_->dictionary(), path, std::move(new_value)); - - { - base::AutoLock auto_lock(data_lock_); - // Using swap instead of assignment operator here because it's a little - // faster. Avoids an extra call to AddRef()/Release(). - all_data_.swap(new_data); - } - - // Even though ObserverListThreadSafe notifications are always asynchronous - // (posts task even if to same thread), no locks should be held at this point - // in the code. This is just to be safe that no deadlocks occur if Observers - // call DeviceCapabilities methods in OnCapabilitiesChanged(). - observer_list_->Notify(FROM_HERE, &Observer::OnCapabilitiesChanged, path); -} - -scoped_refptr -DeviceCapabilitiesImpl::GenerateDataWithNewValue(const base::Value::Dict& dict, - const std::string& path, - base::Value new_value) { - base::Value::Dict dict_deep_copy(dict.Clone()); - dict_deep_copy.SetByDottedPath(path, std::move(new_value)); - return CreateData(std::move(dict_deep_copy)); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/device_capabilities_impl.h chromium-132.0.6834.159/chromecast/base/device_capabilities_impl.h --- chromium-132.0.6834.110/chromecast/base/device_capabilities_impl.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/device_capabilities_impl.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,123 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_DEVICE_CAPABILITIES_IMPL_H_ -#define CHROMECAST_BASE_DEVICE_CAPABILITIES_IMPL_H_ - -#include -#include -#include - -#include "base/memory/raw_ptr.h" -#include "base/memory/weak_ptr.h" -#include "base/observer_list_threadsafe.h" -#include "base/synchronization/lock.h" -#include "base/values.h" -#include "chromecast/base/device_capabilities.h" - -namespace base { -class SingleThreadTaskRunner; -} - -namespace chromecast { - -class DeviceCapabilitiesImpl : public DeviceCapabilities { - public: - DeviceCapabilitiesImpl(const DeviceCapabilitiesImpl&) = delete; - DeviceCapabilitiesImpl& operator=(const DeviceCapabilitiesImpl&) = delete; - - ~DeviceCapabilitiesImpl() override; - - // DeviceCapabilities implementation: - void Register(const std::string& key, Validator* validator) override; - void Unregister(const std::string& key, const Validator* validator) override; - Validator* GetValidator(const std::string& key) const override; - bool AssistantSupported() const override; - bool BluetoothSupported() const override; - bool DisplaySupported() const override; - bool HiResAudioSupported() const override; - base::Value GetCapability(const std::string& path) const override; - scoped_refptr GetAllData() const override; - scoped_refptr GetPublicData() const override; - void SetCapability(const std::string& path, - base::Value proposed_value) override; - void MergeDictionary(const base::Value::Dict& dict) override; - void AddCapabilitiesObserver(Observer* observer) override; - void RemoveCapabilitiesObserver(Observer* observer) override; - - private: - class ValidatorInfo final { - public: - explicit ValidatorInfo(Validator* validator); - - ValidatorInfo(const ValidatorInfo&) = delete; - ValidatorInfo& operator=(const ValidatorInfo&) = delete; - - ~ValidatorInfo(); - - Validator* validator() const { return validator_; } - - scoped_refptr task_runner() const { - return task_runner_; - } - - void Validate(const std::string& path, base::Value proposed_value) const; - - base::WeakPtr AsWeakPtr() { - return weak_ptr_factory_.GetWeakPtr(); - } - - private: - const raw_ptr validator_; - // TaskRunner of thread that validator_ was registered on - const scoped_refptr task_runner_; - - base::WeakPtrFactory weak_ptr_factory_{this}; - }; - - // For DeviceCapabilitiesImpl() - friend class DeviceCapabilities; - - // Map from capability key to corresponding ValidatorInfo. Gets updated - // in Register()/Unregister(). - using ValidatorMap = - std::unordered_map>; - - // Internal constructor used by static DeviceCapabilities::Create*() methods. - DeviceCapabilitiesImpl(); - - void SetPublicValidatedValue(const std::string& path, - base::Value new_value) override; - void SetPrivateValidatedValue(const std::string& path, - base::Value new_value) override; - void SetValidatedValueInternal(const std::string& path, - base::Value new_value); - - scoped_refptr GenerateDataWithNewValue(const base::Value::Dict& dict, - const std::string& path, - base::Value new_value); - - // Lock for reading/writing all_data_ or public_data_ pointers - mutable base::Lock data_lock_; - // Lock for reading/writing validator_map_ - mutable base::Lock validation_lock_; - - // Contains all public and private capabilities. - scoped_refptr all_data_; - // Contains only public capabilities. All capabilities in public_data_ are - // present and duplicated in all_data_. This duplication allows callers to - // quickly query public capabilities without having build a new data - // dictionary. - scoped_refptr public_data_; - // TaskRunner for capability writes. All internal writes to data_ must occur - // on task_runner_for_writes_'s thread. - const scoped_refptr task_runner_for_writes_; - - ValidatorMap validator_map_; - const scoped_refptr> observer_list_; -}; - -} // namespace chromecast - -#endif // CHROMECAST_BASE_DEVICE_CAPABILITIES_IMPL_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/device_capabilities_impl_unittest.cc chromium-132.0.6834.159/chromecast/base/device_capabilities_impl_unittest.cc --- chromium-132.0.6834.110/chromecast/base/device_capabilities_impl_unittest.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/device_capabilities_impl_unittest.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,649 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/device_capabilities_impl.h" - -#include -#include - -#include "base/json/json_reader.h" -#include "base/json/json_writer.h" -#include "base/memory/ptr_util.h" -#include "base/memory/raw_ptr.h" -#include "base/message_loop/message_pump_type.h" -#include "base/run_loop.h" -#include "base/task/single_thread_task_runner.h" -#include "base/test/task_environment.h" -#include "base/values.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace chromecast { - -namespace { - -const char kSampleDictionaryCapability[] = - "{" - " \"dummy_field_bool\": true," - " \"dummy_field_int\": 99" - "}"; - -void GetSampleDefaultCapability(std::string* key, base::Value* init_value); -void TestBasicOperations(DeviceCapabilities* capabilities); - -// Simple capability manager that implements the Validator interface. Either -// accepts or rejects all proposed changes based on |accept_changes| constructor -// argument. -class FakeCapabilityManagerSimple : public DeviceCapabilities::Validator { - public: - // Registers itself as Validator in constructor. If init_value is not null, - // the capability gets initialized to that value. Else capability remains - // untouched. - FakeCapabilityManagerSimple(DeviceCapabilities* capabilities, - const std::string& key, - base::Value init_value, - bool accept_changes, - bool validate_private) - : DeviceCapabilities::Validator(capabilities), - key_(key), - accept_changes_(accept_changes), - validate_private_(validate_private) { - capabilities->Register(key, this); - if (!init_value.is_none()) { - if (validate_private_) { - SetPrivateValidatedValue(key, std::move(init_value)); - } else { - SetPublicValidatedValue(key, std::move(init_value)); - } - } - } - - // Unregisters itself as Validator. - ~FakeCapabilityManagerSimple() override { - capabilities()->Unregister(key_, this); - } - - void Validate(const std::string& path, base::Value proposed_value) override { - ASSERT_EQ(path.find(key_), 0ul); - if (!accept_changes_) - return; - if (validate_private_) { - SetPrivateValidatedValue(path, std::move(proposed_value)); - } else { - SetPublicValidatedValue(path, std::move(proposed_value)); - } - } - - private: - const std::string key_; - const bool accept_changes_; - const bool validate_private_; -}; - -// Used to test that capabilities/validator can be read and written in -// Validate() without encountering deadlocks/unexpected behavior. -class FakeCapabilityManagerComplex : public DeviceCapabilities::Validator { - public: - FakeCapabilityManagerComplex(DeviceCapabilities* capabilities, - const std::string& key) - : DeviceCapabilities::Validator(capabilities), key_(key) { - capabilities->Register(key, this); - } - - // Unregisters itself as Validator. - ~FakeCapabilityManagerComplex() override { - capabilities()->Unregister(key_, this); - } - - // Runs TestBasicOperations(). - void Validate(const std::string& path, base::Value proposed_value) override { - TestBasicOperations(capabilities()); - } - - private: - const std::string key_; -}; - -// Used to test that capabilities/validators can be read and written in -// OnCapabilitiesChanged() without encountering deadlocks/unexpected behavior. -class FakeCapabilitiesObserver : public DeviceCapabilities::Observer { - public: - explicit FakeCapabilitiesObserver(DeviceCapabilities* capabilities) - : capabilities_(capabilities), removed_as_observer(false) { - capabilities_->AddCapabilitiesObserver(this); - } - - ~FakeCapabilitiesObserver() override { - if (!removed_as_observer) - capabilities_->RemoveCapabilitiesObserver(this); - } - - // Runs TestBasicOperations(). - void OnCapabilitiesChanged(const std::string& path) override { - TestBasicOperations(capabilities_); - // To prevent infinite loop of SetCapability() -> OnCapabilitiesChanged() - // -> SetCapability() -> OnCapabilitiesChanged() etc. - capabilities_->RemoveCapabilitiesObserver(this); - removed_as_observer = true; - } - - private: - const raw_ptr capabilities_; - bool removed_as_observer; -}; - -// Used to test that OnCapabilitiesChanged() is called when capabilities are -// modified -class MockCapabilitiesObserver : public DeviceCapabilities::Observer { - public: - MockCapabilitiesObserver() {} - - MockCapabilitiesObserver(const MockCapabilitiesObserver&) = delete; - MockCapabilitiesObserver& operator=(const MockCapabilitiesObserver&) = delete; - - ~MockCapabilitiesObserver() override {} - - MOCK_METHOD1(OnCapabilitiesChanged, void(const std::string& path)); -}; - -// Test fixtures needs an example default capability to test DeviceCapabilities -// methods. Gets a sample key and initial value. -void GetSampleDefaultCapability(std::string* key, base::Value* init_value) { - DCHECK(key); - DCHECK(init_value); - *key = DeviceCapabilities::kKeyBluetoothSupported; - *init_value = base::Value(true); -} - -// For test fixtures that test dynamic capabilities, gets a sample key -// and initial value. -void GetSampleDynamicCapability(std::string* key, base::Value* init_value) { - DCHECK(key); - DCHECK(init_value); - *key = "dummy_dynamic_key"; - *init_value = base::Value(99); -} - -// Gets a value for sample default capability different from |init_value| -// returned in GetSampleDefaultCapability(). Must be of same type as -// |init_value| of course. -base::Value GetSampleDefaultCapabilityNewValue() { - return base::Value(false); -} - -// Gets a value for sample dynamic capability different from |init_value| -// returned in GetSampleDynamicCapability(). Must be of same type as -// |init_value| of course. -base::Value GetSampleDynamicCapabilityNewValue() { - return base::Value(100); -} - -// Tests that |json| string matches contents of a DictionaryValue with one entry -// specified by |key| and |value|. -bool JsonStringEquals(const std::string& json, - const std::string& key, - const base::Value& value) { - return base::WriteJson(base::Value::Dict().Set(key, value.Clone())) == json; -} - -// The function runs through the set of basic operations of DeviceCapabilities. -// Register validator for sample default capability, reads capability, writes -// capability, and unregister validator. After it has completed, use -// AssertBasicOperationsSuccessful() to ensure that all operations completed -// successfully. Sample default capability should not be added or registered in -// class before this function is called. -void TestBasicOperations(DeviceCapabilities* capabilities) { - std::string key; - base::Value init_value; - GetSampleDefaultCapability(&key, &init_value); - - ASSERT_TRUE(capabilities->GetCapability(key).is_none()); - ASSERT_FALSE(capabilities->GetValidator(key)); - - // Register and write capability - FakeCapabilityManagerSimple* manager(new FakeCapabilityManagerSimple( - capabilities, key, init_value.Clone(), true, false)); - // Read Validator - EXPECT_EQ(capabilities->GetValidator(key), manager); - // Read Capability - EXPECT_EQ(capabilities->GetCapability(key), init_value); - // Unregister - delete manager; - - // Write capability again. Provides way of checking that this function - // ran and was successful. - base::Value new_value = GetSampleDefaultCapabilityNewValue(); - capabilities->SetCapability(key, std::move(new_value)); -} - -// See TestBasicOperations() comment. -void AssertBasicOperationsSuccessful(const DeviceCapabilities* capabilities) { - base::RunLoop().RunUntilIdle(); - std::string key; - base::Value init_value; - GetSampleDefaultCapability(&key, &init_value); - base::Value value = capabilities->GetCapability(key); - base::Value new_value = GetSampleDefaultCapabilityNewValue(); - EXPECT_EQ(value, new_value); -} - -} // namespace - -class DeviceCapabilitiesImplTest : public ::testing::Test { - protected: - void SetUp() override { - capabilities_ = DeviceCapabilities::Create(); - mock_capabilities_observer_.reset(new MockCapabilitiesObserver()); - capabilities_->AddCapabilitiesObserver(mock_capabilities_observer_.get()); - - // We set the default gmock expected calls to any so that tests must - // 'opt in' to checking the calls rather than 'opt out'. This avoids having - // to add explicit calls in test cases that don't care in order to prevent - // lots of useless mock warnings. - EXPECT_CALL(*mock_capabilities_observer_, OnCapabilitiesChanged(testing::_)) - .Times(testing::AnyNumber()); - } - - void TearDown() override { - capabilities_->RemoveCapabilitiesObserver( - mock_capabilities_observer_.get()); - mock_capabilities_observer_.reset(); - capabilities_.reset(); - } - - DeviceCapabilities* capabilities() const { return capabilities_.get(); } - - MockCapabilitiesObserver* capabilities_observer() const { - return mock_capabilities_observer_.get(); - } - - private: - base::test::SingleThreadTaskEnvironment task_environment_; - std::unique_ptr capabilities_; - std::unique_ptr mock_capabilities_observer_; -}; - -// Tests that class is in correct state after Create(). -TEST_F(DeviceCapabilitiesImplTest, Create) { - std::string empty_dict_string; - base::JSONWriter::Write(base::Value(base::Value::Type::DICT), - &empty_dict_string); - EXPECT_EQ(capabilities()->GetAllData()->json_string(), empty_dict_string); - EXPECT_TRUE(capabilities()->GetAllData()->dictionary().empty()); -} - -// Tests Register() of a default capability. -TEST_F(DeviceCapabilitiesImplTest, Register) { - std::string key; - base::Value init_value; - GetSampleDefaultCapability(&key, &init_value); - - EXPECT_CALL(*capabilities_observer(), OnCapabilitiesChanged(key)).Times(0); - FakeCapabilityManagerSimple manager(capabilities(), key, base::Value(), true, - false); - - EXPECT_EQ(capabilities()->GetValidator(key), &manager); - std::string empty_dict_string; - base::JSONWriter::Write(base::Value(base::Value::Type::DICT), - &empty_dict_string); - EXPECT_EQ(capabilities()->GetAllData()->json_string(), empty_dict_string); - EXPECT_TRUE(capabilities()->GetCapability(key).is_none()); -} - -// Tests Unregister() of a default capability. -TEST_F(DeviceCapabilitiesImplTest, Unregister) { - std::string key; - base::Value init_value; - GetSampleDefaultCapability(&key, &init_value); - - EXPECT_CALL(*capabilities_observer(), OnCapabilitiesChanged(key)).Times(0); - FakeCapabilityManagerSimple* manager = new FakeCapabilityManagerSimple( - capabilities(), key, base::Value(), true, false); - - delete manager; - - EXPECT_FALSE(capabilities()->GetValidator(key)); - std::string empty_dict_string; - base::JSONWriter::Write(base::Value(base::Value::Type::DICT), - &empty_dict_string); - EXPECT_EQ(capabilities()->GetAllData()->json_string(), empty_dict_string); - EXPECT_TRUE(capabilities()->GetCapability(key).is_none()); -} - -// Tests GetCapability() and updating the value through SetCapability(). -TEST_F(DeviceCapabilitiesImplTest, GetCapabilityAndSetCapability) { - std::string key; - base::Value init_value; - GetSampleDefaultCapability(&key, &init_value); - FakeCapabilityManagerSimple manager(capabilities(), key, init_value.Clone(), - true, false); - - EXPECT_EQ(capabilities()->GetCapability(key), init_value); - - base::Value new_value = GetSampleDefaultCapabilityNewValue(); - capabilities()->SetCapability(key, new_value.Clone()); - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(capabilities()->GetCapability(key), new_value); -} - -// Tests BluetoothSupported() and updating this value through SetCapability(). -TEST_F(DeviceCapabilitiesImplTest, BluetoothSupportedAndSetCapability) { - FakeCapabilityManagerSimple manager( - capabilities(), DeviceCapabilities::kKeyBluetoothSupported, - base::Value(true), true, false); - - EXPECT_TRUE(capabilities()->BluetoothSupported()); - capabilities()->SetCapability(DeviceCapabilities::kKeyBluetoothSupported, - base::Value(false)); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(capabilities()->BluetoothSupported()); -} - -// Tests DisplaySupported() and updating this value through SetCapability(). -TEST_F(DeviceCapabilitiesImplTest, DisplaySupportedAndSetCapability) { - FakeCapabilityManagerSimple manager(capabilities(), - DeviceCapabilities::kKeyDisplaySupported, - base::Value(true), true, false); - - EXPECT_TRUE(capabilities()->DisplaySupported()); - capabilities()->SetCapability(DeviceCapabilities::kKeyDisplaySupported, - base::Value(false)); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(capabilities()->DisplaySupported()); -} - -// Tests HiResAudioSupported() and updating this value through SetCapability() -TEST_F(DeviceCapabilitiesImplTest, HiResAudioSupportedAndSetCapability) { - FakeCapabilityManagerSimple manager( - capabilities(), DeviceCapabilities::kKeyHiResAudioSupported, - base::Value(true), true, false); - - EXPECT_TRUE(capabilities()->HiResAudioSupported()); - capabilities()->SetCapability(DeviceCapabilities::kKeyHiResAudioSupported, - base::Value(false)); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(capabilities()->HiResAudioSupported()); -} - -// Tests AssistantSupported() and updating this value through SetCapability() -TEST_F(DeviceCapabilitiesImplTest, AssistantSupportedAndSetCapability) { - FakeCapabilityManagerSimple manager( - capabilities(), DeviceCapabilities::kKeyAssistantSupported, - base::Value(true), true, false); - - EXPECT_TRUE(capabilities()->AssistantSupported()); - capabilities()->SetCapability(DeviceCapabilities::kKeyAssistantSupported, - base::Value(false)); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE(capabilities()->AssistantSupported()); -} - -// Tests SetCapability() for a default capability when the capability's manager -// rejects the proposed change. -TEST_F(DeviceCapabilitiesImplTest, SetCapabilityInvalid) { - std::string key; - base::Value init_value; - GetSampleDefaultCapability(&key, &init_value); - FakeCapabilityManagerSimple manager(capabilities(), key, init_value.Clone(), - false, false); - - capabilities()->SetCapability(key, GetSampleDefaultCapabilityNewValue()); - base::RunLoop().RunUntilIdle(); - - EXPECT_EQ(capabilities()->GetCapability(key), init_value); -} - -// Test that SetCapability() updates the capabilities string correctly -TEST_F(DeviceCapabilitiesImplTest, SetCapabilityUpdatesString) { - std::string key; - base::Value init_value; - GetSampleDefaultCapability(&key, &init_value); - FakeCapabilityManagerSimple manager(capabilities(), key, init_value.Clone(), - true, false); - - EXPECT_TRUE(JsonStringEquals(capabilities()->GetAllData()->json_string(), key, - init_value)); - - base::Value new_value = GetSampleDefaultCapabilityNewValue(); - capabilities()->SetCapability(key, new_value.Clone()); - base::RunLoop().RunUntilIdle(); - EXPECT_TRUE(JsonStringEquals(capabilities()->GetAllData()->json_string(), key, - new_value)); -} - -// Tests that GetPublicData() does not include private capabilities -TEST_F(DeviceCapabilitiesImplTest, SetPublicPrivateCapabilities) { - std::string key_private = "private"; - std::string key_public = "public"; - base::Value init_value(true); - - // Dictionary of only public values. - base::Value::Dict public_dict; - public_dict.Set(key_public, init_value.Clone()); - // Dictionary of public and private values. - base::Value::Dict full_dict; - full_dict.Set(key_public, init_value.Clone()); - full_dict.Set(key_private, init_value.Clone()); - - FakeCapabilityManagerSimple public_manager(capabilities(), key_public, - init_value.Clone(), true, false); - FakeCapabilityManagerSimple private_manager(capabilities(), key_private, - init_value.Clone(), true, true); - - EXPECT_EQ(capabilities()->GetAllData()->dictionary(), full_dict); - EXPECT_EQ(capabilities()->GetPublicData()->dictionary(), public_dict); -} - -// Tests that SetCapability() defaults to making a capability public -TEST_F(DeviceCapabilitiesImplTest, NoValidatorDefaultsToPublicCapability) { - std::string key_private = "private"; - std::string key_public = "public"; - base::Value init_value(true); - - // Dictionary of only public values. - base::Value::Dict public_dict; - public_dict.Set(key_public, init_value.Clone()); - // Dictionary of public and private values. - base::Value::Dict full_dict; - full_dict.Set(key_public, init_value.Clone()); - full_dict.Set(key_private, init_value.Clone()); - - // We will not create a validator for the public capability; instead we will - // set the capability directly. It will be registered as a public capability. - capabilities()->SetCapability(key_public, init_value.Clone()); - - FakeCapabilityManagerSimple private_manager(capabilities(), key_private, - init_value.Clone(), true, true); - - EXPECT_EQ(capabilities()->GetAllData()->dictionary(), full_dict); - EXPECT_EQ(capabilities()->GetPublicData()->dictionary(), public_dict); -} - -// Test that SetCapability() notifies Observers when the capability's value -// changes -TEST_F(DeviceCapabilitiesImplTest, SetCapabilityNotifiesObservers) { - std::string key; - base::Value init_value; - GetSampleDefaultCapability(&key, &init_value); - - EXPECT_CALL(*capabilities_observer(), OnCapabilitiesChanged(key)).Times(3); - - // 1st call (register) - FakeCapabilityManagerSimple manager(capabilities(), key, init_value.Clone(), - true, false); - - // 2nd call - capabilities()->SetCapability(key, GetSampleDefaultCapabilityNewValue()); - - // Observer should not get called when value does not change - capabilities()->SetCapability(key, GetSampleDefaultCapabilityNewValue()); - - // 3rd call - capabilities()->SetCapability(key, std::move(init_value)); - base::RunLoop().RunUntilIdle(); -} - -// Test that SetCapability() notifies Observers when a private capability's -// value changes -TEST_F(DeviceCapabilitiesImplTest, SetPrivateCapabilityNotifiesObservers) { - std::string key; - base::Value init_value; - GetSampleDefaultCapability(&key, &init_value); - - EXPECT_CALL(*capabilities_observer(), OnCapabilitiesChanged(key)).Times(3); - - // 1st call (register), this manager validates and sets the capability - // privately. - FakeCapabilityManagerSimple manager(capabilities(), key, init_value.Clone(), - true, true); - - // 2nd call - capabilities()->SetCapability(key, GetSampleDefaultCapabilityNewValue()); - - // Observer should not get called when value does not change - capabilities()->SetCapability(key, GetSampleDefaultCapabilityNewValue()); - - // 3rd call - capabilities()->SetCapability(key, std::move(init_value)); - base::RunLoop().RunUntilIdle(); -} - -// Test adding dynamic capabilities -TEST_F(DeviceCapabilitiesImplTest, SetCapabilityDynamic) { - std::string key; - base::Value init_value; - GetSampleDynamicCapability(&key, &init_value); - - ASSERT_TRUE(capabilities()->GetCapability(key).is_none()); - capabilities()->SetCapability(key, init_value.Clone()); - base::RunLoop().RunUntilIdle(); - - EXPECT_EQ(capabilities()->GetCapability(key), init_value); - EXPECT_TRUE(JsonStringEquals(capabilities()->GetAllData()->json_string(), key, - init_value)); - - base::Value new_value = GetSampleDynamicCapabilityNewValue(); - capabilities()->SetCapability(key, new_value.Clone()); - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(capabilities()->GetCapability(key), new_value); - EXPECT_TRUE(JsonStringEquals(capabilities()->GetAllData()->json_string(), key, - new_value)); -} - -// Tests that SetCapability() works with expanded paths when there is a -// capability of type DictionaryValue. -TEST_F(DeviceCapabilitiesImplTest, SetCapabilityDictionary) { - std::string key("dummy_dictionary_key"); - auto init_value = base::JSONReader::Read(kSampleDictionaryCapability); - ASSERT_TRUE(init_value); - FakeCapabilityManagerSimple manager(capabilities(), key, - std::move(*init_value), true, false); - - capabilities()->SetCapability("dummy_dictionary_key.dummy_field_bool", - base::Value(false)); - base::RunLoop().RunUntilIdle(); - base::Value value = - capabilities()->GetCapability("dummy_dictionary_key.dummy_field_bool"); - ASSERT_TRUE(value.is_bool()); - EXPECT_FALSE(value.GetBool()); - - capabilities()->SetCapability("dummy_dictionary_key.dummy_field_int", - base::Value(100)); - base::RunLoop().RunUntilIdle(); - value = capabilities()->GetCapability("dummy_dictionary_key.dummy_field_int"); - ASSERT_TRUE(value.is_int()); - EXPECT_EQ(value.GetInt(), 100); -} - -// Tests that SetCapability() works with expanded paths when there is a -// capability of type DictionaryValue and invalid changes are proposed. -TEST_F(DeviceCapabilitiesImplTest, SetCapabilityDictionaryInvalid) { - std::string key("dummy_dictionary_key"); - auto init_value = base::JSONReader::Read(kSampleDictionaryCapability); - ASSERT_TRUE(init_value); - FakeCapabilityManagerSimple manager(capabilities(), key, - std::move(*init_value), false, false); - - capabilities()->SetCapability("dummy_dictionary_key.dummy_field_bool", - base::Value(false)); - base::RunLoop().RunUntilIdle(); - base::Value value = - capabilities()->GetCapability("dummy_dictionary_key.dummy_field_bool"); - ASSERT_TRUE(value.is_bool()); - EXPECT_TRUE(value.GetBool()); - - capabilities()->SetCapability("dummy_dictionary_key.dummy_field_int", - base::Value(100)); - base::RunLoop().RunUntilIdle(); - value = capabilities()->GetCapability("dummy_dictionary_key.dummy_field_int"); - ASSERT_TRUE(value.is_int()); - EXPECT_EQ(value.GetInt(), 99); -} - -// Test MergeDictionary. -TEST_F(DeviceCapabilitiesImplTest, MergeDictionary) { - std::optional deserialized_value = - base::JSONReader::ReadDict(kSampleDictionaryCapability); - ASSERT_TRUE(deserialized_value); - - capabilities()->MergeDictionary(*deserialized_value); - base::RunLoop().RunUntilIdle(); - - // First make sure that capabilities get created if they do not exist - base::Value value = capabilities()->GetCapability("dummy_field_bool"); - ASSERT_TRUE(value.is_bool()); - EXPECT_TRUE(value.GetBool()); - - value = capabilities()->GetCapability("dummy_field_int"); - ASSERT_TRUE(value.is_int()); - EXPECT_EQ(value.GetInt(), 99); - - // Now just update one of the fields. Make sure the updated value is changed - // in DeviceCapabilities and the other field remains untouched. - deserialized_value->Set("dummy_field_int", 100); - ASSERT_TRUE(deserialized_value->Remove("dummy_field_bool")); - - capabilities()->MergeDictionary(*deserialized_value); - base::RunLoop().RunUntilIdle(); - - value = capabilities()->GetCapability("dummy_field_bool"); - ASSERT_TRUE(value.is_bool()); - EXPECT_TRUE(value.GetBool()); - - value = capabilities()->GetCapability("dummy_field_int"); - ASSERT_TRUE(value.is_int()); - EXPECT_EQ(value.GetInt(), 100); -} - -// Tests that it is safe to call DeviceCapabilities methods in -// an Observer's OnCapabilitiesChanged() implementation safely with correct -// behavior and without deadlocking. -TEST_F(DeviceCapabilitiesImplTest, OnCapabilitiesChangedSafe) { - FakeCapabilitiesObserver observer(capabilities()); - - // Trigger FakeCapabilitiesObserver::OnCapabilitiesChanged() - capabilities()->SetCapability("dummy_trigger_key", base::Value(true)); - base::RunLoop().RunUntilIdle(); - - // Check that FakeCapabilitiesObserver::OnCapabilitiesChanged() ran and that - // behavior was successful - AssertBasicOperationsSuccessful(capabilities()); -} - -// Tests that it is safe to call DeviceCapabilities methods in a Validator's -// Validate() implementation safely with correct behavior and without -// deadlocking. -TEST_F(DeviceCapabilitiesImplTest, ValidateSafe) { - FakeCapabilityManagerComplex manager(capabilities(), "dummy_validate_key"); - - // Trigger FakeCapabilityManagerComplex::Validate() - capabilities()->SetCapability("dummy_validate_key", base::Value(true)); - base::RunLoop().RunUntilIdle(); - - // Check that FakeCapabilityManagerComplex::Validate() ran and that behavior - // was successful - AssertBasicOperationsSuccessful(capabilities()); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/error_codes.cc chromium-132.0.6834.159/chromecast/base/error_codes.cc --- chromium-132.0.6834.110/chromecast/base/error_codes.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/error_codes.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,84 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/error_codes.h" - -#include -#include - -#include - -#include "base/files/file_util.h" -#include "base/logging.h" -#include "base/strings/string_number_conversions.h" -#include "chromecast/base/path_utils.h" - -namespace chromecast { - -namespace { - -const char kInitialErrorFile[] = "initial_error"; - -base::FilePath GetInitialErrorFilePath() { - return GetHomePathASCII(kInitialErrorFile); -} - -} // namespace - -ErrorCode GetInitialErrorCode() { - std::string initial_error_code_str; - if (!base::ReadFileToString(GetInitialErrorFilePath(), - &initial_error_code_str)) { - return NO_ERROR; - } - - int initial_error_code = 0; - if (base::StringToInt(initial_error_code_str, &initial_error_code) && - initial_error_code >= NO_ERROR && initial_error_code <= ERROR_UNKNOWN) { - DVLOG(1) << "Initial error from " << GetInitialErrorFilePath().value() - << ": " << initial_error_code; - return static_cast(initial_error_code); - } - - LOG(ERROR) << "Unknown initial error code: " << initial_error_code_str; - return NO_ERROR; -} - -bool SetInitialErrorCode(ErrorCode initial_error_code) { - // Note: Do not use Chromium IO methods in this function. When cast_shell - // crashes, this function can be called by any thread. - const std::string error_file_path = GetInitialErrorFilePath().value(); - - if (initial_error_code > NO_ERROR && initial_error_code <= ERROR_UNKNOWN) { - const std::string initial_error_code_str( - base::NumberToString(initial_error_code)); - int fd = creat(error_file_path.c_str(), 0640); - if (fd < 0) { - PLOG(ERROR) << "Could not open error code file"; - return false; - } - - int written = - write(fd, initial_error_code_str.data(), initial_error_code_str.size()); - - if (written != static_cast(initial_error_code_str.size())) { - PLOG(ERROR) << "Could not write error code to file: written=" << written - << ", expected=" << initial_error_code_str.size(); - close(fd); - return false; - } - - close(fd); - return true; - } - - // Remove initial error file if no error. - if (unlink(error_file_path.c_str()) == 0 || errno == ENOENT) - return true; - - PLOG(ERROR) << "Failed to remove error file"; - return false; -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/error_codes.h chromium-132.0.6834.159/chromecast/base/error_codes.h --- chromium-132.0.6834.110/chromecast/base/error_codes.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/error_codes.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_ERROR_CODES_H_ -#define CHROMECAST_BASE_ERROR_CODES_H_ - -namespace chromecast { - -enum ErrorCode { - NO_ERROR = 0, - - // web_content [1, 9999] - ERROR_WEB_CONTENT_RENDER_VIEW_GONE = 1, - ERROR_WEB_CONTENT_NAME_NOT_RESOLVED, - ERROR_WEB_CONTENT_INTERNET_DISCONNECTED, - - // reboot [10000, 19999] - // The following error codes do not reset the volume when the page is - // launched. Add codes that do not reset the volume before ERROR_REBOOT_NOW. - ERROR_REBOOT_NOW = 10000, - ERROR_REBOOT_FDR, - ERROR_REBOOT_OTA, - ERROR_REBOOT_IDLE, - // Chromecast WebUI uses 19999 for END_OF_REBOOT_SECTION, so reserve it here. - END_OF_REBOOT_SECTION = 19999, - - // misc [20000, 29999] - ERROR_ABORTED = 20000, - ERROR_LOST_PEER_CONNECTION = 20001, - - ERROR_UNKNOWN = 30000, -}; - -// Gets the error code for the first idle screen. -ErrorCode GetInitialErrorCode(); - -// Sets the error code for the first idle screen. Returns true if set -// successfully. -bool SetInitialErrorCode(ErrorCode initial_error_code); - -} // namespace chromecast - -#endif // CHROMECAST_BASE_ERROR_CODES_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/error_codes_unittest.cc chromium-132.0.6834.159/chromecast/base/error_codes_unittest.cc --- chromium-132.0.6834.110/chromecast/base/error_codes_unittest.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/error_codes_unittest.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,71 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/error_codes.h" - -#include - -#include "base/base_paths.h" -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/files/scoped_temp_dir.h" -#include "base/test/scoped_path_override.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace chromecast { - -class ErrorCodesTest : public testing::Test { - protected: - ErrorCodesTest() {} - ~ErrorCodesTest() override {} - - void SetUp() override { - // Set up a temporary directory which will be used as our fake home dir. - ASSERT_TRUE(fake_home_dir_.CreateUniqueTempDir()); - path_override_.reset( - new base::ScopedPathOverride(base::DIR_HOME, fake_home_dir_.GetPath())); - } - - base::FilePath home_path() const { return fake_home_dir_.GetPath(); } - - private: - base::ScopedTempDir fake_home_dir_; - std::unique_ptr path_override_; -}; - -TEST_F(ErrorCodesTest, GetInitialErrorCodeReturnsNoErrorIfMissingFile) { - EXPECT_EQ(NO_ERROR, GetInitialErrorCode()); -} - -TEST_F(ErrorCodesTest, SetInitialErrorCodeSucceedsWithNoError) { - ASSERT_TRUE(SetInitialErrorCode(NO_ERROR)); - - // File should not be written. - ASSERT_FALSE(base::PathExists(home_path().Append("initial_error"))); - EXPECT_EQ(NO_ERROR, GetInitialErrorCode()); -} - -TEST_F(ErrorCodesTest, SetInitialErrorCodeSucceedsWithValidErrors) { - // Write initial error and read it from the file. - EXPECT_TRUE(SetInitialErrorCode(ERROR_WEB_CONTENT_RENDER_VIEW_GONE)); - EXPECT_TRUE(base::PathExists(home_path().Append("initial_error"))); - EXPECT_EQ(ERROR_WEB_CONTENT_RENDER_VIEW_GONE, GetInitialErrorCode()); - - // File should be updated with most recent error. - EXPECT_TRUE(SetInitialErrorCode(ERROR_UNKNOWN)); - EXPECT_TRUE(base::PathExists(home_path().Append("initial_error"))); - EXPECT_EQ(ERROR_UNKNOWN, GetInitialErrorCode()); - - // File should be updated with most recent error. - EXPECT_TRUE(SetInitialErrorCode(ERROR_WEB_CONTENT_NAME_NOT_RESOLVED)); - EXPECT_TRUE(base::PathExists(home_path().Append("initial_error"))); - EXPECT_EQ(ERROR_WEB_CONTENT_NAME_NOT_RESOLVED, GetInitialErrorCode()); - - // File should be removed after writing NO_ERROR. - EXPECT_TRUE(SetInitialErrorCode(NO_ERROR)); - EXPECT_FALSE(base::PathExists(home_path().Append("initial_error"))); - EXPECT_EQ(NO_ERROR, GetInitialErrorCode()); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/hash_util.cc chromium-132.0.6834.159/chromecast/base/hash_util.cc --- chromium-132.0.6834.110/chromecast/base/hash_util.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/hash_util.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,149 +0,0 @@ -// Copyright 2021 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/hash_util.h" - -#include -#include - -#include "base/check_op.h" -#include "base/hash/sha1.h" -#include "base/logging.h" -#include "base/notreached.h" -#include "base/stl_util.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/string_split.h" -#include "base/strings/string_util.h" -#include "chromecast/base/legacy_app_id_mapper.h" -#include "chromecast/base/version.h" - -namespace chromecast { - -namespace { - -const size_t kAppIdV2StrLen = 8; - -} // namespace - -uint64_t HashToUInt64(const std::string& value) { - uint64_t output; - const std::string sha1hash = base::SHA1HashString(value); - DCHECK_GE(sha1hash.size(), sizeof(output)); - memcpy(&output, sha1hash.data(), sizeof(output)); - return output; -} - -uint32_t HashToUInt32(const std::string& value) { - uint32_t output; - const std::string sha1hash = base::SHA1HashString(value); - DCHECK_GE(sha1hash.size(), sizeof(output)); - memcpy(&output, sha1hash.data(), sizeof(output)); - return output; -} - -uint64_t HashGUID64(const std::string& guid) { - std::string hex; - base::RemoveChars(guid, "-", &hex); - uint64_t output; - DCHECK_EQ(hex.size(), 32u); - if (base::HexStringToUInt64(hex.substr(0, 16), &output)) - return output; - NOTREACHED(); -} - -uint32_t HashAppId32(const std::string& app_id) { - uint32_t output; - if (app_id.size() == kAppIdV2StrLen && - base::HexStringToUInt(app_id, &output)) { - return output; - } - - return MapLegacyAppId(app_id); -} - -uint64_t HashCastBuildNumber64(const std::string& build_number) { - uint64_t return_value = 0; - std::vector tokens(base::SplitString( - build_number, ".", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)); - const size_t tsize = tokens.size(); - if (tsize < 1 || tsize > 4) - return static_cast(-1); - - int bits = 64 / tsize; - // special case for 3-tuple to make hex look nicer. - if (tsize == 3) - bits = 16; - - for (size_t i = 0; i < tsize; ++i) { - // special case for the last token of 3-tuple. - if (tsize == 3 && i == 2) - bits = 32; - return_value <<= bits; - unsigned value = 0; - if (!base::StringToUint(tokens[i], &value)) - return static_cast(-1); - if (bits != 64) // avoid overflow - value &= (static_cast(1) << bits) - 1; - return_value |= value; - } - return return_value; -} - -uint64_t HashSessionId64(const std::string& session_id) { - return HashGUID64(session_id); -} - -uint64_t HashSdkVersion64(const std::string& sdk_version) { - if (sdk_version.empty()) - return 0; - - // Sdk version is usually in "X.Y.Z(.minor)" format. - // Following code is a little bit relaxed to accept all sub-fields optional. - uint64_t return_value = 0; - std::vector tokens(base::SplitString( - sdk_version, ".", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)); - for (size_t i = 0; i < 4; ++i) { - return_value <<= 16; - if (tokens.size() > i) { - unsigned value = 0; - if (base::StringToUint(tokens[i], &value)) { - return_value |= value & 0xFFFF; - } else { - LOG_IF(ERROR, !CAST_IS_DEBUG_BUILD()) - << "Sdk version " << sdk_version << " is not in correct format."; - return static_cast(-1); - } - } - } - return return_value; -} - -uint32_t HashSocketId32(const std::string& socket_id) { - uint32_t output; - // socket id is usually just numerical. - if (base::StringToUint(socket_id, &output)) { - return output; - } else { // CastControlSocket and unittests. - return HashToUInt32(socket_id); - } -} - -uint32_t HashConnectionId32(const std::string& connection_id) { - return HashToUInt32(connection_id); -} - -uint64_t HashAndroidBuildNumber64(const std::string& build_id) { - if (build_id.length() == 0) { - return static_cast(-1); - } - - uint64_t value = 0; - for (const char& c : build_id.substr(0, sizeof(value) / sizeof(char))) { - value <<= CHAR_BIT; - value += c; - } - return value; -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/hash_util.h chromium-132.0.6834.159/chromecast/base/hash_util.h --- chromium-132.0.6834.110/chromecast/base/hash_util.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/hash_util.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -// Copyright 2021 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_HASH_UTIL_H_ -#define CHROMECAST_BASE_HASH_UTIL_H_ - -#include - -#include - -namespace chromecast { - -// These are utils to hash strings to uma proto integers. - -// Common utils to hash strings. -uint64_t HashToUInt64(const std::string& value); -uint32_t HashToUInt32(const std::string& value); -uint64_t HashGUID64(const std::string& guid); - -// Common utils to hash cast-related ids. -uint32_t HashAppId32(const std::string& app_id); -uint64_t HashCastBuildNumber64(const std::string& build_number); -uint64_t HashSessionId64(const std::string& session_id); -uint64_t HashSdkVersion64(const std::string& sdk_version); -uint32_t HashSocketId32(const std::string& socket_id); -uint32_t HashConnectionId32(const std::string& connection_id); - -// Encodes the first 8 characters build_id into a uint64 -uint64_t HashAndroidBuildNumber64(const std::string& build_id); - -} // namespace chromecast - -#endif // CHROMECAST_BASE_HASH_UTIL_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/hash_util_test.cc chromium-132.0.6834.159/chromecast/base/hash_util_test.cc --- chromium-132.0.6834.110/chromecast/base/hash_util_test.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/hash_util_test.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,59 +0,0 @@ -// Copyright 2021 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/hash_util.h" - -#include "testing/gtest/include/gtest/gtest.h" - -namespace chromecast { -namespace receiver { - -TEST(UmaHashUtilTest, HashCastBuildNumber64) { - EXPECT_EQ(0xffffffffffffffffU, HashCastBuildNumber64("")); - - EXPECT_EQ(1234567890U, HashCastBuildNumber64("1234567890")); - - EXPECT_EQ(0x0000000200000001U, HashCastBuildNumber64("2.1")); - - EXPECT_EQ(0x0002000000010000U, HashCastBuildNumber64("2.0.65536")); - - EXPECT_EQ(0x00020000007b03e7U, HashCastBuildNumber64("2.0.123.999")); - - EXPECT_EQ(0xffffffffffffffffU, HashCastBuildNumber64("2.na.123.invalid")); - - EXPECT_EQ(0xffffffffffffffffU, HashCastBuildNumber64("invalid")); -} - -TEST(UmaHashUtilTest, HashSdkVersion64) { - EXPECT_EQ(0UL, HashSdkVersion64("")); - - EXPECT_EQ(0x00020000007b0000U, HashSdkVersion64("2.0.123")); - - EXPECT_EQ(0x00020000007b03e7U, HashSdkVersion64("2.0.123.999")); - - EXPECT_EQ(0xffffffffffffffffU, HashSdkVersion64("2.na.123.invalid")); - - EXPECT_EQ(0xffffffffffffffffU, HashSdkVersion64("invalid")); -} - -TEST(UmaHashUtilTest, HashAndroidBuildNumber64) { - EXPECT_EQ(0x00000000004E5943U, HashAndroidBuildNumber64("NYC")); - - EXPECT_EQ(0x00004E554632364EU, HashAndroidBuildNumber64("NUF26N")); - - EXPECT_EQ(0x00004e524439304dU, HashAndroidBuildNumber64("NRD90M")); - - EXPECT_EQ(0x4d4d423239562e53U, HashAndroidBuildNumber64("MMB29V.S39")); - - EXPECT_EQ(0x4f5052312e313730U, HashAndroidBuildNumber64("OPR1.170508.001")); - - EXPECT_EQ(0x00004d4153544552U, HashAndroidBuildNumber64("MASTER")); - - EXPECT_EQ(0x00696e76616c6964U, HashAndroidBuildNumber64("invalid")); - - EXPECT_EQ(0xffffffffffffffffU, HashAndroidBuildNumber64("")); -} - -} // namespace receiver -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/init_command_line_shlib.cc chromium-132.0.6834.159/chromecast/base/init_command_line_shlib.cc --- chromium-132.0.6834.110/chromecast/base/init_command_line_shlib.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/init_command_line_shlib.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,30 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/init_command_line_shlib.h" - -#include "base/command_line.h" -#include "base/logging.h" -#include "chromecast/chromecast_buildflags.h" - -namespace chromecast { - - -void InitCommandLineShlib(const std::vector& argv) { - if (base::CommandLine::InitializedForCurrentProcess()) - return; - - base::CommandLine::Init(0, nullptr); - base::CommandLine::ForCurrentProcess()->InitFromArgv(argv); - - logging::InitLogging(logging::LoggingSettings()); -#if BUILDFLAG(IS_CAST_DESKTOP_BUILD) - logging::SetLogItems(true, true, true, false); -#else - // Timestamp available through logcat -v time. - logging::SetLogItems(true, true, false, false); -#endif // BUILDFLAG(IS_CAST_DESKTOP_BUILD) -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/init_command_line_shlib.h chromium-132.0.6834.159/chromecast/base/init_command_line_shlib.h --- chromium-132.0.6834.110/chromecast/base/init_command_line_shlib.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/init_command_line_shlib.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,32 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_INIT_COMMAND_LINE_SHLIB_H_ -#define CHROMECAST_BASE_INIT_COMMAND_LINE_SHLIB_H_ - -#include -#include - -namespace chromecast { - -// A utility function which initializes command line flags and logging. It is -// intended to be called at the entry point of a shared library. -// -// When doing a component build, calls to this function will be a no-op. -// cast_shell will initialize the single global instance of base::CommandLine, -// which lives in libbase.so. For a non-component build, each shared lib will -// statically link its own instance of base::CommandLine, and will initialize -// it here on the initial call. Every subsequent call from within the same -// library will be a no-op. -// -// THREAD SAFTEY: Accessing the CommandLine instance for this process is -// technically not threadsafe when using the component build. However, the -// instance is initialized on the main thread before any other threads are -// started (see content/app/content_main_runner_impl.cc), so accessing this -// instance on those threads for read-operations is safe in practice. -void InitCommandLineShlib(const std::vector& argv); - -} // namespace chromecast - -#endif // CHROMECAST_BASE_INIT_COMMAND_LINE_SHLIB_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/java/OWNERS chromium-132.0.6834.159/chromecast/base/java/OWNERS --- chromium-132.0.6834.110/chromecast/base/java/OWNERS 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/java/OWNERS 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -sanfin@chromium.org diff -Nru chromium-132.0.6834.110/chromecast/base/legacy_app_id_mapper.h chromium-132.0.6834.159/chromecast/base/legacy_app_id_mapper.h --- chromium-132.0.6834.110/chromecast/base/legacy_app_id_mapper.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/legacy_app_id_mapper.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,20 +0,0 @@ -// Copyright 2021 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_LEGACY_APP_ID_MAPPER_H_ -#define CHROMECAST_BASE_LEGACY_APP_ID_MAPPER_H_ - -#include - -#include - -namespace chromecast { - -// Calculates the AppID associated with |id| and returns it, or -// |kAppUnknownFallback| if no such AppID exists. -uint32_t MapLegacyAppId(const std::string& id); - -} // namespace chromecast - -#endif // CHROMECAST_BASE_LEGACY_APP_ID_MAPPER_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/legacy_app_id_mapper_dummy.cc chromium-132.0.6834.159/chromecast/base/legacy_app_id_mapper_dummy.cc --- chromium-132.0.6834.110/chromecast/base/legacy_app_id_mapper_dummy.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/legacy_app_id_mapper_dummy.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,19 +0,0 @@ -// Copyright 2021 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/legacy_app_id_mapper.h" - -namespace chromecast { -namespace { - -// The AppID that should be returned for an unknown |id| by the below function. -constexpr uint32_t kAppUnknownFallback = 0x0; - -} // namespace - -uint32_t MapLegacyAppId(const std::string& id) { - return kAppUnknownFallback; -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/metrics/cast_histograms.h chromium-132.0.6834.159/chromecast/base/metrics/cast_histograms.h --- chromium-132.0.6834.110/chromecast/base/metrics/cast_histograms.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/metrics/cast_histograms.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_METRICS_CAST_HISTOGRAMS_H_ -#define CHROMECAST_BASE_METRICS_CAST_HISTOGRAMS_H_ - -#include "base/metrics/histogram.h" - -// STATIC_HISTOGRAM_POINTER_BLOCK only calls histogram_factory_get_invocation -// at the first time and uses the cached histogram_pointer for subsequent calls -// through base::subtle::Release_Store() and base::subtle::Acquire_Load(). -// If the histogram name changes between subsequent calls, use this non-cached -// version that always calls histogram_factory_get_invocation. -#define STATIC_HISTOGRAM_POINTER_BLOCK_NO_CACHE( \ - constant_histogram_name, histogram_add_method_invocation, \ - histogram_factory_get_invocation) \ - do { \ - base::HistogramBase* histogram_pointer = histogram_factory_get_invocation; \ - if (DCHECK_IS_ON()) \ - histogram_pointer->CheckName(constant_histogram_name); \ - histogram_pointer->histogram_add_method_invocation; \ - } while (0) - -#define UMA_HISTOGRAM_CUSTOM_TIMES_NO_CACHE(name, sample, min, max, \ - bucket_count) \ - STATIC_HISTOGRAM_POINTER_BLOCK_NO_CACHE( \ - name, AddTimeMillisecondsGranularity(sample), \ - base::Histogram::FactoryTimeGet( \ - name, min, max, bucket_count, \ - base::Histogram::kUmaTargetedHistogramFlag)) - -#define UMA_HISTOGRAM_CUSTOM_COUNTS_NO_CACHE(name, sample, min, max, \ - bucket_count, count) \ - STATIC_HISTOGRAM_POINTER_BLOCK_NO_CACHE(name, AddCount(sample, count), \ - base::Histogram::FactoryGet(name, min, max, bucket_count, \ - base::HistogramBase::kUmaTargetedHistogramFlag)) - -#define UMA_HISTOGRAM_ENUMERATION_NO_CACHE(name, sample, boundary_value) \ - STATIC_HISTOGRAM_POINTER_BLOCK_NO_CACHE(name, Add(sample), \ - base::LinearHistogram::FactoryGet(name, 1, boundary_value, \ - boundary_value + 1, base::Histogram::kUmaTargetedHistogramFlag)) - -#endif // CHROMECAST_BASE_METRICS_CAST_HISTOGRAMS_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/metrics/cast_metrics_helper.cc chromium-132.0.6834.159/chromecast/base/metrics/cast_metrics_helper.cc --- chromium-132.0.6834.110/chromecast/base/metrics/cast_metrics_helper.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/metrics/cast_metrics_helper.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,360 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/metrics/cast_metrics_helper.h" - -#include -#include - -#include "base/containers/contains.h" -#include "base/functional/bind.h" -#include "base/functional/callback_helpers.h" -#include "base/json/json_writer.h" -#include "base/location.h" -#include "base/logging.h" -#include "base/metrics/histogram.h" -#include "base/metrics/user_metrics.h" -#include "base/no_destructor.h" -#include "base/strings/string_split.h" -#include "base/task/sequenced_task_runner.h" -#include "base/time/tick_clock.h" -#include "chromecast/base/metrics/cast_histograms.h" -#include "chromecast/base/metrics/grouped_histogram.h" - -namespace chromecast { -namespace metrics { - -// A useful macro to make sure current member function runs on the valid thread. -#define MAKE_SURE_SEQUENCE(callback, ...) \ - if (!task_runner_->RunsTasksInCurrentSequence()) { \ - task_runner_->PostTask( \ - FROM_HERE, base::BindOnce(&CastMetricsHelper::callback, \ - base::Unretained(this), ##__VA_ARGS__)); \ - return; \ - } - -namespace { - -const char kMetricsNameAppInfoDelimiter = '#'; - -constexpr base::TimeDelta kAppLoadTimeout = base::Minutes(5); - -} // namespace - -// NOTE(gfhuang): This is a hacky way to encode/decode app infos into a -// string. Mainly because it's hard to add another metrics serialization type -// into components/metrics/serialization/. -// static -bool CastMetricsHelper::DecodeAppInfoFromMetricsName( - const std::string& metrics_name, - std::string* action_name, - std::string* app_id, - std::string* session_id, - std::string* sdk_version) { - DCHECK(action_name); - DCHECK(app_id); - DCHECK(session_id); - DCHECK(sdk_version); - - if (!base::Contains(metrics_name, kMetricsNameAppInfoDelimiter)) { - return false; - } - - std::vector tokens = base::SplitString( - metrics_name, std::string(1, kMetricsNameAppInfoDelimiter), - base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); - DCHECK_EQ(tokens.size(), 4u); - // The order of tokens should match EncodeAppInfoIntoMetricsName(). - *action_name = tokens[0]; - *app_id = tokens[1]; - *session_id = tokens[2]; - *sdk_version = tokens[3]; - return true; -} - -// static -std::string CastMetricsHelper::EncodeAppInfoIntoMetricsName( - const std::string& action_name, - const std::string& app_id, - const std::string& session_id, - const std::string& sdk_version) { - std::string result(action_name); - result.push_back(kMetricsNameAppInfoDelimiter); - result.append(app_id); - result.push_back(kMetricsNameAppInfoDelimiter); - result.append(session_id); - result.push_back(kMetricsNameAppInfoDelimiter); - result.append(sdk_version); - return result; -} - -// static -CastMetricsHelper* CastMetricsHelper::GetInstance() { - static base::NoDestructor instance; - return instance.get(); -} - -CastMetricsHelper::CastMetricsHelper( - scoped_refptr task_runner, - const base::TickClock* tick_clock) - : task_runner_(std::move(task_runner)), - tick_clock_(tick_clock), - metrics_sink_(nullptr), - logged_first_audio_(false), - record_action_callback_( - base::BindRepeating(&base::RecordComputedAction)) { - DCHECK(task_runner_); -} - -CastMetricsHelper::~CastMetricsHelper() {} - -void CastMetricsHelper::DidStartLoad(const std::string& app_id) { - MAKE_SURE_SEQUENCE(DidStartLoad, app_id); - const base::TimeTicks now = Now(); - - // Remove start times for apps that never became the current app. - for (auto it = app_load_start_times_.cbegin(); - it != app_load_start_times_.cend();) { - if (now - it->second >= kAppLoadTimeout) { - it = app_load_start_times_.erase(it); - } else { - ++it; - } - } - - app_load_start_times_[app_id] = now; -} - -void CastMetricsHelper::DidCompleteLoad(const std::string& app_id, - const std::string& session_id) { - MAKE_SURE_SEQUENCE(DidCompleteLoad, app_id, session_id); - auto it = app_load_start_times_.find(app_id); - if (it == app_load_start_times_.end()) { - LOG(ERROR) << "No start time for app: app_id=" << app_id; - return; - } - app_id_ = app_id; - session_id_ = session_id; - app_start_time_ = it->second; - app_load_start_times_.erase(it); - logged_first_audio_ = false; - TagAppStartForGroupedHistograms(app_id_); - sdk_version_.clear(); -} - -void CastMetricsHelper::UpdateSDKInfo(const std::string& sdk_version) { - MAKE_SURE_SEQUENCE(UpdateSDKInfo, sdk_version); - sdk_version_ = sdk_version; -} - -void CastMetricsHelper::LogMediaPlay() { - MAKE_SURE_SEQUENCE(LogMediaPlay); - RecordSimpleAction(EncodeAppInfoIntoMetricsName( - "MediaPlay", - app_id_, - session_id_, - sdk_version_)); -} - -void CastMetricsHelper::LogMediaPause() { - MAKE_SURE_SEQUENCE(LogMediaPause); - RecordSimpleAction(EncodeAppInfoIntoMetricsName( - "MediaPause", - app_id_, - session_id_, - sdk_version_)); -} - -void CastMetricsHelper::LogTimeToFirstPaint() { - MAKE_SURE_SEQUENCE(LogTimeToFirstPaint); - if (app_id_.empty()) - return; - base::TimeDelta launch_time = Now() - app_start_time_; - const std::string uma_name(GetMetricsNameWithAppName("Startup", - "TimeToFirstPaint")); - LogMediumTimeHistogramEvent(uma_name, launch_time); - LOG(INFO) << uma_name << " is " << launch_time.InSecondsF() << " seconds."; -} - -void CastMetricsHelper::LogTimeToFirstAudio() { - MAKE_SURE_SEQUENCE(LogTimeToFirstAudio); - if (logged_first_audio_) - return; - if (app_id_.empty()) - return; - base::TimeDelta time_to_first_audio = Now() - app_start_time_; - const std::string uma_name( - GetMetricsNameWithAppName("Startup", "TimeToFirstAudio")); - LogMediumTimeHistogramEvent(uma_name, time_to_first_audio); - LOG(INFO) << uma_name << " is " << time_to_first_audio.InSecondsF() - << " seconds."; - logged_first_audio_ = true; -} - -void CastMetricsHelper::LogTimeToBufferAv(BufferingType buffering_type, - base::TimeDelta time) { - MAKE_SURE_SEQUENCE(LogTimeToBufferAv, buffering_type, time); - if (time.is_negative()) { - LOG(WARNING) << "Negative time"; - return; - } - - const std::string uma_name(GetMetricsNameWithAppName( - "Media", - (buffering_type == kInitialBuffering ? "TimeToBufferAv" : - buffering_type == kBufferingAfterUnderrun ? - "TimeToBufferAvAfterUnderrun" : - buffering_type == kAbortedBuffering ? "TimeToBufferAvAfterAbort" : ""))); - - // Histogram from 250ms to 30s with 50 buckets. - // The ratio between 2 consecutive buckets is: - // exp( (ln(30000) - ln(250)) / 50 ) = 1.1 - LogTimeHistogramEvent(uma_name, time, base::Milliseconds(250), - base::Milliseconds(30000), 50); -} - -std::string CastMetricsHelper::GetMetricsNameWithAppName( - const std::string& prefix, - const std::string& suffix) const { - DCHECK(task_runner_->RunsTasksInCurrentSequence()); - std::string metrics_name(prefix); - if (!app_id_.empty()) { - if (!metrics_name.empty()) - metrics_name.push_back('.'); - metrics_name.append(app_id_); - } - if (!suffix.empty()) { - if (!metrics_name.empty()) - metrics_name.push_back('.'); - metrics_name.append(suffix); - } - return metrics_name; -} - -void CastMetricsHelper::SetMetricsSink(MetricsSink* delegate) { - MAKE_SURE_SEQUENCE(SetMetricsSink, delegate); - metrics_sink_ = delegate; -} - -void CastMetricsHelper::SetRecordActionCallback(RecordActionCallback callback) { - DCHECK(task_runner_->RunsTasksInCurrentSequence()); - record_action_callback_ = std::move(callback); -} - -void CastMetricsHelper::SetDummySessionIdForTesting() { - DCHECK(task_runner_->RunsTasksInCurrentSequence()); - session_id_ = "00000000-0000-0000-0000-000000000000"; -} - -void CastMetricsHelper::RecordSimpleAction(const std::string& action) { - MAKE_SURE_SEQUENCE(RecordSimpleAction, action); - - if (metrics_sink_) { - metrics_sink_->OnAction(action); - } else { - record_action_callback_.Run(action); - } -} - -void CastMetricsHelper::LogEnumerationHistogramEvent( - const std::string& name, int value, int num_buckets) { - MAKE_SURE_SEQUENCE(LogEnumerationHistogramEvent, name, value, num_buckets); - - if (metrics_sink_) { - metrics_sink_->OnEnumerationEvent(name, value, num_buckets); - } else { - UMA_HISTOGRAM_ENUMERATION_NO_CACHE(name, value, num_buckets); - } -} - -void CastMetricsHelper::LogTimeHistogramEvent(const std::string& name, - base::TimeDelta value, - base::TimeDelta min, - base::TimeDelta max, - int num_buckets) { - MAKE_SURE_SEQUENCE(LogTimeHistogramEvent, name, value, min, max, num_buckets); - - if (metrics_sink_) { - metrics_sink_->OnTimeEvent(name, value, min, max, num_buckets); - } else { - UMA_HISTOGRAM_CUSTOM_TIMES_NO_CACHE(name, value, min, max, num_buckets); - } -} - -void CastMetricsHelper::LogMediumTimeHistogramEvent(const std::string& name, - base::TimeDelta value) { - // Follow UMA_HISTOGRAM_MEDIUM_TIMES definition. - LogTimeHistogramEvent(name, value, base::Milliseconds(10), base::Minutes(3), - 50); -} - -base::Value::Dict CastMetricsHelper::CreateEventBase(const std::string& name) { - base::Value::Dict cast_event; - cast_event.Set("name", name); - const double time = (Now() - base::TimeTicks()).InMicrosecondsF(); - cast_event.Set("time", time); - return cast_event; -} - -void CastMetricsHelper::RecordEventWithValue(const std::string& event, - int value) { - base::Value::Dict cast_event = CreateEventBase(event); - cast_event.Set("value", value); - std::string message; - base::JSONWriter::Write(cast_event, &message); - RecordSimpleAction(message); -} - -void CastMetricsHelper::RecordApplicationEvent(const std::string& event) { - RecordApplicationEvent(app_id_, session_id_, sdk_version_, event); -} - -void CastMetricsHelper::RecordApplicationEvent(const std::string& app_id, - const std::string& session_id, - const std::string& sdk_version, - const std::string& event) { - base::Value::Dict cast_event = CreateEventBase(event); - cast_event.Set("app_id", app_id); - cast_event.Set("session_id", session_id); - cast_event.Set("sdk_version", sdk_version); - std::string message; - base::JSONWriter::Write(cast_event, &message); - RecordSimpleAction(message); -} - -void CastMetricsHelper::RecordApplicationEventWithValue( - const std::string& event, - int value) { - base::Value::Dict cast_event = CreateEventBase(event); - cast_event.Set("app_id", app_id_); - cast_event.Set("session_id", session_id_); - cast_event.Set("sdk_version", sdk_version_); - cast_event.Set("value", value); - std::string message; - base::JSONWriter::Write(cast_event, &message); - RecordSimpleAction(message); -} - -void CastMetricsHelper::RecordApplicationEventWithValue( - const std::string& app_id, - const std::string& session_id, - const std::string& sdk_version, - const std::string& event, - int value) { - base::Value::Dict cast_event = CreateEventBase(event); - cast_event.Set("app_id", app_id); - cast_event.Set("session_id", session_id); - cast_event.Set("sdk_version", sdk_version); - cast_event.Set("value", value); - std::string message; - base::JSONWriter::Write(cast_event, &message); - RecordSimpleAction(message); -} - -base::TimeTicks CastMetricsHelper::Now() { - return tick_clock_ ? tick_clock_->NowTicks() : base::TimeTicks::Now(); -} - -} // namespace metrics -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/metrics/cast_metrics_helper.h chromium-132.0.6834.159/chromecast/base/metrics/cast_metrics_helper.h --- chromium-132.0.6834.110/chromecast/base/metrics/cast_metrics_helper.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/metrics/cast_metrics_helper.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,197 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_METRICS_CAST_METRICS_HELPER_H_ -#define CHROMECAST_BASE_METRICS_CAST_METRICS_HELPER_H_ - -#include -#include - -#include "base/containers/flat_map.h" -#include "base/functional/callback.h" -#include "base/memory/raw_ptr.h" -#include "base/memory/ref_counted.h" -#include "base/no_destructor.h" -#include "base/task/sequenced_task_runner.h" -#include "base/time/time.h" -#include "base/values.h" - -namespace base { -class SequencedTaskRunner; -class TickClock; -} // namespace base - -namespace chromecast { -namespace metrics { - -// Helper class for tracking complex metrics. This particularly includes -// playback metrics that span events across time, such as "time from app launch -// to video being rendered." -// Currently, browser startup code should instantiate this once; it can be -// accessed thereafter through GetInstance. It's not deleted since it may be -// called during teardown of other global objects. -// TODO(halliwell,guohuideng): convert to mojo service, eliminate singleton -// pattern. -class CastMetricsHelper { - public: - enum BufferingType { - kInitialBuffering, - kBufferingAfterUnderrun, - kAbortedBuffering, - }; - - using RecordActionCallback = - base::RepeatingCallback; - - class MetricsSink { - public: - virtual ~MetricsSink() = default; - - virtual void OnAction(const std::string& action) = 0; - virtual void OnEnumerationEvent(const std::string& name, - int value, int num_buckets) = 0; - virtual void OnTimeEvent(const std::string& name, - base::TimeDelta value, - base::TimeDelta min, - base::TimeDelta max, - int num_buckets) = 0; - }; - - // Decodes action_name/app_id/session_id/sdk_version from metrics name. - // Return false if the metrics name is not generated from - // EncodeAppInfoIntoMetricsName() with correct format. - static bool DecodeAppInfoFromMetricsName( - const std::string& metrics_name, - std::string* action_name, - std::string* app_id, - std::string* session_id, - std::string* sdk_version); - - static CastMetricsHelper* GetInstance(); - - CastMetricsHelper(const CastMetricsHelper&) = delete; - CastMetricsHelper& operator=(const CastMetricsHelper&) = delete; - - // This records the startup time of an app load (note: another app - // may be running and still collecting metrics). - virtual void DidStartLoad(const std::string& app_id); - // This function marks the completion of a successful app load. It switches - // metric collection to this app. - virtual void DidCompleteLoad(const std::string& app_id, - const std::string& session_id); - // This function updates the sdk version of the current active application - virtual void UpdateSDKInfo(const std::string& sdk_version); - - // Logs UMA record for media play/pause user actions. - virtual void LogMediaPlay(); - virtual void LogMediaPause(); - - // Logs a simple UMA user action. - // This is used as an in-place replacement of content::RecordComputedAction(). - virtual void RecordSimpleAction(const std::string& action); - - // Logs a generic event. - virtual void RecordEventWithValue(const std::string& action, int value); - - // Logs application specific events. - virtual void RecordApplicationEvent(const std::string& event); - virtual void RecordApplicationEvent(const std::string& app_id, - const std::string& session_id, - const std::string& sdk_version, - const std::string& event); - virtual void RecordApplicationEventWithValue(const std::string& event, - int value); - virtual void RecordApplicationEventWithValue(const std::string& app_id, - const std::string& session_id, - const std::string& sdk_version, - const std::string& event, - int value); - - // Logs UMA record of the time the app made its first paint. - virtual void LogTimeToFirstPaint(); - - // Logs UMA record of the time the app pushed its first audio frame. - virtual void LogTimeToFirstAudio(); - - // Logs UMA record of the time needed to re-buffer A/V. - virtual void LogTimeToBufferAv(BufferingType buffering_type, - base::TimeDelta time); - - // Returns metrics name with app name between prefix and suffix. - virtual std::string GetMetricsNameWithAppName( - const std::string& prefix, - const std::string& suffix) const; - - // Provides a MetricsSink instance to delegate UMA event logging. - // Once the delegate interface is set, CastMetricsHelper will not log UMA - // events internally unless SetMetricsSink(NULL) is called. - // CastMetricsHelper can only hold one MetricsSink instance. - // Caller retains ownership of MetricsSink. - virtual void SetMetricsSink(MetricsSink* delegate); - - // Sets a default callback to record user action when MetricsSink is not set. - // This function could be called multiple times (in unittests), and - // CastMetricsHelper only honors the last one. - virtual void SetRecordActionCallback(RecordActionCallback callback); - - // Sets an all-0's session ID for running browser tests. - void SetDummySessionIdForTesting(); - - private: - static std::string EncodeAppInfoIntoMetricsName( - const std::string& action_name, - const std::string& app_id, - const std::string& session_id, - const std::string& sdk_version); - - friend class base::NoDestructor; - friend class CastMetricsHelperTest; - friend class MockCastMetricsHelper; - - // |tick_clock| just provided for unit test to construct; normally it should - // be nullptr when accessed through GetInstance. - CastMetricsHelper(scoped_refptr task_runner = - base::SequencedTaskRunner::GetCurrentDefault(), - const base::TickClock* tick_clock = nullptr); - virtual ~CastMetricsHelper(); - - void LogEnumerationHistogramEvent(const std::string& name, - int value, int num_buckets); - void LogTimeHistogramEvent(const std::string& name, - base::TimeDelta value, - base::TimeDelta min, - base::TimeDelta max, - int num_buckets); - void LogMediumTimeHistogramEvent(const std::string& name, - base::TimeDelta value); - base::Value::Dict CreateEventBase(const std::string& name); - base::TimeTicks Now(); - - const scoped_refptr task_runner_; - const raw_ptr tick_clock_; - - // Start times for loading the next apps. - base::flat_map - app_load_start_times_; - - // Start time for the currently running app. - base::TimeTicks app_start_time_; - - // Currently running app id. Used to construct histogram name. - std::string app_id_; - std::string session_id_; - std::string sdk_version_; - - raw_ptr metrics_sink_; - - bool logged_first_audio_; - - // Default RecordAction callback when metrics_sink_ is not set. - RecordActionCallback record_action_callback_; -}; - -} // namespace metrics -} // namespace chromecast - -#endif // CHROMECAST_BASE_METRICS_CAST_METRICS_HELPER_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/metrics/cast_metrics_helper_unittest.cc chromium-132.0.6834.159/chromecast/base/metrics/cast_metrics_helper_unittest.cc --- chromium-132.0.6834.110/chromecast/base/metrics/cast_metrics_helper_unittest.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/metrics/cast_metrics_helper_unittest.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,191 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/metrics/cast_metrics_helper.h" - -#include -#include - -#include "base/json/json_reader.h" -#include "base/test/task_environment.h" -#include "base/time/time.h" -#include "base/values.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -using ::testing::AllOf; -using ::testing::HasSubstr; -using ::testing::SaveArg; -using ::testing::_; - -namespace chromecast { -namespace metrics { - -namespace { - -constexpr char kAppId1[] = "APP_ID_1"; -constexpr char kAppId2[] = "APP_ID_2"; -constexpr char kAppId3[] = "APP_ID_3"; -constexpr char kEvent[] = "EVENT"; -constexpr char kSdkVersion[] = "SDK_VERSION"; -constexpr char kSessionId1[] = "SESSION_ID_1"; -constexpr char kSessionId2[] = "SESSION_ID_2"; -constexpr char kSessionId3[] = "SESSION_ID_3"; -constexpr int kValue = 123; - -constexpr base::TimeDelta kAppLoadTimeout = base::Minutes(5); - -MATCHER_P2(HasDouble, key, value, "") { - const std::optional v = base::JSONReader::Read(arg); - if (!v || !v->is_dict()) { - return false; - } - - const base::Value::Dict& dict = v->GetDict(); - return dict.FindDouble(key) == value; -} - -MATCHER_P2(HasInt, key, value, "") { - const std::optional v = base::JSONReader::Read(arg); - if (!v || !v->is_dict()) { - return false; - } - - const base::Value::Dict& dict = v->GetDict(); - return dict.FindInt(key) == value; -} - -MATCHER_P2(HasString, key, value, "") { - const std::optional v = base::JSONReader::Read(arg); - if (!v || !v->is_dict()) { - return false; - } - - const base::Value::Dict& dict = v->GetDict(); - const std::string* stored_value = dict.FindString(key); - return stored_value && (*stored_value == value); -} - -} // namespace - -class MockMetricsSink : public CastMetricsHelper::MetricsSink { - public: - MOCK_METHOD1(OnAction, void(const std::string&)); - MOCK_METHOD3(OnEnumerationEvent, void(const std::string&, int, int)); - MOCK_METHOD5(OnTimeEvent, - void(const std::string&, - base::TimeDelta, - base::TimeDelta, - base::TimeDelta, - int)); -}; - -class CastMetricsHelperTest : public ::testing::Test { - public: - CastMetricsHelperTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME), - metrics_helper_(task_environment_.GetMainThreadTaskRunner(), - task_environment_.GetMockTickClock()) { - metrics_helper_.SetMetricsSink(&metrics_sink_); - } - - base::test::TaskEnvironment task_environment_; - MockMetricsSink metrics_sink_; - CastMetricsHelper metrics_helper_; -}; - -TEST_F(CastMetricsHelperTest, RecordEventWithValue) { - const auto expected_time = task_environment_.NowTicks(); - - EXPECT_CALL( - metrics_sink_, - OnAction( - AllOf(HasString("name", kEvent), - HasDouble("time", - (expected_time - base::TimeTicks()).InMicroseconds()), - HasInt("value", kValue)))); - metrics_helper_.RecordApplicationEventWithValue(kEvent, kValue); -} - -TEST_F(CastMetricsHelperTest, RecordApplicationEvent) { - metrics_helper_.DidStartLoad(kAppId1); - metrics_helper_.DidCompleteLoad(kAppId1, kSessionId1); - metrics_helper_.UpdateSDKInfo(kSdkVersion); - - const auto expected_time = task_environment_.NowTicks(); - - EXPECT_CALL( - metrics_sink_, - OnAction(AllOf( - HasString("name", kEvent), - HasDouble("time", - (expected_time - base::TimeTicks()).InMicroseconds()), - HasString("app_id", kAppId1), HasString("session_id", kSessionId1), - HasString("sdk_version", kSdkVersion)))); - metrics_helper_.RecordApplicationEvent(kEvent); -} - -TEST_F(CastMetricsHelperTest, RecordApplicationEventWithValue) { - metrics_helper_.DidStartLoad(kAppId1); - metrics_helper_.DidCompleteLoad(kAppId1, kSessionId1); - metrics_helper_.UpdateSDKInfo(kSdkVersion); - - const auto expected_time = task_environment_.NowTicks(); - - EXPECT_CALL( - metrics_sink_, - OnAction(AllOf( - HasString("name", kEvent), - HasDouble("time", - (expected_time - base::TimeTicks()).InMicroseconds()), - HasString("app_id", kAppId1), HasString("session_id", kSessionId1), - HasString("sdk_version", kSdkVersion), HasInt("value", kValue)))); - metrics_helper_.RecordApplicationEventWithValue(kEvent, kValue); -} - -TEST_F(CastMetricsHelperTest, LogTimeToFirstPaint) { - metrics_helper_.DidStartLoad(kAppId1); - metrics_helper_.DidCompleteLoad(kAppId1, kSessionId1); - - constexpr base::TimeDelta kTimeToFirstPaint = base::Seconds(5); - task_environment_.FastForwardBy(kTimeToFirstPaint); - - EXPECT_CALL(metrics_sink_, OnTimeEvent(AllOf(HasSubstr(kAppId1), - HasSubstr("TimeToFirstPaint")), - kTimeToFirstPaint, _, _, _)); - metrics_helper_.LogTimeToFirstPaint(); -} - -TEST_F(CastMetricsHelperTest, LogTimeToFirstAudio) { - metrics_helper_.DidStartLoad(kAppId1); - metrics_helper_.DidCompleteLoad(kAppId1, kSessionId1); - - constexpr base::TimeDelta kTimeToFirstAudio = base::Seconds(5); - task_environment_.FastForwardBy(kTimeToFirstAudio); - - EXPECT_CALL(metrics_sink_, OnTimeEvent(AllOf(HasSubstr(kAppId1), - HasSubstr("TimeToFirstAudio")), - kTimeToFirstAudio, _, _, _)); - metrics_helper_.LogTimeToFirstAudio(); -} - -TEST_F(CastMetricsHelperTest, MultipleApps) { - metrics_helper_.DidStartLoad(kAppId1); - task_environment_.FastForwardBy(kAppLoadTimeout); - metrics_helper_.DidStartLoad(kAppId2); - metrics_helper_.DidStartLoad(kAppId3); - metrics_helper_.DidCompleteLoad(kAppId3, kSessionId3); - // kAppId2 should become the current app. - metrics_helper_.DidCompleteLoad(kAppId2, kSessionId2); - // kAppId1 should not become the current app because it timed out. - metrics_helper_.DidCompleteLoad(kAppId1, kSessionId1); - - EXPECT_CALL(metrics_sink_, - OnAction(AllOf(HasString("app_id", kAppId2), - HasString("session_id", kSessionId2)))); - metrics_helper_.RecordApplicationEvent(kEvent); -} - -} // namespace metrics -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/metrics/grouped_histogram.cc chromium-132.0.6834.159/chromecast/base/metrics/grouped_histogram.cc --- chromium-132.0.6834.110/chromecast/base/metrics/grouped_histogram.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/metrics/grouped_histogram.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,190 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/metrics/grouped_histogram.h" - -#include -#include - -#include - -#include "base/check_op.h" -#include "base/metrics/histogram.h" -#include "base/metrics/statistics_recorder.h" -#include "base/no_destructor.h" -#include "base/strings/stringprintf.h" -#include "base/synchronization/lock.h" -#include "base/time/time.h" - -namespace chromecast { -namespace metrics { - -namespace { - -const char kAppNameErrorNoApp[] = "ERROR_NO_APP_REGISTERED"; - -// Current app name guarded by lock. -struct CurrentAppNameWithLock { - base::Lock lock; - std::string app_name; -}; - -CurrentAppNameWithLock& GetCurrentApp() { - static base::NoDestructor current_app; - return *current_app; -} - -std::string GetAppName() { - base::AutoLock lock(GetCurrentApp().lock); - const std::string& app_name = GetCurrentApp().app_name; - return app_name.empty() ? kAppNameErrorNoApp : app_name; -} - -struct HistogramArgs { - const char* name; - int minimum; - int maximum; - size_t bucket_count; -}; - -// List of metrics to collect using a GroupedHistogram. -// -// When adding more Histograms to this list, find the source of the -// Histogram and look for the construction arguments it uses to add it in. -const HistogramArgs kHistogramsToGroup[] = { - { - "DNS.TotalTime", - 1, - 1000 * 60 * 60, - 100, - }, - { - "Net.DNS_Resolution_And_TCP_Connection_Latency2", - 1, - 1000 * 60 * 10, - 100, - }, - { - "Net.SSL_Connection_Latency2", - 1, - 1000 * 60, - 100, - }, - { - "Net.TCP_Connection_Latency", - 1, - 1000 * 60 * 10, - 100, - }, - { - "Net.HttpJob.TotalTime", - 1, - 1000 * 10, - 50, - }, -}; - -// This class is used to override a Histogram to generate per-app metrics. -// It intercepts calls to Add() for a given metric and generates new metrics -// of the form ".". -class GroupedHistogram : public base::Histogram { - public: - // TODO(crbug.com/40824087): min/max parameters are redundant with "ranges" - // and can probably be removed. - GroupedHistogram(const char* metric_to_override, - Sample minimum, - Sample maximum, - const base::BucketRanges* ranges) - : Histogram(metric_to_override, ranges), - minimum_(minimum), - maximum_(maximum), - bucket_count_(ranges->bucket_count()) {} - - GroupedHistogram(const GroupedHistogram&) = delete; - GroupedHistogram& operator=(const GroupedHistogram&) = delete; - - ~GroupedHistogram() override { - } - - // base::Histogram implementation: - void Add(Sample value) override { - Histogram::Add(value); - - // Note: This is very inefficient. Fetching the app name (which has a lock) - // plus doing a search by name with FactoryGet (which also has a lock) makes - // incrementing a metric relatively slow. - std::string name( - base::StringPrintf("%s.%s", histogram_name(), GetAppName().c_str())); - HistogramBase* grouped_histogram = - base::Histogram::FactoryGet(name, - minimum_, - maximum_, - bucket_count_, - flags()); - DCHECK(grouped_histogram); - grouped_histogram->Add(value); - } - - private: - // Saved construction arguments for reconstructing the Histogram later (with - // a suffixed app name). - Sample minimum_; - Sample maximum_; - uint32_t bucket_count_; -}; - -// Registers a GroupedHistogram with StatisticsRecorder. Must be called -// before any Histogram of the same name has been used. -// It acts similarly to Histogram::FactoryGet but checks that -// the histogram is being newly created and does not already exist. -void PreregisterHistogram(const char* name, - GroupedHistogram::Sample minimum, - GroupedHistogram::Sample maximum, - size_t bucket_count, - int32_t flags) { - std::string_view name_piece(name); - - DCHECK(base::Histogram::InspectConstructionArguments( - name_piece, &minimum, &maximum, &bucket_count)); - DCHECK(!base::StatisticsRecorder::FindHistogram(name_piece)) - << "Failed to preregister " << name << ", Histogram already exists."; - - // To avoid racy destruction at shutdown, the following will be leaked. - base::BucketRanges* ranges = new base::BucketRanges(bucket_count + 1); - base::Histogram::InitializeBucketRanges(minimum, maximum, ranges); - const base::BucketRanges* registered_ranges = - base::StatisticsRecorder::RegisterOrDeleteDuplicateRanges(ranges); - - GroupedHistogram* tentative_histogram = - new GroupedHistogram(name, minimum, maximum, registered_ranges); - - tentative_histogram->SetFlags(flags); - base::HistogramBase* histogram = - base::StatisticsRecorder::RegisterOrDeleteDuplicate(tentative_histogram); - - DCHECK_EQ(histogram, tentative_histogram); - DCHECK_EQ(base::HISTOGRAM, histogram->GetHistogramType()); - DCHECK(histogram->HasConstructionArguments(minimum, maximum, bucket_count)); -} - -} // namespace - -void PreregisterAllGroupedHistograms() { - for (size_t i = 0; i < std::size(kHistogramsToGroup); ++i) { - PreregisterHistogram( - kHistogramsToGroup[i].name, - kHistogramsToGroup[i].minimum, - kHistogramsToGroup[i].maximum, - kHistogramsToGroup[i].bucket_count, - base::HistogramBase::kUmaTargetedHistogramFlag); - } -} - -void TagAppStartForGroupedHistograms(const std::string& app_name) { - base::AutoLock lock(GetCurrentApp().lock); - GetCurrentApp().app_name = app_name; -} - -} // namespace metrics -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/metrics/grouped_histogram.h chromium-132.0.6834.159/chromecast/base/metrics/grouped_histogram.h --- chromium-132.0.6834.110/chromecast/base/metrics/grouped_histogram.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/metrics/grouped_histogram.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_METRICS_GROUPED_HISTOGRAM_H_ -#define CHROMECAST_BASE_METRICS_GROUPED_HISTOGRAM_H_ - -#include - -namespace chromecast { -namespace metrics { - -// Registers a predefined list of histograms to be collected per-app. Must be -// called before any histograms of the same name are used or registration will -// fail. -void PreregisterAllGroupedHistograms(); - -// Sets the current app name to be used for subsequent grouped histogram -// samples (a new metric is generated with the app name as a suffix). -void TagAppStartForGroupedHistograms(const std::string& app_name); - -} // namespace metrics -} // namespace chromecast - -#endif // CHROMECAST_BASE_METRICS_GROUPED_HISTOGRAM_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/metrics/mock_cast_metrics_helper.cc chromium-132.0.6834.159/chromecast/base/metrics/mock_cast_metrics_helper.cc --- chromium-132.0.6834.110/chromecast/base/metrics/mock_cast_metrics_helper.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/metrics/mock_cast_metrics_helper.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/metrics/mock_cast_metrics_helper.h" - -namespace chromecast { -namespace metrics { - -MockCastMetricsHelper::MockCastMetricsHelper() : CastMetricsHelper() {} - -MockCastMetricsHelper::~MockCastMetricsHelper() = default; - -} // namespace metrics -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/metrics/mock_cast_metrics_helper.h chromium-132.0.6834.159/chromecast/base/metrics/mock_cast_metrics_helper.h --- chromium-132.0.6834.110/chromecast/base/metrics/mock_cast_metrics_helper.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/metrics/mock_cast_metrics_helper.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,50 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_METRICS_MOCK_CAST_METRICS_HELPER_H_ -#define CHROMECAST_BASE_METRICS_MOCK_CAST_METRICS_HELPER_H_ - -#include - -#include "chromecast/base/metrics/cast_metrics_helper.h" -#include "testing/gmock/include/gmock/gmock.h" - -namespace chromecast { -namespace metrics { - -class MockCastMetricsHelper : public CastMetricsHelper { - public: - MockCastMetricsHelper(); - - MockCastMetricsHelper(const MockCastMetricsHelper&) = delete; - MockCastMetricsHelper& operator=(const MockCastMetricsHelper&) = delete; - - ~MockCastMetricsHelper() override; - - MOCK_METHOD2(UpdateCurrentAppInfo, - void(const std::string& app_id, const std::string& session_id)); - MOCK_METHOD1(UpdateSDKInfo, void(const std::string& sdk_version)); - MOCK_METHOD0(LogMediaPlay, void()); - MOCK_METHOD0(LogMediaPause, void()); - MOCK_METHOD1(RecordSimpleAction, void(const std::string& action)); - MOCK_METHOD2(RecordEventWithValue, - void(const std::string& action, int value)); - MOCK_METHOD1(RecordApplicationEvent, void(const std::string& event)); - MOCK_METHOD2(RecordApplicationEventWithValue, - void(const std::string& event, int value)); - MOCK_METHOD0(LogTimeToFirstPaint, void()); - MOCK_METHOD0(LogTimeToFirstAudio, void()); - MOCK_METHOD2(LogTimeToBufferAv, - void(BufferingType buffering_type, base::TimeDelta time)); - MOCK_CONST_METHOD2(GetMetricsNameWithAppName, - std::string(const std::string& prefix, - const std::string& suffix)); - MOCK_METHOD1(SetMetricsSink, void(MetricsSink* delegate)); - MOCK_METHOD1(SetRecordActionCallback, void(RecordActionCallback callback)); -}; - -} // namespace metrics -} // namespace chromecast - -#endif // CHROMECAST_BASE_METRICS_MOCK_CAST_METRICS_HELPER_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/observer.h chromium-132.0.6834.159/chromecast/base/observer.h --- chromium-132.0.6834.110/chromecast/base/observer.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/observer.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,431 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Safe Observer/Observable implementation. -// -// When using ObserverListThreadSafe, we were running into issues since there -// was no synchronization between getting the existing value, and registering -// as an observer. See go/cast-platform-design-synchronized-value for more -// details. -// -// To fix this issue, and to make observing values safer and simpler in general, -// use the Observable/Observer pattern in this file. When you have a value that -// other code wants to observe (ie, get the value of and receive any changes), -// wrap that value in an Observable. The value type T must be copyable and -// copy-assignable. The Observable must be constructed with the initial observed -// value, and the value may be updated at any time from any thread by calling -// SetValue(). You can also get the value using GetValue(); but note that this -// is not threadsafe (the value is returned without locking), so the caller must -// ensure safety by other means. Calling GetValueThreadSafe() is threadsafe but -// involves a mutex lock. -// -// Code that wants to observe the value calls Observe() on it at any point when -// the value is alive. Note that Observe() may be called safely from any thread. -// Observe() returns an Observer instance, which MUST be used and destroyed -// only on the thread that called Observe(). The Observer initially contains the -// value that the Observable had when Observe() was called, and that value will -// be updated asynchronously whenever the Observable's SetValue() method is -// is called. NOTE: the initial value of the Observer is the value known to the -// thread that created the Observer at the time; there may be an updated value -// from the Observable that hasn't been handled by the Observer's thread yet. -// -// The Observer's view of the observed value is returned by GetValue(); this is -// a low-cost call since there is no locking (the value is updated on the thread -// that constructed the Observer). Note that Observers are always updated -// asynchronously with PostTask(), even if they belong to the same thread that -// calls SetValue(). All Observers on the same thread have the same consistent -// view of the observed value. -// -// Observers may be copied freely; the copy also observes the original -// Observable, and belongs to the thread that created the copy. Copying is safe -// even when the original Observable has been destroyed. -// -// Code may register a callback that is called whenever an Observer's value is -// updated, by calling SetOnUpdateCallback(). If you get an Observer by calling -// Observe() and then immediately call SetOnUpdateCallback() to register a -// a callback, you are guaranteed to get every value of the Observable starting -// from when you called Observe() - you get the initial value by calling -// GetValue() on the returned Observer, and any subsequent updates will trigger -// the callback so you can call GetValue() to get the new value. You will not -// receive any extra callbacks (exactly one callback per value update). -// -// Note that Observers are not default-constructible, since there is no way to -// construct it in a default state. In cases where you need to instantiate an -// Observer after your constructor, you can use a std::unique_ptr -// instead, and initialize it when needed. -// -// Example usage: -// -// class MediaManager { -// public: -// MediaManager() : volume_(0.0f) {} -// -// Observer ObserveVolume() { return volume_.Observe(); } -// -// // ... other methods ... -// -// private: -// // Assume this is called from some other internal code when the volume is -// // updated. -// void OnUpdateVolume(float new_volume) { -// volume_.SetValue(new_volume); // All observers will get the new value. -// } -// -// Observable volume_; -// } -// -// class VolumeFeedbackManager { -// public: -// VolumeFeedbackManager(MediaManager* media_manager) -// : volume_observer_(media_manager->ObserveVolume()) { -// volume_observer_.SetOnUpdateCallback( -// base::BindRepeating(&VolumeFeedbackManager::OnVolumeChanged, -// base::Unretained(this))); -// } -// -// private: -// void OnVolumeChanged() { -// ShowVolumeFeedback(volume_observer_.GetValue()); -// } -// -// void ShowVolumeFeedback(float volume) { -// // ... some implementation ... -// } -// }; -// - -#ifndef CHROMECAST_BASE_OBSERVER_H_ -#define CHROMECAST_BASE_OBSERVER_H_ - -#include -#include - -#include -#include -#include - -#include "base/check_op.h" -#include "base/containers/contains.h" -#include "base/functional/bind.h" -#include "base/functional/callback.h" -#include "base/location.h" -#include "base/memory/raw_ref.h" -#include "base/memory/ref_counted.h" -#include "base/notreached.h" -#include "base/sequence_checker.h" -#include "base/synchronization/lock.h" -#include "base/task/sequenced_task_runner.h" - -namespace chromecast { - -namespace subtle { -template -class ObservableInternals; -} // namespace subtle - -template -class Observable; - -template -class Observer { - public: - Observer(const Observer& other); - - Observer& operator=(const Observer&) = delete; - - ~Observer(); - - void SetOnUpdateCallback(base::RepeatingClosure callback) { - on_update_callback_ = std::move(callback); - } - - const T& GetValue() const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - return *value_; - } - - private: - friend class subtle::ObservableInternals; - friend class Observable; - - explicit Observer(scoped_refptr> internals); - - void OnUpdate(); - - const scoped_refptr> internals_; - // Note: value_ is a const ref to the value copy for this sequence, stored in - // SequenceOwnedInfo. - const raw_ref value_; - base::RepeatingClosure on_update_callback_; - SEQUENCE_CHECKER(sequence_checker_); -}; - -template -class Observable { - static_assert(std::is_copy_constructible::value, - "Observable values must be copyable"); - static_assert(std::is_copy_assignable::value, - "Observable values must be copy-assignable"); - - public: - explicit Observable(const T& initial_value); - - Observable(const Observable&) = delete; - Observable& operator=(const Observable&) = delete; - - Observer Observe(); - - void SetValue(const T& new_value); - const T& GetValue() const; // NOT threadsafe! - T GetValueThreadSafe() const; - - private: - // By using a refcounted object to store the value and observer list, we can - // avoid tying the lifetime of Observable to its Observers or vice versa. - const scoped_refptr> internals_; -}; - -namespace subtle { - -template -class ObservableInternals - : public base::RefCountedThreadSafe> { - public: - explicit ObservableInternals(const T& initial_value) - : value_(initial_value) {} - - ObservableInternals(const ObservableInternals&) = delete; - ObservableInternals& operator=(const ObservableInternals&) = delete; - - void SetValue(const T& new_value) { - base::AutoLock lock(lock_); - value_ = new_value; - - for (auto& item : per_sequence_) { - item.SetValue(new_value); - } - } - - const T& GetValue() const { return value_; } - - T GetValueThreadSafe() const { - base::AutoLock lock(lock_); - return value_; - } - - const T& AddObserver(Observer* observer) { - DCHECK(observer); - DCHECK(base::SequencedTaskRunner::HasCurrentDefault()); - auto task_runner = base::SequencedTaskRunner::GetCurrentDefault(); - - base::AutoLock lock(lock_); - auto it = per_sequence_.begin(); - while (it != per_sequence_.end() && it->task_runner() != task_runner) { - ++it; - } - if (it == per_sequence_.end()) { - per_sequence_.emplace_back(std::move(task_runner), value_); - it = --per_sequence_.end(); - } - it->AddObserver(observer); - return it->value(); - } - - void RemoveObserver(Observer* observer) { - DCHECK(observer); - DCHECK(base::SequencedTaskRunner::HasCurrentDefault()); - auto task_runner = base::SequencedTaskRunner::GetCurrentDefault(); - - base::AutoLock lock(lock_); - for (size_t i = 0; i < per_sequence_.size(); ++i) { - if (per_sequence_[i].task_runner() == task_runner) { - per_sequence_[i].RemoveObserver(observer); - - if (per_sequence_[i].Empty()) { - per_sequence_[i].Swap(per_sequence_.back()); - per_sequence_.pop_back(); - } - return; - } - } - - NOTREACHED() << "Tried to remove observer from unknown task runner"; - } - - private: - // Information owned by a particular sequence. Must be only accessed on that - // sequence, and must be deleted by posting a task to that sequence. - // This class MUST NOT contain a scoped_refptr to the task_runner, since if it - // did, there would be a reference cycle during cleanup, when the task to - // Destroy() is posted. - class SequenceOwnedInfo { - public: - explicit SequenceOwnedInfo(const T& value) : value_(value) {} - - SequenceOwnedInfo(const SequenceOwnedInfo&) = delete; - SequenceOwnedInfo& operator=(const SequenceOwnedInfo&) = delete; - - const T& value() const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - return value_; - } - - void AddObserver(Observer* observer) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(observer); - DCHECK(!base::Contains(observers_, observer)); - observers_.push_back(observer); - } - - void RemoveObserver(Observer* observer) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(observer); - DCHECK(base::Contains(observers_, observer)); - observers_.erase( - std::remove(observers_.begin(), observers_.end(), observer), - observers_.end()); - } - - bool Empty() const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - return observers_.empty(); - } - - void SetValue(const T& value) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - value_ = value; - for (auto* obs : observers_) { - obs->OnUpdate(); - } - } - - static void Destroy(std::unique_ptr self) { - // The unique_ptr deletes automatically. - } - - private: - std::vector*> observers_; - T value_; - SEQUENCE_CHECKER(sequence_checker_); - }; - - class PerSequenceInfo { - public: - PerSequenceInfo(scoped_refptr task_runner, - const T& value) - : task_runner_(std::move(task_runner)), - owned_info_(std::make_unique(value)) {} - - PerSequenceInfo(PerSequenceInfo&& other) = default; - - ~PerSequenceInfo() { - if (!owned_info_) { - // Members have been moved out via move constructor. - return; - } - - DCHECK(Empty()); - // Must post a task to delete the owned info, since there may still be a - // pending task to call SequenceOwnedInfo::SetValue(). - // Use manual PostNonNestableTask(), since DeleteSoon() does not - // guarantee deletion. - task_runner_->PostNonNestableTask( - FROM_HERE, - base::BindOnce(&SequenceOwnedInfo::Destroy, std::move(owned_info_))); - } - - const T& value() const { return owned_info_->value(); } - - const base::SequencedTaskRunner* task_runner() const { - return task_runner_.get(); - } - - void AddObserver(Observer* observer) { - owned_info_->AddObserver(observer); - } - - void RemoveObserver(Observer* observer) { - owned_info_->RemoveObserver(observer); - } - - bool Empty() const { return owned_info_->Empty(); } - - void Swap(PerSequenceInfo& other) { - std::swap(task_runner_, other.task_runner_); - std::swap(owned_info_, other.owned_info_); - } - - void SetValue(const T& value) { - task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&SequenceOwnedInfo::SetValue, - base::Unretained(owned_info_.get()), value)); - } - - private: - // Operations on |owned_info| do not need to be synchronized with a lock, - // since all operations must occur on |task_runner|. - scoped_refptr task_runner_; - std::unique_ptr owned_info_; - }; - - friend class base::RefCountedThreadSafe; - ~ObservableInternals() {} - - mutable base::Lock lock_; - T value_; - std::vector per_sequence_; -}; - -} // namespace subtle - -template -Observer::Observer(scoped_refptr> internals) - : internals_(std::move(internals)), value_(internals_->AddObserver(this)) {} - -template -Observer::Observer(const Observer& other) : Observer(other.internals_) {} - -template -Observer::~Observer() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - internals_->RemoveObserver(this); -} - -template -void Observer::OnUpdate() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (on_update_callback_) { - on_update_callback_.Run(); - } -} - -template -Observable::Observable(const T& initial_value) - : internals_(base::WrapRefCounted( - new subtle::ObservableInternals(initial_value))) {} - -template -Observer Observable::Observe() { - return Observer(internals_); -} - -template -void Observable::SetValue(const T& new_value) { - internals_->SetValue(new_value); -} - -template -const T& Observable::GetValue() const { - return internals_->GetValue(); -} - -template -T Observable::GetValueThreadSafe() const { - return internals_->GetValueThreadSafe(); -} - -} // namespace chromecast - -#endif // CHROMECAST_BASE_OBSERVER_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/observer_unittest.cc chromium-132.0.6834.159/chromecast/base/observer_unittest.cc --- chromium-132.0.6834.110/chromecast/base/observer_unittest.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/observer_unittest.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,352 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include -#include - -#include "base/functional/bind.h" -#include "base/functional/callback_helpers.h" -#include "base/location.h" -#include "base/run_loop.h" -#include "base/synchronization/waitable_event.h" -#include "base/test/task_environment.h" -#include "base/threading/thread.h" -#include "chromecast/base/observer.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace chromecast { - -class ObserverTest : public ::testing::Test { - protected: - base::test::SingleThreadTaskEnvironment task_environment_; -}; - -struct NoDefaultConstructor { - NoDefaultConstructor(int v) : value(v) {} - - int value; -}; - -class ThreadedObservable { - public: - ThreadedObservable() : thread_("ThreadedObservable"), value_(0) { - thread_.Start(); - } - - ThreadedObservable(const ThreadedObservable&) = delete; - ThreadedObservable& operator=(const ThreadedObservable&) = delete; - - Observer Observe() { return value_.Observe(); } - - void SetValue(int value) { - thread_.task_runner()->PostTask( - FROM_HERE, base::BindOnce(&ThreadedObservable::SetValueOnThread, - base::Unretained(this), value)); - } - - private: - void SetValueOnThread(int value) { - DCHECK(thread_.task_runner()->BelongsToCurrentThread()); - value_.SetValue(value); - } - - base::Thread thread_; - Observable value_; -}; - -class ThreadedObserver { - public: - ThreadedObserver() - : thread_("ThreadedObserver"), - observing_(base::WaitableEvent::ResetPolicy::MANUAL, - base::WaitableEvent::InitialState::NOT_SIGNALED) { - thread_.Start(); - } - - ThreadedObserver(const ThreadedObserver&) = delete; - ThreadedObserver& operator=(const ThreadedObserver&) = delete; - - ~ThreadedObserver() { - thread_.task_runner()->PostTask( - FROM_HERE, base::BindOnce(&ThreadedObserver::DestroyOnThread, - base::Unretained(this))); - thread_.Stop(); - } - - void Observe(Observable* observable) { - thread_.task_runner()->PostTask( - FROM_HERE, base::BindOnce(&ThreadedObserver::ObserveOnThread, - base::Unretained(this), observable)); - observing_.Wait(); - } - - void CheckValue(int value) { - thread_.task_runner()->PostTask( - FROM_HERE, base::BindOnce(&ThreadedObserver::CheckValueOnThread, - base::Unretained(this), value)); - } - - private: - void ObserveOnThread(Observable* observable) { - DCHECK(thread_.task_runner()->BelongsToCurrentThread()); - observer_ = std::make_unique>(observable->Observe()); - observing_.Signal(); - } - - void CheckValueOnThread(int value) { - DCHECK(thread_.task_runner()->BelongsToCurrentThread()); - EXPECT_EQ(value, observer_->GetValue()); - } - - void DestroyOnThread() { - DCHECK(thread_.task_runner()->BelongsToCurrentThread()); - observer_.reset(); - } - - base::Thread thread_; - std::unique_ptr> observer_; - base::WaitableEvent observing_; -}; - -void RunCallback(std::function callback) { - callback(); -} - -TEST_F(ObserverTest, SimpleValue) { - Observable original(0); - Observer observer = original.Observe(); - - EXPECT_EQ(0, observer.GetValue()); - - original.SetValue(1); - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(1, observer.GetValue()); -} - -TEST_F(ObserverTest, MultipleObservers) { - Observable original(0); - Observer observer1 = original.Observe(); - Observer observer2 = observer1; - - EXPECT_EQ(0, observer1.GetValue()); - EXPECT_EQ(0, observer2.GetValue()); - - original.SetValue(1); - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(1, observer1.GetValue()); - EXPECT_EQ(1, observer2.GetValue()); -} - -TEST_F(ObserverTest, NoDefaultConstructor) { - Observable original(0); - Observer observer = original.Observe(); - - EXPECT_EQ(0, observer.GetValue().value); - - original.SetValue(1); - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(1, observer.GetValue().value); -} - -TEST_F(ObserverTest, NoMissingEvents) { - Observable original(0); - Observer observer = original.Observe(); - original.SetValue(1); - - std::vector event_values; - std::function callback = [&]() { - event_values.push_back(observer.GetValue()); - }; - observer.SetOnUpdateCallback(base::BindRepeating(&RunCallback, callback)); - - EXPECT_EQ(0, observer.GetValue()); - - original.SetValue(2); - base::RunLoop().RunUntilIdle(); - original.SetValue(3); - original.SetValue(4); - base::RunLoop().RunUntilIdle(); - - ASSERT_EQ(4u, event_values.size()); - EXPECT_EQ(1, event_values[0]); - EXPECT_EQ(2, event_values[1]); - EXPECT_EQ(3, event_values[2]); - EXPECT_EQ(4, event_values[3]); - - EXPECT_EQ(4, observer.GetValue()); -} - -TEST_F(ObserverTest, NoExtraEventsAfterChange) { - Observable original(0); - original.SetValue(1); - - Observer observer = original.Observe(); - EXPECT_EQ(1, observer.GetValue()); - - std::vector event_values; - std::function callback = [&]() { - event_values.push_back(observer.GetValue()); - }; - observer.SetOnUpdateCallback(base::BindRepeating(&RunCallback, callback)); - - // Propagate the SetValue event; the observer shouldn't get it since it - // started observing after SetValue(). - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(1, observer.GetValue()); - EXPECT_EQ(0u, event_values.size()); -} - -TEST_F(ObserverTest, NoExtraEventsBetweenChanges) { - Observable original(0); - original.SetValue(1); - - Observer observer = original.Observe(); - EXPECT_EQ(1, observer.GetValue()); - - original.SetValue(2); - - std::vector event_values; - std::function callback = [&]() { - event_values.push_back(observer.GetValue()); - }; - observer.SetOnUpdateCallback(base::BindRepeating(&RunCallback, callback)); - - // Propagate the SetValue events; the observer should only get the second - // event, corresponding to the SetValue after the observer was created. - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(2, observer.GetValue()); - ASSERT_EQ(1u, event_values.size()); - EXPECT_EQ(2, event_values[0]); -} - -TEST_F(ObserverTest, NoExtraEventsForCopy) { - Observable original(0); - original.SetValue(1); - - Observer observer1 = original.Observe(); - EXPECT_EQ(1, observer1.GetValue()); - - original.SetValue(2); - - Observer observer2 = observer1; - // All observers on the same thread observe the same value. The update hasn't - // propagated yet. - EXPECT_EQ(1, observer2.GetValue()); - - std::vector event_values1; - std::function callback1 = [&]() { - event_values1.push_back(observer1.GetValue()); - }; - observer1.SetOnUpdateCallback(base::BindRepeating(&RunCallback, callback1)); - - std::vector event_values2; - std::function callback2 = [&]() { - event_values2.push_back(observer2.GetValue()); - }; - observer2.SetOnUpdateCallback(base::BindRepeating(&RunCallback, callback2)); - - // Propagate the SetValue events; each observer should get just one callback - // for the new value. - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(2, observer1.GetValue()); - EXPECT_EQ(2, observer2.GetValue()); - - ASSERT_EQ(1u, event_values1.size()); - EXPECT_EQ(2, event_values1[0]); - - ASSERT_EQ(1u, event_values2.size()); - EXPECT_EQ(2, event_values2[0]); -} - -TEST_F(ObserverTest, SetCallbackTwice) { - Observable original(0); - original.SetValue(1); - - Observer observer = original.Observe(); - EXPECT_EQ(1, observer.GetValue()); - - original.SetValue(2); - - std::vector event_values1; - std::function callback1 = [&]() { - event_values1.push_back(observer.GetValue()); - }; - observer.SetOnUpdateCallback(base::BindRepeating(&RunCallback, callback1)); - - std::vector event_values2; - std::function callback2 = [&]() { - event_values2.push_back(observer.GetValue()); - }; - observer.SetOnUpdateCallback(base::BindRepeating(&RunCallback, callback2)); - - // Propagate the SetValue events; only the second callback should be run. - base::RunLoop().RunUntilIdle(); - EXPECT_EQ(2, observer.GetValue()); - EXPECT_EQ(0u, event_values1.size()); - ASSERT_EQ(1u, event_values2.size()); - EXPECT_EQ(2, event_values2[0]); -} - -TEST_F(ObserverTest, ObserverOutlivesObservable) { - auto original = std::make_unique>(0); - Observer observer1 = original->Observe(); - - EXPECT_EQ(0, observer1.GetValue()); - - original->SetValue(1); - original.reset(); - - Observer observer2 = observer1; - - base::RunLoop().RunUntilIdle(); - - EXPECT_EQ(1, observer1.GetValue()); - EXPECT_EQ(1, observer2.GetValue()); -} - -TEST_F(ObserverTest, ObserverOnDifferentThread) { - auto original = std::make_unique(); - Observer observer = original->Observe(); - EXPECT_EQ(0, observer.GetValue()); - - std::vector event_values; - std::function callback = [&]() { - event_values.push_back(observer.GetValue()); - }; - observer.SetOnUpdateCallback(base::BindRepeating(&RunCallback, callback)); - - original->SetValue(1); - original->SetValue(2); - original.reset(); - - base::RunLoop().RunUntilIdle(); - - EXPECT_EQ(2, observer.GetValue()); - ASSERT_EQ(2u, event_values.size()); - EXPECT_EQ(1, event_values[0]); - EXPECT_EQ(2, event_values[1]); -} - -TEST_F(ObserverTest, ObserveOnManyThreads) { - auto original = std::make_unique>(0); - std::vector> observers; - for (int i = 0; i < 20; ++i) { - observers.push_back(std::make_unique()); - observers.back()->Observe(original.get()); - } - - original->SetValue(1); - original.reset(); - - base::RunLoop().RunUntilIdle(); - for (auto& observer : observers) { - observer->CheckValue(1); - } - - // Deleting the observers should check the expectations, since all posted - // tasks on their internal threads will run. - observers.clear(); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/path_utils.cc chromium-132.0.6834.159/chromecast/base/path_utils.cc --- chromium-132.0.6834.110/chromecast/base/path_utils.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/path_utils.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,55 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/path_utils.h" - -#include "base/logging.h" -#include "base/path_service.h" - -namespace chromecast { - -namespace { - -base::FilePath GetPath(base::BasePathKey default_dir_key, - const base::FilePath& path) { - if (path.IsAbsolute()) - return path; - - base::FilePath default_dir; - if (!base::PathService::Get(default_dir_key, &default_dir)) - LOG(DFATAL) << "Cannot get default dir: " << default_dir_key; - - base::FilePath adjusted_path(default_dir.Append(path)); - DVLOG(1) << "Path adjusted from " << path.value() << " to " - << adjusted_path.value(); - return adjusted_path; -} - -} // namespace - -base::FilePath GetHomePath(const base::FilePath& path) { - return GetPath(base::DIR_HOME, path); -} - -base::FilePath GetHomePathASCII(const std::string& path) { - return GetHomePath(base::FilePath(path)); -} - -base::FilePath GetBinPath(const base::FilePath& path) { - return GetPath(base::DIR_EXE, path); -} - -base::FilePath GetBinPathASCII(const std::string& path) { - return GetBinPath(base::FilePath(path)); -} - -base::FilePath GetTmpPath(const base::FilePath& path) { - return GetPath(base::DIR_TEMP, path); -} - -base::FilePath GetTmpPathASCII(const std::string& path) { - return GetTmpPath(base::FilePath(path)); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/path_utils.h chromium-132.0.6834.159/chromecast/base/path_utils.h --- chromium-132.0.6834.110/chromecast/base/path_utils.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/path_utils.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,31 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_PATH_UTILS_H_ -#define CHROMECAST_BASE_PATH_UTILS_H_ - -#include - -#include "base/files/file_path.h" - -namespace chromecast { - -// If |path| is relative, returns the path created by prepending HOME directory -// to |path| (e.g. {HOME}/|path|). If |path| is absolute, returns |path|. -base::FilePath GetHomePath(const base::FilePath& path); -base::FilePath GetHomePathASCII(const std::string& path); - -// If |path| is relative, returns the path created by prepending BIN directory -// to |path| (e.g. {BIN}/|path|). If |path| is absolute, returns |path|. -base::FilePath GetBinPath(const base::FilePath& path); -base::FilePath GetBinPathASCII(const std::string& path); - -// If |path| is relative, returns the path created by prepending TMP directory -// to |path| (e.g. {TMP}/|path|). If |path| is absolute, returns |path|. -base::FilePath GetTmpPath(const base::FilePath& path); -base::FilePath GetTmpPathASCII(const std::string& path); - -} // namespace chromecast - -#endif // CHROMECAST_BASE_PATH_UTILS_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/path_utils_unittest.cc chromium-132.0.6834.159/chromecast/base/path_utils_unittest.cc --- chromium-132.0.6834.110/chromecast/base/path_utils_unittest.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/path_utils_unittest.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/files/file_path.h" -#include "base/path_service.h" -#include "chromecast/base/path_utils.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace chromecast { -namespace { -const char kTestRelPath[] = "rel/path"; -const char kTestAbsPath[] = "/abs/path/to/dir"; - -std::string GetTestString(int base_dir_key) { - base::FilePath basedir; - EXPECT_TRUE(base::PathService::Get(base_dir_key, &basedir)); - return basedir.value() + "/" + kTestRelPath; -} - -} // namespace - -TEST(PathUtilsTest, GetHomePath) { - // Test with relative path. - std::string expected = GetTestString(base::DIR_HOME); - base::FilePath actual = GetHomePath(base::FilePath(kTestRelPath)); - EXPECT_EQ(expected, actual.value()); - - // Test with absolute path. - actual = GetHomePath(base::FilePath(kTestAbsPath)); - EXPECT_EQ(kTestAbsPath, actual.value()); -} - -TEST(PathUtilsTest, GetBinPath) { - // Test with relative path. - std::string expected = GetTestString(base::DIR_EXE); - base::FilePath actual = GetBinPath(base::FilePath(kTestRelPath)); - EXPECT_EQ(expected, actual.value()); - - // Test with absolute path. - actual = GetBinPath(base::FilePath(kTestAbsPath)); - EXPECT_EQ(kTestAbsPath, actual.value()); -} - -TEST(PathUtilsTest, GetTmpPath) { - // Test with relative path. - std::string expected = GetTestString(base::DIR_TEMP); - base::FilePath actual = GetTmpPath(base::FilePath(kTestRelPath)); - EXPECT_EQ(expected, actual.value()); - - // Test with absolute path. - actual = GetTmpPath(base::FilePath(kTestAbsPath)); - EXPECT_EQ(kTestAbsPath, actual.value()); -} - -} // chromecast \ No newline at end of file diff -Nru chromium-132.0.6834.110/chromecast/base/pref_names.cc chromium-132.0.6834.159/chromecast/base/pref_names.cc --- chromium-132.0.6834.110/chromecast/base/pref_names.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/pref_names.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,42 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/pref_names.h" - -namespace chromecast { -namespace prefs { - -// List of experiments enabled by DCS. For metrics purposes only. -const char kActiveDCSExperiments[] = "experiments.ids"; - -// Dictionary of remotely-enabled features from the latest DCS config fetch. -const char kLatestDCSFeatures[] = "experiments.features"; - -// Boolean that specifies whether or not the client_id has been regenerated -// due to bug b/9487011. -const char kMetricsIsNewClientID[] = "user_experience_metrics.is_new_client_id"; - -// Whether or not to report metrics and crashes. -const char kOptInStats[] = "opt-in.stats"; - -// Whether or not TOS has been accepted by user. -const char kTosAccepted[] = "tos-accepted"; - -// Total number of kernel crashes since the last report. -const char kStabilityKernelCrashCount[] = - "user_experience_metrics.stability.kernel_crash_count"; - -// Total number of external user process crashes since the last report. -const char kStabilityOtherUserCrashCount[] = - "user_experience_metrics.stability.other_user_crash_count"; - -// Total number of unclean system shutdowns since the last report. -const char kStabilitySystemUncleanShutdownCount[] = - "user_experience_metrics.stability.system_unclean_shutdowns"; - -// Current web color scheme. See blink::PreferredColorScheme. -const char kWebColorScheme[] = "web-color-scheme"; - -} // namespace prefs -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/pref_names.h chromium-132.0.6834.159/chromecast/base/pref_names.h --- chromium-132.0.6834.110/chromecast/base/pref_names.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/pref_names.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -// Copyright 2014 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_PREF_NAMES_H_ -#define CHROMECAST_BASE_PREF_NAMES_H_ - -namespace chromecast { -namespace prefs { - -extern const char kActiveDCSExperiments[]; -extern const char kLatestDCSFeatures[]; -extern const char kMetricsIsNewClientID[]; -extern const char kOptInStats[]; -extern const char kTosAccepted[]; -extern const char kStabilityKernelCrashCount[]; -extern const char kStabilityOtherUserCrashCount[]; -extern const char kStabilitySystemUncleanShutdownCount[]; -extern const char kWebColorScheme[]; - -} // namespace prefs -} // namespace chromecast - -#endif // CHROMECAST_BASE_PREF_NAMES_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/process_types.h chromium-132.0.6834.159/chromecast/base/process_types.h --- chromium-132.0.6834.110/chromecast/base/process_types.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/process_types.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,17 +0,0 @@ -// Copyright 2021 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_PROCESS_TYPES_H_ -#define CHROMECAST_BASE_PROCESS_TYPES_H_ - -namespace chromecast { - -enum class ProcessType { - kCastBrowser, - kCastService, -}; - -} // namespace chromecast - -#endif // CHROMECAST_BASE_PROCESS_TYPES_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/process_utils.cc chromium-132.0.6834.159/chromecast/base/process_utils.cc --- chromium-132.0.6834.110/chromecast/base/process_utils.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/process_utils.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/process_utils.h" - -#include -#include -#include - -#include "base/logging.h" -#include "base/posix/safe_strerror.h" -#include "base/strings/string_util.h" - -namespace chromecast { - -bool GetAppOutput(const std::vector& argv, std::string* output) { - DCHECK(output); - - // Join the args into one string, creating the command. - std::string command = base::JoinString(argv, " "); - - // Open the process. - FILE* fp = popen(command.c_str(), "r"); - if (!fp) { - PLOG(ERROR) << "popen (" << command << ") failed"; - return false; - } - - // Fill |output| with the stdout from the process. - output->clear(); - while (!feof(fp)) { - char buffer[256]; - size_t bytes_read = fread(buffer, 1, sizeof(buffer), fp); - if (bytes_read <= 0) - break; - output->append(buffer, bytes_read); - } - - // pclose() function waits for the associated process to terminate and returns - // the exit status. - return (pclose(fp) == 0); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/process_utils.h chromium-132.0.6834.159/chromecast/base/process_utils.h --- chromium-132.0.6834.110/chromecast/base/process_utils.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/process_utils.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,22 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_PROCESS_UTILS_H_ -#define CHROMECAST_BASE_PROCESS_UTILS_H_ - -#include -#include - -namespace chromecast { - -// Executes application, for which arguments are specified by |argv| and wait -// for it to exit. Stores the output (stdout) in |output|. Returns true on -// success. -// TODO(slan): Replace uses of this with base::GetAppOutput when crbug/493711 is -// resolved. -bool GetAppOutput(const std::vector& argv, std::string* output); - -} // namespace chromecast - -#endif // CHROMECAST_BASE_PROCESS_UTILS_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/process_utils_unittest.cc chromium-132.0.6834.159/chromecast/base/process_utils_unittest.cc --- chromium-132.0.6834.110/chromecast/base/process_utils_unittest.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/process_utils_unittest.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,52 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/process_utils.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace chromecast { - -// Verify that a simple process works as expected. -TEST(ProcessUtilsTest, SimpleProcess) { - // Create a simple command. - std::vector args; - args.push_back("echo"); - args.push_back("Hello World"); - - // Execute the command and collect the output. - std::string stdout_result; - ASSERT_TRUE(GetAppOutput(args, &stdout_result)); - - // Echo will append a newline to the stdout. - EXPECT_EQ("Hello World\n", stdout_result); -} - -// Verify that false is returned for an invalid command. -TEST(ProcessUtilsTest, InvalidCommand) { - // Create a command which is not valid. - std::vector args; - args.push_back("invalid_command"); - - // The command should not run. - std::string stdout_result; - ASSERT_FALSE(GetAppOutput(args, &stdout_result)); - ASSERT_TRUE(stdout_result.empty()); -} - -// Verify that false is returned when a command an error code. -TEST(ProcessUtilsTest, ProcessReturnsError) { - // Create a simple command. - std::vector args; - args.push_back("cd"); - args.push_back("path/to/invalid/directory"); - args.push_back("2>&1"); // Pipe the stderr into stdout. - - // Execute the command and collect the output. Verify that the output of the - // process is collected, even when the process returns an error code. - std::string stderr_result; - ASSERT_FALSE(GetAppOutput(args, &stderr_result)); - ASSERT_FALSE(stderr_result.empty()); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/reactive_java.md chromium-132.0.6834.159/chromecast/base/reactive_java.md --- chromium-132.0.6834.110/chromecast/base/reactive_java.md 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/reactive_java.md 1970-01-01 00:00:00.000000000 +0000 @@ -1,1293 +0,0 @@ -# Reactive Android Java programming - -[TOC] - -## Introduction - -**Ever notice how Android methods often come in pairs?** For every `onCreate()`, -there is an `onDestroy()`, for every `onStart()`, there is an `onStop()`. The -Android SDK commonly asks clients to register callbacks or extend base classes -that override pairs of methods that correspond to *reversible changes in state*. - -*State* is often expressed in Java code as *mutable variables*. A state changes -when you assign a new value to the variable. If a variable can be one value at -some points and another value at other points, that means there are two states -that the variable can have. Everything that interacts with that variable needs -to work correctly for each state the variable can be in. For example, if an -instance variable is `null` in a class's constructor, and set to a value by some -method in that class, then *every* method that tries to call a method on that -variable needs to check whether the value of the variable is null before -handling it, because there is no guarantee which state the variable is in. You -will see a lot of code that looks like this when using this pattern for -representing state: - -```java -if (mFoo != null) { - mFoo.doSomething(); -} -``` - -Additionally, mutator methods may need to check the state at runtime. For -example, lazy initialization often looks like this: - -```java -if (mFoo == null) { - mFoo = new Foo(...); -} -``` - -This is not bad in and of itself, if the states are well-defined and it's easy -to reason about the set of possible states by looking at the code. However, it -very, very quickly becomes difficult to reason about states when there are any -of the following: - -* **Multiple methods that can mutate state**. For example, a hypothetical - `Connection` class that reads and writes data over a socket might disconnect - on a socket error from any `read()` or `write()` call. That means that - before any `read()` or `write()` call, the state must be checked. (Real Java - objects will often use `Exception`s to short-circuit code blocks that enter - an exceptional state). -* **Methods that throw a runtime error** or have **undefined behavior when in - a certain state**. For example, a class with an `initialize()` method may - have methods that should only be called after `initialize()`, but the - compiler will not be able to check whether `initialize()` has been called. - This includes every method that has an `assert` statement on a mutable - instance variable. -* Multiple **states that interact with each other**. The number of states that - independently-mutable variables can take is the *product* of the number of - states of each of the variables. Often, variables are not strictly - independent (e.g. the only method that mutates a certain variable also - mutates another), so some states might be unreachable. However, it's **not - possible for the compiler to tell you which states are reachable** when - you're using mutable instance variables, so you have to figure that out - yourself! This makes it hard to exhaustively come up with unittest cases. - -## Motivating Example - -Consider this seemingly-simple task: you have two variables, `mA` and `mB`, each -of which could be either `null` or some real value of types `A` and `B`, -respectively. Furthermore, you want to initialize a new variable, `mC` of type -`C`, when the values of `mA` and `mB` are non-null, perhaps because the `C` -constructor takes an `A` and a `B`. Finally, if `mA` or `mB` becomes null again -after creating `mC`, reset `mC` to `null`. Also, you need to invoke a `close()` -method on `mC` whenever `mC` is reset. And if `mA` or `mB` changes while `mC` -exists, you need to call `mC.close()` and re-create `mC` with the new `mA` and -`mB`. - -```java -class MyClass { - private A mA = null; - private B mB = null; - private C mC = null; - - public void setA(A a) { - mA = a; - recalculateC(); - } - - public void setB(B b) { - mB = b; - recalculateC(); - } - - private void recalculateC() { - // This method is always called when A or B changes, so if C exists, it - // must first be reset. - if (mC != null) { - mC.close(); - mC = null; - } - if (mA != null && mB != null) { - mC = new C(mA, mB); - } - } -} -``` - -This may be fine on its own. But chances are, you will want to do something with -`mC` outside these methods. Every read will have to null-check, there's an -**undocumented but critical requirement** that every write to `mA` and `mB` is -done through `setA()` and `setB()`, and that `recalculateC()` is only called -when `mA` or `mB` is mutating, or else it will implicitly close. - -These undocumented dependencies can only be protected against regression by -testing. The compiler will not tell you if you made a mistake, so there must be -unittests covering every possible state change. And in this case, we have two -variables, each with two states that each have two possible state transitions, -so **8 test cases are needed to cover everything**. And this is the **simplest** -case of composing **two** independent nullable mutable variables. - -Meanwhile, if you use the `Observable`s framework: - -```java - -class MyClass { - private final Controller mA = new Controller<>(); - private final Controller mb = new Controller<>(); - - { - mA.and(mB).subscribe(Both.adapt(C::new)); - } - - public void setA(A a) { - mA.set(a); - } - - public void setB(B b) { - mB.set(b); - } -} -``` - -In the instance initializer, we set up a simple state machine with two -`Controller`s, which correspond to the mutable instance variables from the -previous example, and an event that observes the state of the `Controller`s and -invokes some logic on certain state changes. - -The `and()` call composes the `mA` and `mB`, returning a new `Observable` that -is only activated when *both* sources are activated, and then deactivated if -*either* source is deactivated. `mA` and `mB` are activated or deactivated by -`set()` and `reset()` calls, respectively. The `set()` method deactivates the -state if the argument is `null` (the `reset()` method can also be used to -deactivate the state). - -The `subscribe()` call makes it so that when the composed `Observable` formed by -`mA.and(mB)` is activated, a new `C` object will be created. When deactivated, -that `C` object's `close()` method will be called. - -This really does cover all the cases we need. If multiple `set*()` calls are -made, an implicit `reset()` call will be made to the relevant `Controller` and -the `C` object associated with the first scope will be `close()`d. - -What's better about this? First, notice we **don't need mutable variables**. -Both `Controller` objects are `final`, and are never `null`. We don't at any -point need to know what state the object is in inside any method -implementations; the `Controller`s and the pipeline set up by the `and()` and -`subscribe()` calls handle that for you. - -Second, notice how the concerns of mutating and reacting to state are **cleanly -separated**. The mutator methods `setA()` and `setB()` are concerned only with -their respective `Controller`s, and the lifetime of the `C` object is managed in -one place in the instance initializer. - -Finally, the relationship between the `A`, `B`, and `C` objects is -**self-documenting**. In the first approach with mutable variables, to -understand that the lifetime of `C` is associated with the intersection of the -lifetimes of `A` and `B`, one has to examine both setters and trace through -`recalculateC()` from the perspective of both of its call sites. In the second -approach, using `Controller`s, the relationship between `A`, `B`, and `C` is -expressed holistically in one line. - -## Observables and Observers - -Think of an `Observable` as a *container*, with one very important feature: the -ability to register **observers** that will be notified when the contents of the -container change. The contents of the container at a given time is the *state* -of the `Observable`. The `Observable` base class alone does not expose any state -mutators, but it provides ways to register events that will be invoked when -state changes. - -All state transitions of an `Observable` is either an *activation* or a -*deactivation*. An activation refers to putting some data into the container, -and a deactivation represents removing some data from the container. The data -that is contained in an `Observable` is thus called **activation data**. - -To register events that should be invoked on these state transitions, we -**subscribe** observers. An `Observer` works by opening a `Scope` when an -activation occurs. If a deactivation occurs, the `Scope` opened by the -`Observer` will be closed. The name **scope** comes from how its lifetime is the -time that the activation data exists within the `Observable`, similar to how -variables are *in scope* when using -[RAII](https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization) in -languages like C++. - -The one-to-one mapping of activations in an `Observable` to opened `Scopes` for -each subscribed `Observer` affords many useful properties. Foremost among these -is that the `Scope` can capture the data it is associated with as an *immutable* -variable: the activation data is the same when it is deactivated as when it was -activated. It also ensures that every deactivation requires an activation to -have occurred first (since you cannot `close()` an object that hasn't been -constructed). The implications of these properties will be explored further in -later sections. - -### Registering subscriptions with Observables - -To subscribe an `Observer` to an `Observable`, we call `subscribe()` -on the `Observable`. The `subscribe()` method takes a single argument, an -`Observer`, which has an `open()` method that returns a `Scope`. The -`Observer`'s `open()` method is called when the `Observable` activates, -and the resulting `Scope`'s `close()` method is called when the `Observable` -deactivates. - -Lambda syntax can be used to easily construct `Observer` objects without -much boilerplate. For instance, if we want to simply log the transitions of an -`Observable`, we might do it like this: - -```java -void logStateTransitions(Observable observable) { - observable.subscribe(x -> { - Log.d(TAG, "activated"); - return () -> Log.d(TAG, "deactivated"); - }); -}; -``` - -This is equivalent to the following, much more verbose version: - -```java -void logStateTransitions(Observable observable) { - observable.subscribe(new Observer() { - @Override - public Scope create(Object x) { - Log.d(TAG, "activated"); - return new Scope() { - @Override - public void close() { - Log.d(TAG, "deactivated"); - } - }; - } - }); -} -``` - -As you can see, the version that uses lambdas is much more readable, as long as -you understand what an `Observer` is. It can help to think of the `return () ->` -as a separator between what happens when the data is activated and what happens -when the data is deactivated. - -Either way, when `logStateTransitions()` is called on an `Observable`, -`"activated"` will be printed to the log when that `Observable` is activated, -and `"deactivated"` will be printed to the log when that `Observable` is -deactivated. - -Though the above `Observer` does not use the `x` parameter, normally -`Observer` implementations will use the data that `open()` is given, so -that the behavior of the scope can depend on what data the `Observable` is -activated with. - -Say we have an `Observable` and we want to log the data it is activated -with: - -```java -void logStateTransitionsWithData(Observable observable) { - observable.subscribe((String s) -> { - Log.d(TAG, "activated with data: %s", s); - return () -> Log.d(TAG, "deactivated"); - }); -} -``` - -### Mutating state with Controllers - -The `Observable` interface does not provide any way to directly change the state -of the `Observable`. However, subclasses of `Observable` exist that do provide -mutators. The `Controller` class provides `set()` and `reset()`. - -`Controller`s are basically nullable, mutable variables that let you register -callbacks, through the `Observable` interface, that are run when the variable -changes. - -With this in mind, the `set()` method on `Controller` is like setting a mutable -variable to a value. The `reset()` method is like setting the mutable variable -to `null`. - -Here are some guarantees that `Controller`s provide: - -* Start out in the *deactivated* state. -* If the parameter of `set()` is non-`null`, it enters the *activated* state. -* If the parameter of `set()` is `null`, it enters the *deactivated* state. -* If in the activated state, `reset()` and `set(null)` enter the *deactivated* - state. -* If already in the deactivated state, `reset()` and `set(null)` do nothing. -* If in the activated state with data `data1`, `set(data2)` no-ops if - `data1.equals(data2)`. -* If in the activated state, and the new data is not `equal()` to the current - data, `set()` implicitly deactivates and reactivates with the new data. - -As corollaries, any registered `Observer` objects will: - -* have their `open()` methods invoked *exactly once* for each non-`null` - `set()` call -* have their resulting `Scope`s `close()`d *exactly once* when `reset()` or - `set()` to `null` -* always clean up scopes from previous activations when new activations occur - -This means this: - -```java -void helloGoodbye(Controller message) { - message.set("hello"); - message.set("goodbye"); - message.set(null); -} -``` - -has the same behavior as this: - -```java -void helloGoodbye(Controller message) { - message.set("hello"); - message.reset(); - message.set("goodbye"); - message.reset(); -} -``` - -Essentially, a `Controller` adapts two states with two possible actions each: - -* `deactivated`: `set`, `reset` -* `activated`: `set`, `reset` - -into a well-defined state machine with two states and two transitions: - -* `deactivated`: `set` -* `activated`: `reset` - -... by dropping redundant `reset()` calls and inserting implicit `reset()` calls -between contiguous `set()` calls. This cuts the number of state transitions you -need to worry about in half! - -Since `Controller`s implement `Observable`, you can register `Observer` -objects with `subscribe()` the same way as in the previous section, or inject a -`Controller` into any method that takes an `Observable` of the same parametric -type. - -Remember that an `Observable` can be thought of as a *container* of data. In -this frame of mind, a `Controller` is a container of *one or zero* instances of -some data type. - -### Observables without data - -The state of a `Controller` is isomorphic to that of a nullable `T` variable -for all types `T`. But there are many cases where what we really want is a -representation of a boolean state: on or off, active or inactive, and don't need -any activation data. - -For these cases, the `org.chromium.chromecast.base.Unit` class is used to denote -the fact that there is no data associated with the controller. The `Unit` type -is inspired by the type of the same name in many functional programming -languages, and represents a type with only one possible instance (aka -`Singleton`). - -To make a controller without data, you can therefore use `Controller`. -Since `Unit` means "no data," and there's only one way to get a `Unit` instance -(through the `Unit.unit()` method), this maps correctly to the concept of a -mutable boolean value. - -Note that because the instance of `Unit` equals itself, calling `set()` on a -`Controller` when it is already activated will no-op, making the behavior -of `set(Unit.unit())` and `reset()` symmetric. - -Example: - -```java -{ - Controller onOrOff = new Controller<>(); - onOrOff.subscribe(x -> { - Log.d(TAG, "on"); - return () -> Log.d(TAG, "off"); - }); - onOrOff.set(Unit.unit()); // Turns on. - onOrOff.set(Unit.unit()); // Does nothing because it's already on. - onOrOff.reset(); // Turns off. - onOrOff.reset(); // Does nothing because it's already off. -} -``` - -It's common for observers and APIs that refer to `Observable`s with no data to -use `Observable` in their interface. This is an easy way to make an -`Observable`'s data "opaque" to observers, even when the data are not `Unit`. - -```java -{ - Controller foos = new Controller<>(); - // Subscribers to opaqueFoos will get notified of state changes, but will - // not be able to access the data through the Foo interface. - Observable opaqueFoos = foos; - // The observer can use methods like toString() that exist on all Objects, - // but cannot use Foo's API. - subscribe(opaqueFoos, x -> { - Log.d(TAG, "got Foo: %s", x.toString()); - return () -> Log.d(TAG, "lost Foo: %s", x.toString()); - }); -} -``` - -### Composing Observables with `and()` - -In the motivating example, we wanted to invoke a callback once *two* independent -`Observable`s have been activated. - -Let's say we have a set of states: - -* `A` -* `not A` - -With the transitions `not A` **<->** `A`. - -And introduce another set of states: - -* `B` -* `not B` - -With the transitions `not B` **<->** `B`. - -We can then describe the *combinations* of those state spaces with four states: - -* `neither` -* `just A` -* `just B` -* `A and B` - -...and eight transitions: - -* `neither` **<->** `just A` -* `neither` **<->** `just B` -* `just A` **<->** `A and B` -* `just B` **<->** `A and B` - -The `Observable` interface gives us a convenient way to get the `(A and B)` -state with a simple call: - -```java -public void logWhenBoth(Observable observableA, Observable observableB) { - observableA.and(observableB).subscribe(...); -} -``` - -The `and()` method takes the calling `Observable` and the given other -`Observable` and returns a new `Observable` that is only activated when *both* -input `Observable`s are activated. - -One way to think about it is that the `and()` call collapses the three states -`(neither)`, `(just A)`, and `(just B)` into one *deactivated* state, and -treats the state `both` as *activated*. For observers of the `and()`-composition -of states, one needs only worry about the two states, *deactivated* and -*activated*, same as with any other observer. - -So how do we get the data in the `subscribe()` call? Let's say we want to log -when both `Observable`s are activated: - -```java -public void logWhenBoth(Observable observableA, Observable observableB) { - observableA.and(observableB).subscribe((Both data) -> { - A a = data.first; - B b = data.second; - Log.d(TAG, "both activated: a=" + a + ", b=" + b); - return () -> Log.d(TAG, "deactivated"); - }); -} -``` - -The type of the activation data for an `and()`-composed `Observable` is `Both`. -The `Both` type has two generic parameters, and `first` and `second` public -fields to access the data it encapsulates. It is essentially a trick to box -multiple values into a single object, so we only ever need `Observer` -interfaces that take a single argument. - -Since the `and()` method returns an `Observable`, the result can itself call -`and()`, whose result can itself call `and()`, ad infinitum: - -```java - observableA.and(observableB).and(observableC).and(observableD)... -``` - -But beware, as the associated type of the `Observable` gets uglier and uglier: - -```java - a.and(b).and(c).and(d).subscribe((Both, C>, D> data) -> { - A aData = data.first.first.first; - B bData = data.first.first.second; - C cData = data.first.second; - D dData = data.second; - Log.d(TAG, "a=%s, b=%s, c=%s, d=%s", aData, bData, cData, dData); - return () -> Log.d(TAG, "exit"); - }); -``` - -One one hand, it's kind of neat that you can do that at all. But it does come at -a cost to readability. The compiler can catch you if you mess up the -`first.first.second` chains if the types are different, but it is regrettable -that this much work is required to read the compound data. Some methods for -alleviating this are described below. - -### Imposing order dependency with `andThen()` - -The composition of state spaces `stateA.and(stateB)` doesn't care if `stateA` or -`stateB` was activated first, so it can be activated by either activating -`stateA` and then `stateB`, or by activating `stateB` and then `stateA`. - -This means the state `(A and B)`, extracted by the `and()` method on -`Observable`, is too ambiguous for knowing the *order* of activation. If we want -to know whether `A` was activated before `B`, we must *partition* the state -`(A and B)` into `(A and then B)` and `(B and then A)`. The time-dependent state -space for two boolean variables looks like this, with five states: - -* `neither` -* `just A` -* `just B` -* `A and then B` -* `B and then A` - -...and ten transitions: - -* `neither` **<->** `just A` -* `neither` **<->** `just B` -* `just A` **<->** `A and then B` -* `just B` **<->** `B and then A` -* `A and then B` **-->** `just B` -* `B and then A` **-->** `just A` - -Calling `stateA.andThen(stateB)` returns an `Observable` representing the -`(A and then B)` state from above. The resulting `Observable` will only activate -on the transition between `(just A)` and `(A and then B)`, and will not activate -on the transition between `(just B)` and `(B and then A)`. - -### Subscriptions as Scopes - -Sometimes you might want to only `subscribe()` to an `Observable` for a limited -time, for instance, until some other `Observable` is activated. So how do you -remove an observer? - -The `subscribe()` method returns a `Subscription`, which, when `close()`d, will -unregister the `Observer` registered in the `subscribe()` call. To `subscribe()` -for a limited time, simply store the `Subscription` somewhere, and call -`close()` on it when you're done. - -```java - private final Observable mMessages = ...; - private final List mLog = ...; - private Subscription mSubscription = null; - - public void startRecording() { - if (mObserver != null) stopRecording(); - mObserver = mMessages.subscribe(Observers.onEnter(mLog::add)); - } - - public void stopRecording() { - if (mSubscription == null) return; - mSubscription.close(); - } -``` - -... wait a minute, are those `null`-checks? And a *mutable variable*? I thought -this framework was supposed to get rid of those! - -And indeed we can! Since `mObserver` is a `Subscription`, which is a kind of -`Scope`, that means we can use it in another `subscribe()` call! - -```java - private final Observable mMessages = ...; - private final List mLog = ...; - private final Controller mRecordingState = ...; - - { - // When mRecordingState is activated, an Observer is registered to - // mMessages. - mRecordingState.subscribe(x -> { - // When mRecordingState is deactivated, the Subscription is closed, - // so new messages will stop being added to the log. - return mMessages.subscribe(Observers.onEnter(mLog::add)); - }); - } - - public void startRecording() { - mRecordingState.set(Unit.unit()); - } - - public void stopRecording() { - mRecordingState.reset(); - } -``` - -Now we have removed the mutable variable and delegated all management of state -to `Observable`s. - -But wait, we could have done the same thing with `and()`: - -```java - { - mRecordingState.and(mMessages).subscribe(Observers.onEnter( - (Both data) -> mLog.add(data.second))); - } -``` - -But here we can see the drawbacks of that approach. We need to deconstruct the -`Both` object. Though the below section shows a way to circumvent that when only -using a single `and()` call, it gets much harder to work with longer chains of -`and()`-composed `Observable`s. - -Recall that deconstructing larger `Both` trees is ugly: - -```java - stateA.and(stateB).and(stateC).and(stateD).subscribe(data -> { - A a = data.first.first.first; - B b = data.first.first.second; - C c = data.first.second; - D d = data.second; - ... - }); -``` - -If we only care about registering a `Scope` for when all four `Observable`s are -activated, then we can use nested `subscribe()` calls instead: - -```java - stateA.subscribe(a -> stateB.subscribe(b -> stateC.subscribe(c -> stateD.subscribe(d -> { - ... - })))); -``` - -This is called **subscription-currying**, and is a useful alternative to `and()` -calls when registering `Observer` objects for the intersection of many -`Observable`s. - -To show why this works, let's simplify to just this: - -```java - stateA.subscribe(a -> stateB.subscribe(b -> ...)); -``` - -Notice that: - -* We do not `subscribe` to `stateB` until `stateA` is activated. -* If `stateB` is already activated when an `Observer` is subscribed to it, the - observer will be notified of the data immediately. -* While `stateA` is activated, the `Observer` subscribed to `stateB` will open - and close its scopes normally as `stateB` mutates. -* If `stateA` is deactivated, the `Subscription` to `stateB` is closed. Closing - a `Subscription` also closes the `Scope`s from the `Observer`. - -In other words, the inner `Observer` is only opened if *both* `stateA` and -`stateB` are activated, and that `Observer`'s `Scope` will be closed if *either* -`stateA` or `stateB` is deactivated. This is the same as the `and()` operator! - -This even works for `Observable`s that have multiple activations. Each -activation of `stateA` will produce a unique `Subscription` to `stateB`, so this -pattern can be compared to a nested `for` loop -- one that operates reactively -whenever the states update! More precisely, there will be a 1:1 mapping of the -Cartesian product of activations of `stateA` and `stateB` and `Scopes` from the -inner `Observer` subscribed to `stateB`. - -One should use the `and()` operator when more operations like `map()` and -`filter()` are needed on the resulting `Observable`, but subscription-currying -can be used in some other situations as an alternative in situations where -dealing with `Both` objects becomes cumbersome. It is generally recommended to -prefer the `and()` operator if all else is equal, because it's easier to add -more operators to the pipeline later on if needed. - -An alternative to using `and()` in situations that call for `map()` and -`filter()` on the result is to use `flatMap()`-currying: - -```java - stateA.flatMap(a -> stateB.flatMap(b -> Observable.just(new C(a, b)))) - .filter(c -> isValid(c)) - .subscribe(d -> ...); -``` - -### Increase readability for Observers with wrapper methods - -The `Observers` class contains several helper methods to increase the -fluency and readability of common cases that `Observer` objects might be -used for. - -#### Use onOpen() and onClose() to observe only one kind of transition - -Every `Observer` returns a `Scope`, but sometimes clients do not care about -when the state deactivates, only when it activates. It's possible to create a -`Observer` with lambda syntax to do the job like this: - -```java -{ - observable.subscribe((String data) -> { - Log.d(TAG, "activated: data=" + data); - return () -> {}; - }); -} -``` - -The `return () -> {};` statement in the lambda corresponds to having no -side-effects to handle the destructor, but this is not very readable. - -To make intentions clearer, the `onOpen()` method can wrap any `Consumer` of -the activation data's type: - -```java -{ - // Without data. - observable.subscribe(Observer.onOpen(x -> Log.d(TAG, "activated"))); - // With data. - observable.subscribe(Observer.onOpen((String data) -> { - Log.d(TAG, "activated: data=" + data); - })); -} -``` - -Likewise, `onClose()` is used the same way to transform any `Consumer` of the -activation data's type into a `Observer` that only has side effects when the -`Observable` is deactivated. - -#### Deconstructing Both objects - -When you use the `and()` method on `Observable` to create an `Observable`, -recall that the `Observer` passed to `subscribe()` must look like this: - -```java -{ - observableA.and(observableB).subscribe((Both data) -> { - A a = data.first; - B b = data.second; - Log.d(TAG, "on enter: a = " + a + "; b = " + b); - return () -> Log.d(TAG, "on exit: a = " + a + "; b = " + b); - }); -} -``` - -`Observers` provides a helper method to turn any function that takes two -arguments and returns a `Scope` into a `Observer`, which deconstructs -the `Both` object for you and passes the constituent parts into the function. - -Using `Both.adapt()`, we can rewrite the above like this: - -```java -{ - observableA.and(observableB).subscribe(Both.adapt((A a, B b) -> { - Log.d(TAG, "on enter: a = " + a + "; b = " + b); - return () -> Log.d(TAG, "on exit: a = " + a + "; b = " + b); - })); -} -``` - -When using `onEnter()` or `onExit()`, which take `Consumer`s of the data type, -it can be useful to use `Both.adapt` on a `BiConsumer` to turn it into a -`Consumer`. - -```java -{ - // Before: - Observable> both = observableA.and(observableB); - both.subscribe(Observers.onEnter((Both data) -> { - Log.d(TAG, "on enter: a = " + data.first + "; b = " + data.second); - })); - both.subscribe(Observers.onExit((Both data) -> { - Log.d(TAG, "on exit: a = " + data.first + "; b = " + data.second); - })); - // After: - both.subscribe(Observers.onEnter(Both.adapt((A a, B b) -> { - Log.d(TAG, "on enter: a = " + a + "; b = " + b); - }))); - both.subscribe(Observers.onExit(Both.adapt((A a, B b) -> { - Log.d(TAG, "on exit: a = " + a + "; b = " + b); - }))); -} -``` - -The `Both.adapt()` helpers are also able to turn `BiFunction`s into -`Function` objects and `BiPredicate`s into `Predicate` objects, -which makes them useful when using `map()` and `filter()` operators on -`Observable` objects. - -```java -{ - both.map(Both.adapt((A a, B b) -> { - return new ThingBuilder().setA(a).setB(b).build(); - })); - both.filter(Both.adapt((A a, B b) -> a.contains(b))); -} -``` - -## Data flow - -There are numerous instances where one may want to take the activation data of -some `Observable` and use it to set the state of a `Controller`, and reset that -`Controller` when the `Observable` is deactivated. A shortcut to doing this -without having to instantiate any `Controller` is provided with the `map()` -method in the `Observable` interface. - -For example, we might have an `Activity` that overrides `onNewIntent()`, and -extracts some data from the `Intent` it receives. We might want to register -observers on the extracted data rather than the `Intent` itself, as some work -needs to be done to unparcel the data we care about from the `Intent`. - -```java -public class MyActivity extends Activity { - private final Controller mIntentState = new Controller<>(); - - { - Observable uriState = mIntentState.map(Intent::getData); - Observable instanceIdState = uriState.map(Uri::getPath); - ... - } - - public void onCreate() { - super.onCreate(); - mIntentState.set(getIntent()); - } - - public void onNewIntent(Intent intent) { - super.onNewIntent(intent); - mIntentState.set(intent); - } -} -``` - -The `map()` method takes any function on the `Observable`'s activation data and -creates a new `Observable` of the result of that function applied to the -original `Observable`'s activation data. So the activation lifetime of -`uriState` and `instanceIdState` are the same as `mIntentState` in this example. - -The instance initializer can then call `subscribe()` on `uriState` or -`instanceIdState` to register callbacks for when we get a new URI or instance -ID, and the process of extracting the URI from the `Intent` and the instance ID -from the `Uri` is delegated to methods with no side-effects. - -### Handling null - -If a function provided to a `map()` method returns `null`, then the resulting -`Observable` will be put in a deactivated state, even if the source `Observable` -is activated. This can be used to **filter** invalid data from `Observable`s in -the pipeline: - -```java -{ - mIntentState.map(Intent::getExtras) - .map((Bundle bundle) -> bundle.getString(INTENT_EXTRA_FOO)) - .subscribe((String foo) -> ...); -} -``` - -The `bundle.getString()` call might return `null` if the source `Intent` does -not have the correct extra data field set. When this happens, the resulting -`Observable` simply does not activate, so the `Observer` registered in the -`subscribe()` call does not need to worry that `foo` might be `null`. - -### Filtering data - -One may wish to construct an `Observable` that is only activated if some -*predicate* on some other `Observable`'s activation data is true. This is easily -done using the `filter()` method on `Observable`. - -This example will only log `"Got FOO intent"` if `mIntentState` was `set()` with -an `Intent` with action `"org.my.app.action.FOO"`: - -```java -{ - String ACTION_FOO = "org.my.app.action.FOO"; - mIntentState.map(Intent::getAction) - .filter(ACTION_FOO::equals) - .subscribe(Observers.onEnter(action -> { - Log.d(TAG, "Got FOO intent"); - })); -} -``` - -Since `Observable#filter()` takes any `Predicate`, which is a functional -interface whose method takes a `T` and returns a `boolean`, the parameter can be -an instance of a class that implements `Predicate`: - -```java - class InRangePredicate implements Predicate { - private final int mMin; - private final int mMax; - - private InRangePredicate(int min, int max) { - mMin = min; - mMax = max; - } - - @Override - public boolean test(Integer value) { - return mMin <= value && value <= mMax; - } - } - - InRangePredicate inRange(int min, int max) { - return new InRangePredicate(min, max); - } - - Controller hasIntState = new Controller<>(); - Observable hasValidIntState = hasIntState.filter(inRange(0, 10)); -``` - -... or a method reference for a method that takes the activation data and -returns a boolean: - -```java - class Util { - static boolean inRange(int i) { - return 0 <= i && i <= 10; - } - } - Controller hasIntState = new Controller<>(); - Observable hasValidIntState = hasIntState.filter(Util::inRange); -``` - -... or a lambda that takes the activation data and returns a boolean: - -```java - Controller hasIntState = new Controller<>(); - Observable hasValidIntState = - hasIntState.filter(i -> 0 <= i && i <= 10); -``` - -## Tips and best practices - -### Construct the pipeline before modifying it - -Consider this code: - -```java - Controller c = new Controller<>(); - c.set("hi"); - c.reset(); - c.subscribe(Observers.onEnter(s -> Log.d(TAG, s))); -``` - -Will the callback registered in the `subscribe()` call get fired? It turns out -that it will not, since `c` is deactivated when `subscribe()` is called. But if -the `subscribe()` call is made before the `set()` call, then the callback is -fired. - -Sometimes this is what you want, but it's best to avoid any ambiguity like this. -Generally, `Observable` methods like `subscribe()` should be called before any -`Controller` methods. A couple of things that one can do to help with this: - -* Instantiate `Controller` objects in field initializers, not the constructor. -* Set up the pipeline (`subscribe()`, `and()`, `map()`, etc.) in an instance - initializer. This is run before anything else when creating an instance, - including the constructor, and is the same regardless of which constructor - is being used. This also removes the potential of accidentally depending on - constructor parameters or mutable instance variables in the pipeline, which - can be dangerous compared to adapting them to `Observable`s. -* In the instance initializer, `Observable`s composed from other `Observable`s - can usually be local variables rather than instance variables. This prevents - code outside the initializer from `subscribe()`ing these `Observable`s after - the instance has been initialized. -* Do not call `Controller` mutator methods (`set()` or `reset()`) inside the - instance initializer. They may be called in the constructor or any instance - methods. -* Alternatively, the concerns of creating the pipeline and adapting function - calls to state changes of `Controller`s can be separated by using a factory - function. - -### Manipulating state inside observers - -What happens here? - -```java - Controller c = new Controller<>(); - c.subscribe(x -> { - Log.d(TAG, "enter"); - c.reset(); - return () -> Log.d(TAG, "exit"); - }); - c.set("ding"); -``` - -Here, we `reset()` the same `Controller` in an activation observer for that very -`Controller`! - -This is in fact safe, though there should be few places you need to do something -like this. Currently, `Controller`s notify all observers synchronously on the -thread that `set()` or `reset()` was called in (so they are not thread safe), -but if an observer calls `set()` or `reset()` again while observers are still -being notified, the `set()` or `reset()` call gets queued and handled only after -all observers have been notified. This allows a deterministic and unastonishing -order of execution for the above example: the log will show "enter", followed -immediately by "exit". - -We call this property *re-entrancy safety*. `Controller`s are *re-entrant-safe*. -What this guarantees is that all observers are notified of all changes, and any -observer that imposes its own change (including indirect changes) will not have -that change take effect until all observers are notified of the current change. - -Note that if you `set()` a controller with a value that is never `null` inside -an activation handler, **you will get an infinite loop**. - -```java - Controller c = new Controller<>(); - c.subscribe(Observers.onEnter(x -> c.set(x + 1))); // Danger! - c.set(0); // Infinite loop! -``` - -Whenever the `Controller` is set with a value, the observing scope immediately -sets it with a new value, recurring infinitely. - -It's possible to still be safe if you can guarantee that `set()` isn't called or -`set(null)` is called in some base case for all recursive stacks of activation -handlers, but if you do that, it's *your* job to solve the halting problem. - -It is good practice to avoid calling `set()` or `reset()` on `Controller`s -inside `Observer` event handlers altogether, but there are many safe ways -that are useful. - -### Testing - -One of the most important aspects of using `Observable`s is that they are very -testable. Although `Observer`s themselves are not pure-functional (i.e. they -tend to mutate program state), this is done in such a way that the mutations in -the form of state transitions in `Observable`s are easy to track, and therefore -easy to test. - -If you write a class that implements `Observable` or returns an `Observable` in -one of its methods, it's easy to test the events it emits by using the -`ReactiveRecorder` test utility module. This class, which is only allowed in -tests, provides a fluent interface for describing the expected output of an -`Observable`. - -To use this in your tests, add `//chromecast/base:cast_base_test_utils_java` to -your JUnit test target's GN `deps`. - -As an example, imagine we want to test a class called `FlipFlop`, which -implements `Observable` and changes from deactivated to activated every time its -`flip` method is called. The tests might look like this: - -```java -import org.chromium.chromecast.base.ReactiveRecorder; -... // other imports -public class FlipFlopTest { - @Test - public void testStartsDeactivated() { - FlipFlop f = new FlipFlop(); - ReactiveRecorder recorder = ReactiveRecorder.record(f); - // No events should be emitted. - recorder.verify().end(); - } - - @Test - public void testFlipOnceActivatesObserver() { - FlipFlop f = new FlipFlop(); - ReactiveRecorder recorder = ReactiveRecorder.record(f); - f.flip(); - // A single activation should have been emitted. - recorder.verify().opened(Unit.unit()).end(); - } - - @Test - public void testFlipTwiceActivatesThenDeactivates() { - FlipFlop f = new FlipFlop(); - ReactiveRecorder recorder = ReactiveRecorder.record(f); - f.flip(); - f.flip(); - // Expect an activation followed by a deactivation. - recorder.verify().opened(Unit.unit()).closed(Unit.unit()).end(); - } -} -``` - -The `ReactiveRecorder` class works by calling `subscribe()` on the given -`Observable` and storing the activations and deactivations it observes in a -list. The `verify()` method opens a domain-specific language for performing -assertions on the activation data, using `opened()` and `closed()` to check -which data has been activated and deactivated. The transitions recorded must -occur in the same order as the `opened()` and `closed()` calls to pass the test. -The `end()` method asserts that no more transitions occurred. - -You can test behaviors that should occur when closing a `subscribe()` scope by -calling `recorder.unsubscribe()`. For example, every `Observable` implementation -should close all existing `Scopes` emitted from an `Observer` when that -`Observer`'s `subscribe()` scope is closed: - -```java - @Test - public void testUnsubscribeCloses() { - FlipFlop f = new FlipFlop(); - ReactiveRecorder recorder = ReactiveRecorder.record(f); - f.flip(); - // Clear the record; we don't care about the activation from flip(). - recorder.reset(); - recorder.unsubscribe(); - // Unsubscribing should implicitly close the scope. - recorder.verify().closed(Unit.unit()).end(); - } -``` - -Once a `ReactiveRecorder` unsubscribes, it will not get any new events from the -`Observable` it was recording. - -### Debugging - -Sometimes, particularly in long chains of `and()` or `andThen()` or `map()` or -`filter()`, you might get confused about the ultimate state of the system in -some circumstances. When confused about these complex `Observable`s, it's often -helpful to use the `debug()` operator: - -```java - // Before - foos.andThen(bars).subscribe(...); - // After - foos.debug(msg -> Log.d(TAG, "foos: %s", msg)) - .andThen(bars.debug(msg -> Log.d(TAG, "bars: %s", msg))) - .debug(msg -> Log.d(TAG, "foosAndThenBars: %s", msg)) - .subscribe(...); -``` - -The `debug()` operator doesn't by itself log anything; you need to give it a -`Consumer` that logs the debug messages it generates. This makes the -file/line number information in the log is more helpful, as it indicates which -file you're debugging, rather than the body of the `debug()` operator itself. - -The messages in question will show when `Observer`s subscribe and unsubscribe, -and whenever data are added or removed from the `Observable`. The `debug()` -operator will call the `toString()` method on all data to format messages about -state transitions. - -## When to use Observables - -`Observable`s and `Controller`s are intended to succinctly adapt common Android -SDK method pairs, whether they're callbacks for entering and exiting a state, or -mutators to perform state changes, into a common pattern that better separates -concerns and is composable. - -### Replace mutable, nullable variables - -Every mutable, nullable variable is a variable that you constantly have to -null-check before using. A `Controller` can be used to refactor these variables -into a `final` `Controller`. - -The important insight is that you tend to only read a variable when state -changes, either after the variable itself is known to change, or when some other -state changes. - -First, let's consider an Activity that registers a `BroadcastReceiver` in -`onStart()` and unregisters the `BroadcastReceiver` in `onStop()`. - -We will ignore for now that Android tries to guarantee that pathological call -sequences like multiple `onStart()`s in a row or an `onStop()` before the first -`onStart()` will not occur, because these guarantees are not known to the Java -compiler and similar guarantees can't be relied on for all events. - -```java -class MyActivity extends Activity { - private BroadcastReceiver mReceiver = null; - - @Override - public void onStart() { - super.onStart(); - if (mReceiver != null) - unregisterReceiver(mReceiver); - mReceiver = new BroadcastReceiver(...); - registerReceiver(mReceiver); - } - - @Override - public void onStop() { - if (mReceiver != null) - unregisterReceiver(mReceiver); - mReceiver = null; - super.onStop(); - } -} -``` - -Without the assumption that Android will call `onStart()` and `onStop()` in -reasonable orders, we need to check the state of the `mReceiver` variable each -time before it is used. And making that assumption is prone to backfiring, as -it's a recipe for `NullPointerException`s, `IllegalStateException`s, and other -horrors in general practice. - -Here's the refactored version that uses a `Controller`: - -```java -class MyActivity extends Activity { - private final Controller mStartedState = new Controller<>(); - - { - mStartedState.subscribe(x -> { - final BroadcastReceiver receiver = new BroadcastReceiver(...); - registerReceiver(receiver); - return () -> unregisterReceiver(receiver); - }); - } - - @Override - public void onStart() { - super.onStart(); - mStartedState.set(Unit.unit()); - } - - @Override - public void onStop() { - mStartedState.reset(); - super.onStop(); - } -} -``` - -The refactored version better separates concerns. `BroadcastReceiver` -registration and unregistration is handled in a small area of the code, rather -than spread throughout the class, and the `BroadcastReceiver` doesn't need to be -stored in a mutable variable. *No code outside the scope in which the -`BroadcastReceiver` object is relevant can touch it*, and the `onStart()` and -`onStop()` methods have no logic except toggling the `Controller` that -represents whether the `Activity` is started. Best of all, there are no `null` -checks, and no need for any. - -### Asynchronous initialization - -Some methods run asynchronously and take a callback that is run when the work is -complete. We can `set()` `Controller`s in such callbacks to adapt this pattern -to `Observable`s, which can be used to create asynchronous initialization -pipelines. - -This example shows how one can link up the outputs of multiple asynchronous -functions that use the callback-passing style using `Controller`s, and -encapsulating the complicated setup into a single function that returns an -`Observable`. - -```java -public class AsyncExample { - private static final String TAG = "AsyncExample"; - - // Adapts the callback-style asynchronous Baz function to an Observable. - // Shows how a - public static Observable createBazDefault() { - // Begin constructing a Foo. - Controller fooState = new Controller<>(); - // Set the fooState controller when created, reset on errors. - Foo.createAsync(fooState::set, fooState::reset); - // Bar requires Foo to initialize. - Controller barState = new Controller<>(); - fooState.subscribe((Foo foo) -> { - Bar.createAsync(foo, barState::set); - // If fooState is reset, then barState is also reset. - return barState::reset; - }); - // Baz requires Foo and Bar to initialize. - Controller bazState = new Controller<>(); - fooState.and(barState).subscribe(Observers.both((Foo foo, Bar bar) -> { - Baz.createAsync(foo, bar, bazState::set); - // If fooState or barState is reset, then bazState is also reset. - return bazState::reset; - })); - return bazState; - } - - public static void demo() { - Observable bazState = createBazDefault(); - bazState.subscribe(Observers.onEnter((Baz baz) -> { - // This runs when the full initialization pipeline is complete. - Log.d(TAG, "Baz created!"); - })); - } - - public static class Foo { - static void createAsync(Consumer callback, Runnable onError) {...} - } - - public static class Bar { - static void createAsync(Foo foo, Consumer callback) {...} - } - - public static class Baz { - static void createAsync(Foo foo, Bar bar, Consumer callback) {...} - } -} -``` - -This way, `Observable`s can be used similarly to `Promise`s, where a callback -handling the underlying value can be registered before the underlying value is -available. But unlike `Promise`s, `Observable`s provide a way to also handle -teardowns, and to transitively tear down everything down stream when something -is torn down. diff -Nru chromium-132.0.6834.110/chromecast/base/scoped_temp_file.cc chromium-132.0.6834.159/chromecast/base/scoped_temp_file.cc --- chromium-132.0.6834.110/chromecast/base/scoped_temp_file.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/scoped_temp_file.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,37 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/scoped_temp_file.h" -#include "base/check.h" -#include "base/files/file_util.h" - -namespace chromecast { - -ScopedTempFile::ScopedTempFile() { - CHECK(base::CreateTemporaryFile(&path_)); -} - -ScopedTempFile::~ScopedTempFile() { - if (FileExists()) { - CHECK(base::DeleteFile(path_)); - } -} - -bool ScopedTempFile::FileExists() const { - return base::PathExists(path_); -} - -bool ScopedTempFile::Write(const std::string& str) { - CHECK(FileExists()); - return base::WriteFile(path_, str); -} - -std::string ScopedTempFile::Read() const { - CHECK(FileExists()); - std::string result; - CHECK(ReadFileToString(path_, &result)); - return result; -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/scoped_temp_file.h chromium-132.0.6834.159/chromecast/base/scoped_temp_file.h --- chromium-132.0.6834.110/chromecast/base/scoped_temp_file.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/scoped_temp_file.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,48 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_SCOPED_TEMP_FILE_H_ -#define CHROMECAST_BASE_SCOPED_TEMP_FILE_H_ - -#include - -#include "base/files/file_path.h" - -namespace chromecast { - -// Creates a temporary file that is deleted when this object is destroyed, -// unless the underlying file has been moved or deleted. -// Warning: This class uses CHECKs, and should only be used for testing. -class ScopedTempFile { - public: - ScopedTempFile(); - - ScopedTempFile(const ScopedTempFile&) = delete; - ScopedTempFile& operator=(const ScopedTempFile&) = delete; - - ~ScopedTempFile(); - - // Return the path to the temporary file. Note that if the underlying file has - // been moved or deleted, this will still return the original path. - base::FilePath path() const { return path_; } - - // Returns true if the underlying file exists, false otherwise. This will - // return false, for example, if the file has been moved or deleted. - bool FileExists() const; - - // Write the contents of |str| to the file. Returns the whether all the - // contents were written to the file. CHECKs that FileExists() returns true. - bool Write(const std::string& str); - - // Read the file and return the contents. CHECKs that FileExists() returns - // true. - std::string Read() const; - - private: - base::FilePath path_; -}; - -} // namespace chromecast - -#endif // CHROMECAST_BASE_SCOPED_TEMP_FILE_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/statistics/weighted_mean.cc chromium-132.0.6834.159/chromecast/base/statistics/weighted_mean.cc --- chromium-132.0.6834.110/chromecast/base/statistics/weighted_mean.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/statistics/weighted_mean.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,35 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/statistics/weighted_mean.h" - -#include - -namespace chromecast { - -WeightedMean::WeightedMean() = default; - -void WeightedMean::Reset() { - weighted_mean_ = 0.0; - variance_sum_ = 0.0; - sum_weights_ = 0.0; - sum_squared_weights_ = 0.0; -} - -void WeightedMean::AddDelta(double delta, double weight) { - double old_sum_weights = sum_weights_; - sum_weights_ += weight; - // Use std::abs() to handle negative weights (ie, removing a sample). - sum_squared_weights_ += weight * std::abs(weight); - if (sum_weights_ == 0) { - weighted_mean_ = 0; - variance_sum_ = 0; - } else { - double mean_change = delta * weight / sum_weights_; - weighted_mean_ += mean_change; - variance_sum_ += old_sum_weights * delta * mean_change; - } -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/statistics/weighted_mean.h chromium-132.0.6834.159/chromecast/base/statistics/weighted_mean.h --- chromium-132.0.6834.110/chromecast/base/statistics/weighted_mean.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/statistics/weighted_mean.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,45 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_STATISTICS_WEIGHTED_MEAN_H_ -#define CHROMECAST_BASE_STATISTICS_WEIGHTED_MEAN_H_ - -#include - -namespace chromecast { - -// Calculates the weighted mean (and variance) of a set of values. Values can be -// added to or removed from the mean. -class WeightedMean { - public: - WeightedMean(); - - double weighted_mean() const { return weighted_mean_; } - // The weighted variance should be calculated as variance_sum()/sum_weights(). - double variance_sum() const { return variance_sum_; } - double sum_weights() const { return sum_weights_; } - double sum_squared_weights() const { return sum_squared_weights_; } - - // Adds |value| to the mean if |weight| is positive. Removes |value| from - // the mean if |weight| is negative. Has no effect if |weight| is 0. - template - void AddSample(T value, double weight) { - AddDelta(value - weighted_mean_, weight); - } - - // Resets to initial state. - void Reset(); - - private: - void AddDelta(double delta, double weight); - - double weighted_mean_ = 0.0; - double variance_sum_ = 0.0; - double sum_weights_ = 0.0; - double sum_squared_weights_ = 0.0; -}; - -} // namespace chromecast - -#endif // CHROMECAST_BASE_STATISTICS_WEIGHTED_MEAN_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/statistics/weighted_moving_average.cc chromium-132.0.6834.159/chromecast/base/statistics/weighted_moving_average.cc --- chromium-132.0.6834.110/chromecast/base/statistics/weighted_moving_average.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/statistics/weighted_moving_average.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,56 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/statistics/weighted_moving_average.h" - -#include - -#include "base/check_op.h" - -namespace chromecast { - -WeightedMovingAverage::WeightedMovingAverage(int64_t max_x_range) - : max_x_range_(max_x_range) { - DCHECK_GE(max_x_range_, 0); -} - -WeightedMovingAverage::~WeightedMovingAverage() {} - -void WeightedMovingAverage::AddSample(int64_t x, int64_t y, double weight) { - DCHECK_GE(weight, 0); - if (!samples_.empty()) - DCHECK_GE(x, samples_.back().x); - - Sample sample = {x, y, weight}; - samples_.push_back(sample); - mean_.AddSample(y, weight); - - // Remove old samples. - while (x - samples_.front().x > max_x_range_) { - const Sample& old_sample = samples_.front(); - mean_.AddSample(old_sample.y, -old_sample.weight); - samples_.pop_front(); - } - DCHECK(!samples_.empty()); -} - -bool WeightedMovingAverage::Average(int64_t* average, double* error) const { - if (samples_.empty() || mean_.sum_weights() == 0) - return false; - - *average = static_cast(round(mean_.weighted_mean())); - - const double effective_sample_size = - mean_.sum_weights() * mean_.sum_weights() / mean_.sum_squared_weights(); - const double variance = mean_.variance_sum() / mean_.sum_weights(); - *error = sqrt(variance / effective_sample_size); - return true; -} - -void WeightedMovingAverage::Clear() { - samples_.clear(); - mean_ = WeightedMean(); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/statistics/weighted_moving_average.h chromium-132.0.6834.159/chromecast/base/statistics/weighted_moving_average.h --- chromium-132.0.6834.110/chromecast/base/statistics/weighted_moving_average.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/statistics/weighted_moving_average.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,62 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_STATISTICS_WEIGHTED_MOVING_AVERAGE_H_ -#define CHROMECAST_BASE_STATISTICS_WEIGHTED_MOVING_AVERAGE_H_ - -#include -#include - -#include "chromecast/base/statistics/weighted_mean.h" - -namespace chromecast { - -// Calculates the weighted moving average of recent points. The points -// do not need to be evenly distributed on the X axis, but the X coordinate -// is assumed to be generally increasing. -// -// Whenever a new sample is added using AddSample(), old samples whose -// x coordinates are farther than |max_x_range_| from the new sample's -// x coordinate will be removed from the average. Note that |max_x_range_| -// must be non-negative. -class WeightedMovingAverage { - public: - explicit WeightedMovingAverage(int64_t max_x_range); - - WeightedMovingAverage(const WeightedMovingAverage&) = delete; - WeightedMovingAverage& operator=(const WeightedMovingAverage&) = delete; - - ~WeightedMovingAverage(); - - int64_t max_x_range() const { return max_x_range_; } - // Returns the current number of samples that are in the weighted average. - size_t num_samples() const { return samples_.size(); } - - // Adds an (x, y) sample with the provided weight to the average. - // |weight| should be non-negative. - void AddSample(int64_t x, int64_t y, double weight); - - // Gets the current average and standard error. - // Returns |true| if the average exists, |false| otherwise. If the average - // does not exist, |average| and |error| are not modified. - bool Average(int64_t* average, double* error) const; - - // Clears all current samples from the moving average. - void Clear(); - - private: - struct Sample { - int64_t x; - int64_t y; - double weight; - }; - - const int64_t max_x_range_; - std::deque samples_; - WeightedMean mean_; -}; - -} // namespace chromecast - -#endif // CHROMECAST_BASE_STATISTICS_WEIGHTED_MOVING_AVERAGE_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/statistics/weighted_moving_average_unittest.cc chromium-132.0.6834.159/chromecast/base/statistics/weighted_moving_average_unittest.cc --- chromium-132.0.6834.110/chromecast/base/statistics/weighted_moving_average_unittest.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/statistics/weighted_moving_average_unittest.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,148 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include - -#include "chromecast/base/statistics/weighted_moving_average.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace chromecast { - -TEST(WeightedMovingAverageTest, NoSamples) { - WeightedMovingAverage averager(0); - - int64_t avg = 12345; - double error = 12345.0; - EXPECT_FALSE(averager.Average(&avg, &error)); - EXPECT_EQ(12345, avg); - EXPECT_EQ(12345.0, error); -} - -TEST(WeightedMovingAverageTest, ZeroWeight) { - WeightedMovingAverage averager(0); - for (int s = 1; s <= 5; ++s) - averager.AddSample(0, s, 0.0); - - int64_t avg = 12345; - double error = 12345.0; - EXPECT_FALSE(averager.Average(&avg, &error)); - EXPECT_EQ(12345, avg); - EXPECT_EQ(12345.0, error); -} - -TEST(WeightedMovingAverageTest, AverageOneValue) { - int64_t value = 1; - - WeightedMovingAverage averager(0); - averager.AddSample(0, value, 1.0); - - int64_t avg = 0; - double error = 1.0; - EXPECT_TRUE(averager.Average(&avg, &error)); - EXPECT_EQ(value, avg); - EXPECT_EQ(0.0, error); -} - -TEST(WeightedMovingAverageTest, AverageSeveralUnweightedValues) { - WeightedMovingAverage averager(0); - for (int s = 1; s <= 5; ++s) - averager.AddSample(0, s, 1.0); - - int64_t avg = 0; - double error = 0; - EXPECT_TRUE(averager.Average(&avg, &error)); - EXPECT_EQ(3, avg); - EXPECT_NEAR(sqrt(2) / sqrt(5), error, 1e-9); -} - -TEST(WeightedMovingAverageTest, Clear) { - WeightedMovingAverage averager(0); - for (int s = 1; s <= 5; ++s) - averager.AddSample(0, s, 1.0); - - int64_t avg = 0; - double error = 0; - EXPECT_TRUE(averager.Average(&avg, &error)); - EXPECT_EQ(3, avg); - EXPECT_NEAR(sqrt(2) / sqrt(5), error, 1e-9); - - averager.Clear(); - EXPECT_FALSE(averager.Average(&avg, &error)); - - for (int s = 1; s <= 5; ++s) - averager.AddSample(0, s, 1.0); - - avg = 0; - error = 0; - EXPECT_TRUE(averager.Average(&avg, &error)); - EXPECT_EQ(3, avg); - EXPECT_NEAR(sqrt(2) / sqrt(5), error, 1e-9); -} - -TEST(WeightedMovingAverageTest, AverageSeveralWeightedValues) { - WeightedMovingAverage averager(0); - averager.AddSample(0, 1, 2.0); - averager.AddSample(0, 2, 1.0); - averager.AddSample(0, 3, 0.0); - averager.AddSample(0, 4, 1.0); - averager.AddSample(0, 5, 2.0); - - int64_t avg = 0; - double error = 0; - EXPECT_TRUE(averager.Average(&avg, &error)); - EXPECT_EQ(3, avg); - // ^2 / - double effective_sample_size = 36.0 / 10.0; - EXPECT_NEAR(sqrt(3) / sqrt(effective_sample_size), error, 1e-9); -} - -TEST(WeightedMovingAverageTest, DropOldValues) { - WeightedMovingAverage averager(1); - for (int s = 0; s < 10; ++s) - averager.AddSample(s, 100, 5.0); - - averager.AddSample(10, 1, 1.0); - averager.AddSample(11, 3, 1.0); - - int64_t avg = 0; - double error = 0; - EXPECT_TRUE(averager.Average(&avg, &error)); - EXPECT_EQ(2, avg); - EXPECT_DOUBLE_EQ(1.0 / sqrt(2), error); -} - -TEST(WeightedMovingAverageTest, DropOldValuesUneven) { - WeightedMovingAverage averager(5); - for (int s = 0; s < 10; ++s) - averager.AddSample(s * s, 100, 5.0); - - averager.AddSample(100, 1, 1.0); - averager.AddSample(105, 3, 1.0); - - int64_t avg = 0; - double error = 0; - EXPECT_TRUE(averager.Average(&avg, &error)); - EXPECT_EQ(2, avg); - EXPECT_DOUBLE_EQ(1.0 / sqrt(2), error); -} - -TEST(WeightedMovingAverageTest, DropOldValuesByAddingZeroWeightValues) { - WeightedMovingAverage averager(5); - for (int s = 0; s < 10; ++s) - averager.AddSample(s, 1, 5.0); - - // Adding values with weight 0 still drops old values. - for (int s = 11; s < 15; ++s) - averager.AddSample(s, 100, 0.0); - - averager.AddSample(15, 10, 1.0); - - int64_t avg = 0; - double error = 0; - EXPECT_TRUE(averager.Average(&avg, &error)); - EXPECT_EQ(10, avg); - EXPECT_DOUBLE_EQ(0.0, error); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/statistics/weighted_moving_linear_regression.cc chromium-132.0.6834.159/chromecast/base/statistics/weighted_moving_linear_regression.cc --- chromium-132.0.6834.110/chromecast/base/statistics/weighted_moving_linear_regression.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/statistics/weighted_moving_linear_regression.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,120 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/statistics/weighted_moving_linear_regression.h" - -#include -#include - -#include "base/check_op.h" -#include "base/logging.h" - -namespace chromecast { - -WeightedMovingLinearRegression::WeightedMovingLinearRegression( - int64_t max_x_range) - : max_x_range_(max_x_range) { - DCHECK_GE(max_x_range_, 0); -} - -WeightedMovingLinearRegression::~WeightedMovingLinearRegression() = default; - -void WeightedMovingLinearRegression::Reserve(int count) { - Sample sample = {0, 0, 0}; - samples_.insert(samples_.end(), count, sample); - samples_.erase(samples_.end() - count, samples_.end()); -} - -void WeightedMovingLinearRegression::Reset() { - x_mean_.Reset(); - y_mean_.Reset(); - covariance_ = 0.0; - samples_.clear(); - slope_ = 0.0; - slope_variance_ = 0.0; - intercept_variance_ = 0.0; - - has_estimate_ = false; -} - -void WeightedMovingLinearRegression::AddSample(int64_t x, - int64_t y, - double weight) { - DCHECK_GE(weight, 0); - if (!samples_.empty()) - DCHECK_GE(x, samples_.back().x); - - UpdateSet(x, y, weight); - Sample sample = {x, y, weight}; - samples_.push_back(sample); - - // Remove old samples. - while (x - samples_.front().x > max_x_range_) { - const Sample& old_sample = samples_.front(); - UpdateSet(old_sample.x, old_sample.y, -old_sample.weight); - samples_.pop_front(); - } - DCHECK(!samples_.empty()); - - if (samples_.size() <= 2 || x_mean_.sum_weights() == 0 || - x_mean_.variance_sum() == 0) { - has_estimate_ = false; - return; - } - - slope_ = covariance_ / x_mean_.variance_sum(); - - double residual_sum_squares = - (covariance_ * covariance_) / x_mean_.variance_sum(); - double mean_squared_error = - (y_mean_.variance_sum() - residual_sum_squares) / (samples_.size() - 2); - - slope_variance_ = std::max(0.0, mean_squared_error / x_mean_.variance_sum()); - intercept_variance_ = std::max( - 0.0, (slope_variance_ * x_mean_.variance_sum()) / x_mean_.sum_weights()); - - has_estimate_ = true; -} - -bool WeightedMovingLinearRegression::EstimateY(int64_t x, - int64_t* y, - double* error) const { - if (!has_estimate_) - return false; - - double x_diff = x - x_mean_.weighted_mean(); - double y_estimate = y_mean_.weighted_mean() + (slope_ * x_diff); - - *y = static_cast(round(y_estimate)); - *error = sqrt(intercept_variance_ + (slope_variance_ * x_diff * x_diff)); - return true; -} - -bool WeightedMovingLinearRegression::EstimateSlope(double* slope, - double* error) const { - if (!has_estimate_) - return false; - - *slope = slope_; - *error = sqrt(slope_variance_); - return true; -} - -void WeightedMovingLinearRegression::UpdateSet(int64_t x, - int64_t y, - double weight) { - double old_y_mean = y_mean_.weighted_mean(); - x_mean_.AddSample(x, weight); - y_mean_.AddSample(y, weight); - covariance_ += weight * (x - x_mean_.weighted_mean()) * (y - old_y_mean); -} - -void WeightedMovingLinearRegression::DumpSamples() const { - for (auto sample : samples_) { - LOG(INFO) << "x, y, weight: " << sample.x << " " << sample.y << " " - << sample.weight; - } -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/statistics/weighted_moving_linear_regression.h chromium-132.0.6834.159/chromecast/base/statistics/weighted_moving_linear_regression.h --- chromium-132.0.6834.110/chromecast/base/statistics/weighted_moving_linear_regression.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/statistics/weighted_moving_linear_regression.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,93 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_STATISTICS_WEIGHTED_MOVING_LINEAR_REGRESSION_H_ -#define CHROMECAST_BASE_STATISTICS_WEIGHTED_MOVING_LINEAR_REGRESSION_H_ - -#include -#include - -#include "chromecast/base/statistics/weighted_mean.h" - -namespace chromecast { - -// Performs linear regression over a set of weighted (x, y) samples. -// Calculates a weighted moving average over a set of weighted (x, y) points. -// The points do not need to be evenly distributed on the X axis, but the -// X coordinate is assumed to be generally increasing. -// -// Whenever a new sample is added using AddSample(), old samples whose -// x coordinates are farther than |max_x_range_| from the new sample's -// x coordinate will be removed from the regression. Note that |max_x_range_| -// must be non-negative. -class WeightedMovingLinearRegression { - public: - struct Sample { - int64_t x; - int64_t y; - double weight; - }; - - explicit WeightedMovingLinearRegression(int64_t max_x_range); - - WeightedMovingLinearRegression(const WeightedMovingLinearRegression&) = - delete; - WeightedMovingLinearRegression& operator=( - const WeightedMovingLinearRegression&) = delete; - - ~WeightedMovingLinearRegression(); - - // Returns the current number of samples that are in the regression. - size_t num_samples() const { return samples_.size(); } - - // Adds a weighted (x, y) sample to the set. Note that |weight| - // should be positive. - void AddSample(int64_t x, int64_t y, double weight); - - // Gets a y value estimate from the linear regression: y = a*x + b, where - // a and b are the slope and intercept estimates from the regression. The - // standard error of the resulting y estimate is also provided. - // Returns false if the y value cannot be estimated, in which case y and - // |error| are not modified. Returns true otherwise. - bool EstimateY(int64_t x, int64_t* y, double* error) const; - - // Gets the current estimated slope and slope error from the linear - // regression. Returns false if the slope cannot be estimated, in which - // case |slope| and |error| are not modified. Returns true otherwise. - bool EstimateSlope(double* slope, double* error) const; - - // Dumps samples currently in the linear regression. - void DumpSamples() const; - - // Returns a const reference to the samples currently captured. Very - // useful for debugging. - const std::deque& samples() { return samples_; } - - // Reserves space for |count| samples, to reduce memory allocation during use. - void Reserve(int count); - - // Resets to initial state. - void Reset(); - - private: - // Adds (x, y) to the set if |weight| is positive; removes (x, y) from the - // set if |weight| is negative. - void UpdateSet(int64_t x, int64_t y, double weight); - - const int64_t max_x_range_; - WeightedMean x_mean_; - WeightedMean y_mean_; - double covariance_ = 0.0; - std::deque samples_; - - double slope_ = 0.0; - double slope_variance_ = 0.0; - double intercept_variance_ = 0.0; - - bool has_estimate_ = false; -}; - -} // namespace chromecast - -#endif // CHROMECAST_BASE_STATISTICS_WEIGHTED_MOVING_LINEAR_REGRESSION_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/statistics/weighted_moving_linear_regression_unittest.cc chromium-132.0.6834.159/chromecast/base/statistics/weighted_moving_linear_regression_unittest.cc --- chromium-132.0.6834.110/chromecast/base/statistics/weighted_moving_linear_regression_unittest.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/statistics/weighted_moving_linear_regression_unittest.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,155 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/statistics/weighted_moving_linear_regression.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace chromecast { - -TEST(WeightedMovingLinearRegressionTest, NotEnoughSamples) { - for (int num_samples = 0; num_samples <= 2; ++num_samples) { - WeightedMovingLinearRegression linear(1e6); - for (int s = 0; s < num_samples; ++s) - linear.AddSample(s, s, 1.0); - - int64_t y = 12345; - double error = 12345.0; - EXPECT_FALSE(linear.EstimateY(0, &y, &error)); - EXPECT_EQ(12345, y); - EXPECT_EQ(12345.0, error); - - double slope = 12345.0; - EXPECT_FALSE(linear.EstimateSlope(&slope, &error)); - EXPECT_EQ(12345.0, slope); - EXPECT_EQ(12345.0, error); - } -} - -TEST(WeightedMovingLinearRegressionTest, NoXVariance) { - WeightedMovingLinearRegression linear(1e6); - for (int s = 0; s < 10; ++s) - linear.AddSample(0, s, 1.0); - - int64_t y = 12345; - double error = 12345.0; - EXPECT_FALSE(linear.EstimateY(0, &y, &error)); - EXPECT_EQ(12345, y); - EXPECT_EQ(12345.0, error); - - double slope = 12345.0; - EXPECT_FALSE(linear.EstimateSlope(&slope, &error)); - EXPECT_EQ(12345.0, slope); - EXPECT_EQ(12345.0, error); -} - -TEST(WeightedMovingLinearRegressionTest, ZeroWeight) { - WeightedMovingLinearRegression linear(1e6); - for (int s = 0; s < 10; ++s) - linear.AddSample(s, s, 0.0); - - int64_t y = 12345; - double error = 12345.0; - EXPECT_FALSE(linear.EstimateY(0, &y, &error)); - EXPECT_EQ(12345, y); - EXPECT_EQ(12345.0, error); - - double slope = 12345.0; - EXPECT_FALSE(linear.EstimateSlope(&slope, &error)); - EXPECT_EQ(12345.0, slope); - EXPECT_EQ(12345.0, error); -} - -TEST(WeightedMovingLinearRegressionTest, SimpleLine) { - WeightedMovingLinearRegression linear(1e6); - for (int s = 0; s < 3; ++s) - linear.AddSample(s, s, 1.0); - - int64_t y; - double error; - EXPECT_TRUE(linear.EstimateY(20, &y, &error)); - EXPECT_EQ(20, y); - EXPECT_DOUBLE_EQ(0.0, error); - - double slope; - EXPECT_TRUE(linear.EstimateSlope(&slope, &error)); - EXPECT_DOUBLE_EQ(1.0, slope); - EXPECT_DOUBLE_EQ(0.0, error); -} - -TEST(WeightedMovingLinearRegressionTest, SimpleLineHighX) { - WeightedMovingLinearRegression linear(1e6); - for (int s = 0; s < 10; ++s) - linear.AddSample(1000000000 + s, s, 1.0); - - int64_t y; - double error; - EXPECT_TRUE(linear.EstimateY(0, &y, &error)); - EXPECT_EQ(-1000000000, y); - EXPECT_DOUBLE_EQ(0.0, error); - - EXPECT_TRUE(linear.EstimateY(1000000020, &y, &error)); - EXPECT_EQ(20, y); - EXPECT_DOUBLE_EQ(0.0, error); - - double slope; - EXPECT_TRUE(linear.EstimateSlope(&slope, &error)); - EXPECT_DOUBLE_EQ(1.0, slope); - EXPECT_DOUBLE_EQ(0.0, error); -} - -TEST(WeightedMovingLinearRegressionTest, Weighted) { - WeightedMovingLinearRegression linear(1e6); - // Add some weight 1.0 points on the line y = x/2, and some weight 2.0 points - // on the line y = x/2 + 4.5. - for (int s = 0; s < 1000; ++s) { - linear.AddSample(2 * s, s, 1.0); - linear.AddSample(2 * s + 1, s + 5, 2.0); - } - - // The resulting estimate should be y = x/2 + 3. - int64_t y; - double error; - EXPECT_TRUE(linear.EstimateY(20, &y, &error)); - EXPECT_EQ(13, y); - - EXPECT_TRUE(linear.EstimateY(-20, &y, &error)); - EXPECT_EQ(-7, y); - EXPECT_NEAR(0.0, error, 0.1); - - double slope; - EXPECT_TRUE(linear.EstimateSlope(&slope, &error)); - EXPECT_NEAR(0.5, slope, 0.001); - EXPECT_NEAR(0.0, error, 0.001); -} - -TEST(WeightedMovingLinearRegressionTest, DropOldSamples) { - WeightedMovingLinearRegression linear(1999); - // First add some points that will fall outside of the window. - for (int s = -1000; s < 0; ++s) - linear.AddSample(s, 0, 1.0); - - // Add some weight 1.0 points on the line y = x/2, and some weight 2.0 points - // on the line y = x/2 + 4.5. - for (int s = 0; s < 1000; ++s) { - linear.AddSample(2 * s, s, 1.0); - linear.AddSample(2 * s + 1, s + 5, 2.0); - } - - // The resulting estimate should be y = x/2 + 3. - int64_t y; - double error; - EXPECT_TRUE(linear.EstimateY(20, &y, &error)); - EXPECT_EQ(13, y); - - EXPECT_TRUE(linear.EstimateY(-20, &y, &error)); - EXPECT_EQ(-7, y); - EXPECT_NEAR(0.0, error, 0.1); - - double slope; - EXPECT_TRUE(linear.EstimateSlope(&slope, &error)); - EXPECT_NEAR(0.5, slope, 0.001); - EXPECT_NEAR(0.0, error, 0.001); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/system_time_change_notifier.cc chromium-132.0.6834.159/chromecast/base/system_time_change_notifier.cc --- chromium-132.0.6834.110/chromecast/base/system_time_change_notifier.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/system_time_change_notifier.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,96 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/system_time_change_notifier.h" - -#include "base/functional/bind.h" -#include "base/location.h" -#include "base/task/sequenced_task_runner.h" - -namespace chromecast { - -namespace { - -// Limits for periodic system time monitoring. -const int kLimitForMonitorPer1Sec = 60; // 1 minute -const int kLimitForMonitorPer10Sec = 600; // 10 minutes - -} // namespace - -SystemTimeChangeNotifier::SystemTimeChangeNotifier() - : observer_list_(new base::ObserverListThreadSafe()) {} - -SystemTimeChangeNotifier::~SystemTimeChangeNotifier() = default; - -void SystemTimeChangeNotifier::AddObserver(Observer* observer) { - observer_list_->AddObserver(observer); -} - -void SystemTimeChangeNotifier::RemoveObserver(Observer* observer) { - observer_list_->RemoveObserver(observer); -} - -void SystemTimeChangeNotifier::NotifySystemTimeChanged() { - observer_list_->Notify(FROM_HERE, &Observer::OnSystemTimeChanged); -} - -SystemTimeChangeNotifierPeriodicMonitor:: -SystemTimeChangeNotifierPeriodicMonitor( - const scoped_refptr& task_runner) - : task_runner_(task_runner), - weak_factory_(this) { - DCHECK(task_runner_); - base::Time now = Now(); - ResetTimeAndLimits(now); - ScheduleNextMonitor(now); -} - -SystemTimeChangeNotifierPeriodicMonitor:: - ~SystemTimeChangeNotifierPeriodicMonitor() = default; - -void SystemTimeChangeNotifierPeriodicMonitor::ResetTimeAndLimits( - base::Time now) { - // ScheduleNextMonitor() will adjust actual expected_system_time. - expected_system_time_ = now; - monitoring_limit_time_1sec_ = now + base::Seconds(kLimitForMonitorPer1Sec); - monitoring_limit_time_10sec_ = - monitoring_limit_time_1sec_ + base::Seconds(kLimitForMonitorPer10Sec); -} - -void SystemTimeChangeNotifierPeriodicMonitor::ScheduleNextMonitor( - base::Time now) { - base::TimeDelta next_checking_interval = - now <= monitoring_limit_time_1sec_ - ? base::Seconds(1) - : now <= monitoring_limit_time_10sec_ ? base::Seconds(10) - : base::Minutes(10); - // Adjusting expected_system_time based on now cannot detect continuous system - // time drift (false negative), but tolerates task delay (false positive). - // Task delay is expected more than system time drift. - expected_system_time_ = now + next_checking_interval; - task_runner_->PostDelayedTask( - FROM_HERE, - base::BindOnce(&SystemTimeChangeNotifierPeriodicMonitor::CheckSystemTime, - weak_factory_.GetWeakPtr()), - next_checking_interval); -} - -void SystemTimeChangeNotifierPeriodicMonitor::CheckSystemTime() { - base::Time now = Now(); - const base::TimeDelta kInterval10Seconds(base::Seconds(10)); - if (now < expected_system_time_ - kInterval10Seconds || - now > expected_system_time_ + kInterval10Seconds) { // Time changed! - ResetTimeAndLimits(now); - NotifySystemTimeChanged(); - } - ScheduleNextMonitor(now); -} - -base::Time SystemTimeChangeNotifierPeriodicMonitor::Now() const { - if (!fake_now_.is_null()) - return fake_now_; - return base::Time::Now(); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/system_time_change_notifier.h chromium-132.0.6834.159/chromecast/base/system_time_change_notifier.h --- chromium-132.0.6834.110/chromecast/base/system_time_change_notifier.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/system_time_change_notifier.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,94 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_SYSTEM_TIME_CHANGE_NOTIFIER_H_ -#define CHROMECAST_BASE_SYSTEM_TIME_CHANGE_NOTIFIER_H_ - -#include "base/functional/callback.h" -#include "base/memory/ref_counted.h" -#include "base/memory/weak_ptr.h" -#include "base/observer_list_threadsafe.h" -#include "base/time/time.h" - -namespace base { -class SequencedTaskRunner; -} - -namespace chromecast { - -// Abstract class to notify system time changes. -class SystemTimeChangeNotifier { - public: - class Observer { - public: - // Called when current system time has changed. - virtual void OnSystemTimeChanged() = 0; - - protected: - virtual ~Observer() {} - }; - - SystemTimeChangeNotifier(const SystemTimeChangeNotifier&) = delete; - SystemTimeChangeNotifier& operator=(const SystemTimeChangeNotifier&) = delete; - - virtual ~SystemTimeChangeNotifier(); - - void AddObserver(Observer* observer); - void RemoveObserver(Observer* observer); - - protected: - SystemTimeChangeNotifier(); - - // Implementations are expected to call this to notify system time changes. - void NotifySystemTimeChanged(); - - private: - scoped_refptr> observer_list_; -}; - -// Default implementation of SystemTimeChangeNotifier for most platform. -// It monitors system time changes periodically and notifies if the current -// system time is different from the expected one by more than 10 seconds. -// After reboot or system time has changed, it checks for time changes every -// second for first 1 minute. Then, checks every 10 seconds for next 10 minutes. -// Then, checks every 10 minutes. -class SystemTimeChangeNotifierPeriodicMonitor - : public SystemTimeChangeNotifier { - public: - explicit SystemTimeChangeNotifierPeriodicMonitor( - const scoped_refptr& task_runner); - - SystemTimeChangeNotifierPeriodicMonitor( - const SystemTimeChangeNotifierPeriodicMonitor&) = delete; - SystemTimeChangeNotifierPeriodicMonitor& operator=( - const SystemTimeChangeNotifierPeriodicMonitor&) = delete; - - ~SystemTimeChangeNotifierPeriodicMonitor() override; - - // For unittests. - void set_fake_now_for_testing(base::Time now) { fake_now_ = now; } - - private: - // Helper functions to monitor system time changes. - void ResetTimeAndLimits(base::Time now); - void ScheduleNextMonitor(base::Time now); - void CheckSystemTime(); - - // Returns base::Time::Now() unless fake_now is set. - base::Time Now() const; - - const scoped_refptr task_runner_; - - base::Time expected_system_time_; - base::Time monitoring_limit_time_1sec_; - base::Time monitoring_limit_time_10sec_; - - base::Time fake_now_; - - base::WeakPtrFactory weak_factory_; -}; - -} // namespace chromecast - -#endif // CHROMECAST_BASE_SYSTEM_TIME_CHANGE_NOTIFIER_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/system_time_change_notifier_unittest.cc chromium-132.0.6834.159/chromecast/base/system_time_change_notifier_unittest.cc --- chromium-132.0.6834.110/chromecast/base/system_time_change_notifier_unittest.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/system_time_change_notifier_unittest.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,213 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/system_time_change_notifier.h" - -#include -#include - -#include "base/functional/bind.h" -#include "base/location.h" -#include "base/run_loop.h" -#include "base/task/sequenced_task_runner.h" -#include "base/task/single_thread_task_runner.h" -#include "base/test/task_environment.h" -#include "base/time/time.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace chromecast { - -namespace { - -class SequencedTaskRunnerNoDelay : public base::SequencedTaskRunner { - public: - SequencedTaskRunnerNoDelay() {} - - SequencedTaskRunnerNoDelay(const SequencedTaskRunnerNoDelay&) = delete; - SequencedTaskRunnerNoDelay& operator=(const SequencedTaskRunnerNoDelay&) = - delete; - - // base::SequencedTaskRunner implementation: - bool PostDelayedTask(const base::Location& from_here, - base::OnceClosure task, - base::TimeDelta delay) override { - base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( - from_here, std::move(task)); - return true; - } - - bool PostNonNestableDelayedTask(const base::Location& from_here, - base::OnceClosure task, - base::TimeDelta delay) override { - return true; - } - - bool RunsTasksInCurrentSequence() const override { return true; } - - private: - ~SequencedTaskRunnerNoDelay() override {} -}; - -class TimeChangeObserver : public SystemTimeChangeNotifier::Observer { - public: - TimeChangeObserver() : num_time_changed_(0) {} - - TimeChangeObserver(const TimeChangeObserver&) = delete; - TimeChangeObserver& operator=(const TimeChangeObserver&) = delete; - - ~TimeChangeObserver() override {} - - // SystemTimeChangeNotifier::Observer implementation: - void OnSystemTimeChanged() override { ++num_time_changed_; } - - int num_time_changed() const { return num_time_changed_; } - - private: - int num_time_changed_; -}; - -} // namespace - -class SystemTimeChangeNotifierTest : public testing::Test { - protected: - void SetUp() override { - notifier_.reset(new SystemTimeChangeNotifierPeriodicMonitor( - new SequencedTaskRunnerNoDelay())); - - observer_.reset(new TimeChangeObserver); - notifier_->AddObserver(observer_.get()); - } - - // Runs pending tasks. It doesn't run tasks schedule after this call. - void RunPendingTasks() { - base::RunLoop run_loop; - base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, run_loop.QuitClosure()); - run_loop.Run(); - } - - base::test::SingleThreadTaskEnvironment task_environment_; - std::unique_ptr notifier_; - std::unique_ptr observer_; -}; - -TEST_F(SystemTimeChangeNotifierTest, NotChanged) { - EXPECT_EQ(0, observer_->num_time_changed()); - - // Not changed. - RunPendingTasks(); - EXPECT_EQ(0, observer_->num_time_changed()); -} - -TEST_F(SystemTimeChangeNotifierTest, TimeChangedForwardLessThan10Seconds) { - base::Time now = base::Time::Now(); - EXPECT_EQ(0, observer_->num_time_changed()); - - // Time change NOT detected. - notifier_->set_fake_now_for_testing(now + base::Seconds(4)); - RunPendingTasks(); - EXPECT_EQ(0, observer_->num_time_changed()); - RunPendingTasks(); - EXPECT_EQ(0, observer_->num_time_changed()); -} - -TEST_F(SystemTimeChangeNotifierTest, TimeChangedBackwardLessThan10Seconds) { - base::Time now = base::Time::Now(); - EXPECT_EQ(0, observer_->num_time_changed()); - - // Time change NOT detected. - notifier_->set_fake_now_for_testing(now - base::Seconds(4)); - RunPendingTasks(); - EXPECT_EQ(0, observer_->num_time_changed()); - RunPendingTasks(); - EXPECT_EQ(0, observer_->num_time_changed()); -} - -TEST_F(SystemTimeChangeNotifierTest, TimeChangedForwardMoreThan10Seconds) { - base::Time now = base::Time::Now(); - EXPECT_EQ(0, observer_->num_time_changed()); - - notifier_->set_fake_now_for_testing(now + base::Seconds(40)); - RunPendingTasks(); - // Still 0 since observe callback is running in next run loop. - EXPECT_EQ(0, observer_->num_time_changed()); - RunPendingTasks(); - // Time change detected. - EXPECT_EQ(1, observer_->num_time_changed()); -} - -TEST_F(SystemTimeChangeNotifierTest, TimeChangedBackwardMoreThan10Seconds) { - base::Time now = base::Time::Now(); - EXPECT_EQ(0, observer_->num_time_changed()); - - notifier_->set_fake_now_for_testing(now - base::Seconds(40)); - RunPendingTasks(); - // Still 0 since observe callback is running in next run loop. - EXPECT_EQ(0, observer_->num_time_changed()); - RunPendingTasks(); - // Time change detected. - EXPECT_EQ(1, observer_->num_time_changed()); -} - -TEST_F(SystemTimeChangeNotifierTest, CannotDetectTimeDriftForward) { - base::Time now = base::Time::Now(); - EXPECT_EQ(0, observer_->num_time_changed()); - - // Time change NOT detected. Expected = now + 1, actual = now + 4. - notifier_->set_fake_now_for_testing(now + base::Seconds(4)); - RunPendingTasks(); - EXPECT_EQ(0, observer_->num_time_changed()); - - // Time change NOT detected. Expected = now + 4 + 1, actual = now + 8. - notifier_->set_fake_now_for_testing(now + base::Seconds(8)); - RunPendingTasks(); - EXPECT_EQ(0, observer_->num_time_changed()); - - // Time change NOT detected. Expected = now + 8 + 1, actual = now + 12. - notifier_->set_fake_now_for_testing(now + base::Seconds(12)); - RunPendingTasks(); - EXPECT_EQ(0, observer_->num_time_changed()); - - // Time change detected. Expected = now + 12 + 1, actual = now + 16. - notifier_->set_fake_now_for_testing(now + base::Seconds(16)); - RunPendingTasks(); - EXPECT_EQ(0, observer_->num_time_changed()); - - // Time change detected. Expected = now + 16 + 1, actual = now + 20. - notifier_->set_fake_now_for_testing(now + base::Seconds(20)); - RunPendingTasks(); - EXPECT_EQ(0, observer_->num_time_changed()); -} - -TEST_F(SystemTimeChangeNotifierTest, CannotDetectTTimeDriftBackward) { - base::Time now = base::Time::Now(); - EXPECT_EQ(0, observer_->num_time_changed()); - - // Time change NOT detected. Expected = now + 1, actual = now - 4. - notifier_->set_fake_now_for_testing(now - base::Seconds(4)); - RunPendingTasks(); - EXPECT_EQ(0, observer_->num_time_changed()); - - // Time change NOT detected. Expected = now - 4 + 1, actual = now - 8. - notifier_->set_fake_now_for_testing(now - base::Seconds(8)); - RunPendingTasks(); - EXPECT_EQ(0, observer_->num_time_changed()); - - // Time change detected. Expected = now - 8 + 1, actual = now - 12. - notifier_->set_fake_now_for_testing(now - base::Seconds(12)); - RunPendingTasks(); - EXPECT_EQ(0, observer_->num_time_changed()); - - // Time change detected. Expected = now - 12 + 1, actual = now - 16. - notifier_->set_fake_now_for_testing(now - base::Seconds(16)); - RunPendingTasks(); - EXPECT_EQ(0, observer_->num_time_changed()); - - // Time change detected. Expected = now - 20 + 1, actual = now - 20. - notifier_->set_fake_now_for_testing(now - base::Seconds(20)); - RunPendingTasks(); - EXPECT_EQ(0, observer_->num_time_changed()); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/task_runner_impl.cc chromium-132.0.6834.159/chromecast/base/task_runner_impl.cc --- chromium-132.0.6834.110/chromecast/base/task_runner_impl.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/task_runner_impl.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,34 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/task_runner_impl.h" - -#include "base/functional/bind.h" -#include "base/location.h" -#include "base/task/single_thread_task_runner.h" -#include "base/time/time.h" - -namespace chromecast { - -TaskRunnerImpl::TaskRunnerImpl() - : TaskRunnerImpl(base::SingleThreadTaskRunner::GetCurrentDefault()) {} - -TaskRunnerImpl::TaskRunnerImpl( - scoped_refptr runner) - : runner_(std::move(runner)) { - DCHECK(runner_.get()); -} - -TaskRunnerImpl::~TaskRunnerImpl() {} - -bool TaskRunnerImpl::PostTask(Task* task, uint64_t delay_milliseconds) { - DCHECK(task); - // TODO(halliwell): FROM_HERE is misleading, we should consider a macro for - // vendor backends to send the callsite info. - return runner_->PostDelayedTask(FROM_HERE, - base::BindOnce(&Task::Run, base::Owned(task)), - base::Milliseconds(delay_milliseconds)); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/task_runner_impl.h chromium-132.0.6834.159/chromecast/base/task_runner_impl.h --- chromium-132.0.6834.110/chromecast/base/task_runner_impl.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/task_runner_impl.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,44 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_TASK_RUNNER_IMPL_H_ -#define CHROMECAST_BASE_TASK_RUNNER_IMPL_H_ - -#include - -#include "base/memory/ref_counted.h" -#include "chromecast/public/task_runner.h" - -namespace base { -class SingleThreadTaskRunner; -} - -namespace chromecast { - -// Implementation of public TaskRunner interface that just calls -// base::SingleThreadTaskRunner::CurrentDefaultHandle at construction time and -// uses it to post. -class TaskRunnerImpl : public TaskRunner { - public: - TaskRunnerImpl(); - explicit TaskRunnerImpl(scoped_refptr runner); - - TaskRunnerImpl(const TaskRunnerImpl&) = delete; - TaskRunnerImpl& operator=(const TaskRunnerImpl&) = delete; - - ~TaskRunnerImpl() override; - - bool PostTask(Task* task, uint64_t delay_milliseconds) override; - - const scoped_refptr& runner() const { - return runner_; - } - - private: - const scoped_refptr runner_; -}; - -} // namespace chromecast - -#endif // CHROMECAST_BASE_TASK_RUNNER_IMPL_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/thread_health_checker.cc chromium-132.0.6834.159/chromecast/base/thread_health_checker.cc --- chromium-132.0.6834.110/chromecast/base/thread_health_checker.cc 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/thread_health_checker.cc 1970-01-01 00:00:00.000000000 +0000 @@ -1,112 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/base/thread_health_checker.h" - -#include -#include - -#include "base/functional/bind.h" -#include "base/memory/ref_counted.h" -#include "base/task/sequenced_task_runner.h" -#include "base/task/task_runner.h" -#include "base/threading/thread_checker.h" -#include "base/timer/timer.h" -#include "chromecast/base/bind_to_task_runner.h" - -namespace chromecast { - -ThreadHealthChecker::Internal::Internal( - scoped_refptr patient_task_runner, - scoped_refptr doctor_task_runner, - base::TimeDelta interval, - base::TimeDelta timeout, - base::RepeatingClosure on_failure) - : patient_task_runner_(std::move(patient_task_runner)), - doctor_task_runner_(std::move(doctor_task_runner)), - interval_(interval), - timeout_(timeout), - on_failure_(std::move(on_failure)) { - DCHECK(patient_task_runner_); - DCHECK(doctor_task_runner_); -} - -ThreadHealthChecker::Internal::~Internal() {} - -void ThreadHealthChecker::Internal::StartHealthCheck() { - DCHECK(doctor_task_runner_->RunsTasksInCurrentSequence()); - DETACH_FROM_THREAD(thread_checker_); - ok_timer_ = std::make_unique(); - failure_timer_ = std::make_unique(); - ScheduleHealthCheck(); -} - -void ThreadHealthChecker::Internal::StopHealthCheck() { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - DCHECK(ok_timer_); - DCHECK(failure_timer_); - ok_timer_->Stop(); - failure_timer_->Stop(); -} - -void ThreadHealthChecker::Internal::ScheduleHealthCheck() { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - ok_timer_->Start(FROM_HERE, interval_, this, - &ThreadHealthChecker::Internal::CheckThreadHealth); -} - -void ThreadHealthChecker::Internal::CheckThreadHealth() { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - DCHECK(!failure_timer_->IsRunning()); - patient_task_runner_->PostTask( - FROM_HERE, BindToCurrentThread(base::BindOnce( - &ThreadHealthChecker::Internal::ThreadOk, this))); - failure_timer_->Start(FROM_HERE, timeout_, this, - &ThreadHealthChecker::Internal::ThreadTimeout); -} - -void ThreadHealthChecker::Internal::ThreadOk() { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - failure_timer_->Stop(); - ScheduleHealthCheck(); -} - -void ThreadHealthChecker::Internal::ThreadTimeout() { - DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); - on_failure_.Run(); - ScheduleHealthCheck(); -} - -// The public ThreadHealthChecker owns a ref-counted reference to an Internal -// object which does the heavy lifting. -ThreadHealthChecker::ThreadHealthChecker( - scoped_refptr patient_task_runner, - scoped_refptr doctor_task_runner, - base::TimeDelta interval, - base::TimeDelta timeout, - base::RepeatingClosure on_failure) - : doctor_task_runner_(doctor_task_runner), - internal_(base::MakeRefCounted( - patient_task_runner, - doctor_task_runner, - interval, - timeout, - std::move(on_failure))) { - doctor_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&ThreadHealthChecker::Internal::StartHealthCheck, - internal_)); -} - -// When the public ThreadHealthChecker is destroyed, the reference to the -// Internal representation is freed, but if there are any pending tasks on the -// doctor thread that partially own Internal, they will be run asynchronously -// before the Internal object is destroyed and the health check stops. -ThreadHealthChecker::~ThreadHealthChecker() { - doctor_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&ThreadHealthChecker::Internal::StopHealthCheck, - internal_)); -} - -} // namespace chromecast diff -Nru chromium-132.0.6834.110/chromecast/base/thread_health_checker.h chromium-132.0.6834.159/chromecast/base/thread_health_checker.h --- chromium-132.0.6834.110/chromecast/base/thread_health_checker.h 2025-01-21 15:41:16.000000000 +0000 +++ chromium-132.0.6834.159/chromecast/base/thread_health_checker.h 1970-01-01 00:00:00.000000000 +0000 @@ -1,82 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_BASE_THREAD_HEALTH_CHECKER_H_ -#define CHROMECAST_BASE_THREAD_HEALTH_CHECKER_H_ - -#include - -#include "base/functional/callback.h" -#include "base/memory/ref_counted.h" -#include "base/threading/thread_checker.h" -#include "base/time/time.h" - -namespace base { -class OneShotTimer; -class SequencedTaskRunner; -class TaskRunner; -} // namespace base - -namespace chromecast { -// A class used to periodically check the responsiveness of a thread. -// -// The class takes two task runners, a "patient", and a "doctor". The doctor -// task runner will post a "sentinel" task to the patient and verify that it -// gets run within a certain response time, determined by |timeout|. -// If the task is not run in time, then the patient fails the health checkup and -// |on_failure| is invoked. -// -// The thread health is checked periodically, with the length between one check -// and the next determined by |interval|, and the amount of time allowed for the -// sentinel task to complete determined by |timeout|. -class ThreadHealthChecker { - public: - ThreadHealthChecker( - scoped_refptr patient_task_runner, - scoped_refptr doctor_task_runner, - base::TimeDelta interval, - base::TimeDelta timeout, - base::RepeatingClosure on_failure); - - ThreadHealthChecker(const ThreadHealthChecker&) = delete; - ThreadHealthChecker& operator=(const ThreadHealthChecker&) = delete; - - ~ThreadHealthChecker(); - - private: - class Internal : public base::RefCountedThreadSafe { - public: - Internal(scoped_refptr patient_task_runner, - scoped_refptr doctor_task_runner, - base::TimeDelta interval, - base::TimeDelta timeout, - base::RepeatingClosure on_failure); - void StartHealthCheck(); - void StopHealthCheck(); - - private: - friend class base::RefCountedThreadSafe; - ~Internal(); - void ScheduleHealthCheck(); - void CheckThreadHealth(); - void ThreadOk(); - void ThreadTimeout(); - - scoped_refptr patient_task_runner_; - scoped_refptr doctor_task_runner_; - base::TimeDelta interval_; - base::TimeDelta timeout_; - std::unique_ptr ok_timer_; - std::unique_ptr failure_timer_; - base::RepeatingClosure on_failure_; - THREAD_CHECKER(thread_checker_); - }; - - scoped_refptr doctor_task_runner_; - scoped_refptr internal_; -}; - -} // namespace chromecast - -#endif // CHROMECAST_BASE_THREAD_HEALTH_CHECKER_H_ diff -Nru chromium-132.0.6834.110/chromecast/base/thread_health_checker_unittest.cc chromium-132.0.6834.159/chromecast/base/thread_health_checker_unittest.cc --- chromium-132.0.6834.110/chromecas