Version in base suite: 135.0.7049.95-1~deb12u1 Version in overlay suite: 137.0.7151.68-1~deb12u1 Base version: chromium_137.0.7151.68-1~deb12u1 Target version: chromium_137.0.7151.103-1~deb12u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/c/chromium/chromium_137.0.7151.68-1~deb12u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/c/chromium/chromium_137.0.7151.103-1~deb12u1.dsc DEPS | 8 ash/constants/ash_features.cc | 10 ash/constants/ash_features.h | 4 ash/strings/ash_strings_de.xtb | 2 ash/strings/ash_strings_kn.xtb | 6 ash/system/palette/palette_tray.cc | 4 ash/webui/camera_app_ui/resources/strings/camera_strings_de.xtb | 2 build/util/LASTCHANGE | 2 build/util/LASTCHANGE.committime | 2 chrome/VERSION | 2 chrome/app/resources/chromium_strings_de.xtb | 2 chrome/app/resources/generated_resources_ar.xtb | 2 chrome/app/resources/generated_resources_de.xtb | 2 chrome/app/resources/generated_resources_es.xtb | 2 chrome/app/resources/generated_resources_ka.xtb | 2 chrome/app/resources/generated_resources_ne.xtb | 2 chrome/app/resources/generated_resources_pt-BR.xtb | 2 chrome/app/resources/generated_resources_sr-Latn.xtb | 4 chrome/app/resources/generated_resources_sr.xtb | 4 chrome/app/resources/generated_resources_uz.xtb | 4 chrome/app/resources/google_chrome_strings_ar.xtb | 2 chrome/app/resources/google_chrome_strings_de.xtb | 2 chrome/browser/BUILD.gn | 2 chrome/browser/ash/login/demo_mode/demo_session.cc | 8 chrome/browser/extensions/extension_service.cc | 86 chrome/browser/extensions/extension_service.h | 15 chrome/browser/extensions/extension_service_unittest.cc | 29 chrome/browser/extensions/service_worker_tracking_browsertest.cc | 55 chrome/browser/loader/from_gws_navigation_and_keep_alive_request_observer.h | 2 chrome/browser/loader/from_gws_navigation_and_keep_alive_request_tab_helper.cc | 18 chrome/browser/loader/from_gws_navigation_and_keep_alive_request_tab_helper.h | 42 chrome/browser/os_crypt/app_bound_encryption_win.cc | 2 chrome/browser/safe_browsing/tailored_security/consented_message_android.cc | 18 chrome/browser/safe_browsing/tailored_security/consented_message_android.h | 8 chrome/browser/safe_browsing/tailored_security/consented_message_android_unittest.cc | 97 chrome/browser/ui/BUILD.gn | 1 chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb | 2 chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb | 2 chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb | 2 chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb | 2 chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb | 2 chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb | 2 chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb | 2 chrome/browser/ui/lens/lens_overlay_controller.cc | 5 chrome/browser/ui/omnibox/chrome_omnibox_client.cc | 12 chrome/browser/ui/tab_helpers.cc | 8 chrome/browser/ui/views/frame/browser_desktop_window_tree_host_win.cc | 11 chrome/browser/ui/views/frame/browser_desktop_window_tree_host_win.h | 1 chrome/browser/ui/views/frame/browser_view.cc | 11 chrome/browser/ui/web_applications/web_app_browsertest.cc | 18 chrome/browser/updater/check_updater_health_task.cc | 4 chrome/common/chrome_features.cc | 2 chromeos/CHROMEOS_LKGM | 2 chromeos/strings/chromeos_strings_de.xtb | 2 components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb | 2 components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb | 4 components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb | 4 components/certificate_transparency/data/log_list.json | 4 components/omnibox/common/omnibox_feature_configs.cc | 8 components/omnibox/common/omnibox_feature_configs.h | 4 components/optimization_guide/content/browser/page_context_eligibility.cc | 18 components/optimization_guide/content/browser/page_context_eligibility.h | 11 components/strings/components_strings_de.xtb | 2 components/strings/components_strings_pt-BR.xtb | 2 components/strings/components_strings_th.xtb | 2 components/strings/components_strings_vi.xtb | 3 components/sync/model/processor_entity.cc | 54 components/sync/model/processor_entity.h | 26 content/browser/accessibility/browser_accessibility_android.cc | 5 content/browser/accessibility/browser_accessibility_android_unittest.cc | 127 content/browser/accessibility/browser_accessibility_manager_android.cc | 106 content/browser/accessibility/browser_accessibility_manager_android.h | 10 content/browser/accessibility/web_contents_accessibility_android.cc | 2 content/browser/accessibility/web_contents_accessibility_android.h | 4 content/browser/indexed_db/instance/leveldb/backing_store.cc | 5 content/browser/preloading/prerender/prerender_browsertest.cc | 82 content/browser/preloading/prerender/prerender_host.cc | 2 content/browser/preloading/prerender/prerender_host.h | 7 content/browser/preloading/prerender/prerender_no_vary_search_hint_commit_deferring_condition.cc | 12 content/browser/preloading/prerender/prerender_no_vary_search_hint_commit_deferring_condition.h | 2 content/public/test/prerender_test_util.cc | 2 debian/changelog | 22 debian/control | 1 debian/patches/series | 14 debian/rules | 4 extensions/browser/process_manager.cc | 3 extensions/browser/service_worker/service_worker_task_queue.cc | 34 extensions/browser/service_worker/service_worker_task_queue.h | 15 extensions/common/extension_resource.cc | 54 extensions/common/extension_resource_unittest.cc | 34 gpu/config/gpu_lists_version.h | 2 infra/config/generated/builders/ci/linux-chromeos-rel/targets/chromium.chromiumos.json | 1 infra/config/generated/builders/try/linux-chromeos-rel/targets/chromium.chromiumos.json | 1 infra/config/targets/mixins.star | 14 infra/config/targets/tests.star | 1 media/audio/win/audio_low_latency_input_win.cc | 61 media/audio/win/audio_low_latency_input_win.h | 8 media/audio/win/audio_low_latency_input_win_unittest.cc | 171 net/http/transport_security_state_static.pins | 4 net/http/transport_security_state_static_pins.json | 2 remoting/resources/remoting_strings_de.xtb | 2 third_party/blink/renderer/core/dom/scroll_button_pseudo_element.cc | 101 third_party/blink/renderer/core/dom/scroll_button_pseudo_element.h | 2 third_party/blink/renderer/core/view_transition/view_transition.cc | 7 third_party/blink/renderer/platform/media/web_audio_source_provider_impl.cc | 3 third_party/blink/renderer/platform/media/web_audio_source_provider_impl_test.cc | 42 third_party/blink/renderer/platform/runtime_enabled_features.json5 | 4 third_party/devtools-frontend/src/front_end/panels/network/RequestHTMLView.ts | 2 tools/metrics/histograms/metadata/extensions/enums.xml | 9 tools/metrics/histograms/metadata/extensions/histograms.xml | 11 tools/metrics/histograms/metadata/navigation/enums.xml | 2 tools/metrics/histograms/metadata/safe_browsing/enums.xml | 1 ui/accessibility/extensions/strings/accessibility_extensions_strings_de.xtb | 2 ui/accessibility/platform/test_ax_platform_tree_manager_delegate.cc | 2 ui/accessibility/platform/test_ax_platform_tree_manager_delegate.h | 7 ui/gtk/BUILD.gn | 2 ui/gtk/gtk_ui_platform.h | 5 ui/gtk/gtk_ui_platform_stub.cc | 4 ui/gtk/gtk_ui_platform_stub.h | 1 ui/gtk/gtk_util.cc | 11 ui/gtk/gtk_util.h | 2 ui/gtk/input_method_context_impl_gtk.cc | 50 ui/gtk/input_method_context_impl_gtk.h | 2 ui/gtk/wayland/gtk_ui_platform_wayland.cc | 6 ui/gtk/wayland/gtk_ui_platform_wayland.h | 1 ui/gtk/x/gtk_event_loop_x11.cc | 147 ui/gtk/x/gtk_event_loop_x11.h | 36 ui/gtk/x/gtk_ui_platform_x11.cc | 29 ui/gtk/x/gtk_ui_platform_x11.h | 5 ui/strings/translations/ui_strings_de.xtb | 2 ui/views/widget/desktop_aura/desktop_window_tree_host_win.cc | 2 ui/views/widget/desktop_aura/desktop_window_tree_host_win.h | 1 ui/views/win/hwnd_message_handler.cc | 10 ui/views/win/hwnd_message_handler_delegate.h | 3 v8/include/v8-version.h | 2 v8/src/wasm/canonical-types.h | 3 v8/src/wasm/value-type.h | 4 v8/tools/builtins-pgo/profiles/meta.json | 2 v8/tools/builtins-pgo/profiles/x64-rl.profile | 3103 +- v8/tools/builtins-pgo/profiles/x64.profile | 3439 +- v8/tools/builtins-pgo/profiles/x86-rl.profile |15370 ++++------ v8/tools/builtins-pgo/profiles/x86.profile | 6907 ++-- 142 files changed, 15693 insertions(+), 15154 deletions(-) diff -Nru chromium-137.0.7151.68/DEPS chromium-137.0.7151.103/DEPS --- chromium-137.0.7151.68/DEPS 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/DEPS 2025-06-09 18:33:48.000000000 +0000 @@ -307,7 +307,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': 'e398f9bf6d5c8a768ab736f46146d7349cf31547', + 'v8_revision': '41f53aba7095888c959932bd8f2ee8b4e16af223', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. @@ -395,7 +395,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': 'fdc8ca697612f90e7ddf2621dffbc43733d2d238', + 'devtools_frontend_revision': 'e423961606946be24c8c1ec0d1ec91511efbabc5', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -1495,7 +1495,7 @@ 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - '26f5e76bae3c02c7fe01346d34526df109ec28ce', + 'c871a17ec2b251479095f61e2160db6c44cacaee', 'condition': 'checkout_android and checkout_src_internal', }, @@ -4689,7 +4689,7 @@ 'src/ios_internal': { 'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' + - '7c3fe3379137057f6c1addfe349067c06066b647', + '411ad47afe9682542fb6b5caa7076b4af9c08c8e', 'condition': 'checkout_ios and checkout_src_internal', }, diff -Nru chromium-137.0.7151.68/ash/constants/ash_features.cc chromium-137.0.7151.103/ash/constants/ash_features.cc --- chromium-137.0.7151.68/ash/constants/ash_features.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/ash/constants/ash_features.cc 2025-06-09 18:33:48.000000000 +0000 @@ -2850,6 +2850,11 @@ "DemoModeAppLandscapeLocked", base::FEATURE_ENABLED_BY_DEFAULT); +// The pref kSecondaryGoogleAccountSigninAllowed is set to false in Demo Mode. +BASE_FEATURE(kDemoModeSecondaryGoogleAccountSigninAllowedFalse, + "DemoModeSecondaryGoogleAccountSigninAllowedFalse", + base::FEATURE_ENABLED_BY_DEFAULT); + // Moves toasts to the bottom-side corner where the status area is instead of // the center when enabled. BASE_FEATURE(kSideAlignedToasts, @@ -3667,6 +3672,11 @@ return base::FeatureList::IsEnabled(kDemoModeAppLandscapeLocked); } +bool IsDemoModeSecondaryGoogleAccountSigninAllowedFalse() { + return base::FeatureList::IsEnabled( + kDemoModeSecondaryGoogleAccountSigninAllowedFalse); +} + bool IsEcheSWAEnabled() { return base::FeatureList::IsEnabled(kEcheSWA); } diff -Nru chromium-137.0.7151.68/ash/constants/ash_features.h chromium-137.0.7151.103/ash/constants/ash_features.h --- chromium-137.0.7151.68/ash/constants/ash_features.h 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/ash/constants/ash_features.h 2025-06-09 18:33:48.000000000 +0000 @@ -922,6 +922,8 @@ BASE_DECLARE_FEATURE(kFeatureManagementFeatureAwareDeviceDemoMode); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kDemoModeAppLandscapeLocked); +COMPONENT_EXPORT(ASH_CONSTANTS) +BASE_DECLARE_FEATURE(kDemoModeSecondaryGoogleAccountSigninAllowedFalse); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kSideAlignedToasts); COMPONENT_EXPORT(ASH_CONSTANTS) BASE_DECLARE_FEATURE(kSmartDimExperimentalComponent); @@ -1130,6 +1132,8 @@ COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDemoModeSignInEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDemoModeWallpaperUpdateEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDemoModeSignInFileCleanupEnabled(); +COMPONENT_EXPORT(ASH_CONSTANTS) +bool IsDemoModeSecondaryGoogleAccountSigninAllowedFalse(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDeskTemplateSyncEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsDisplayPerformanceModeEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsInputDeviceSettingsSplitEnabled(); diff -Nru chromium-137.0.7151.68/ash/strings/ash_strings_de.xtb chromium-137.0.7151.103/ash/strings/ash_strings_de.xtb --- chromium-137.0.7151.68/ash/strings/ash_strings_de.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/ash/strings/ash_strings_de.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -1843,7 +1843,7 @@ „Smartphone stummschalten“ ist im Arbeitsprofil nicht verfügbar Die Tastenkombination Alt + Aufwärtspfeil hat sich geändert. Wenn du jetzt die Seite-nach-oben-Taste benötigst, drücke -Taste + Aufwärtspfeil. Die Kamerafunktion „Automatischer Bildausschnitt“ ist deaktiviert. -Ok +OK HID-Geräte Ok Google Drive diff -Nru chromium-137.0.7151.68/ash/strings/ash_strings_kn.xtb chromium-137.0.7151.103/ash/strings/ash_strings_kn.xtb --- chromium-137.0.7151.68/ash/strings/ash_strings_kn.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/ash/strings/ash_strings_kn.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -335,7 +335,7 @@ ಗೇಮ್‌ಗಳು ನೆಟ್‌ವರ್ಕ್‌‍ಗೆ ಸಂಪರ್ಕಗೊಂಡಿಲ್ಲ ಇತರ ಬಟನ್ -ನಿಮ್ಮ USB-C, Thunderbolt ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ಸಾಧನದ ಕಾರ್ಯಕ್ಷಮತೆ ಸೀಮಿತವಾಗಿರಬಹುದು. +ನಿಮ್ಮ USB-C, Thunderbolt ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ಸಾಧನದ ಪರ್ಫಾರ್ಮೆನ್ಸ್ ಸೀಮಿತವಾಗಿರಬಹುದು. Alt + Backspace ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್‌ಕಟ್ ಅನ್ನು ಬದಲಾಯಿಸಲಾಗಿದೆ. Delete ಕೀ ಬಳಸಲು, ಕೀ + ಬ್ಯಾಕ್‍‍ಸ್ಪೇಸ್ ಅನ್ನು ಒತ್ತಿ. ಹೊಸ ಡೆಸ್ಕ್ ಫುಲ್‌ಸ್ಕ್ರೀನ್ ರೆಕಾರ್ಡ್ ಮಾಡಿ @@ -1134,7 +1134,7 @@ ಬಣ್ಣ ವಿಲೋಮ ಕೀಬೋರ್ಡ್ ಇನ್ನಷ್ಟು ಬ್ರೈಟ್ ಆಗಿ ಮಾಡಿ ಮುಂದಿನ ವಾರದ -ನಿಮ್ಮ USB-C, USB4 ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ಸಾಧನದ ಕಾರ್ಯಕ್ಷಮತೆ ಸೀಮಿತವಾಗಿರಬಹುದು. +ನಿಮ್ಮ USB-C, USB4 ಅನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. ಸಾಧನದ ಪರ್ಫಾರ್ಮೆನ್ಸ್ ಸೀಮಿತವಾಗಿರಬಹುದು. ಪದೇ ಪದೇ ಬಳಸಿರುವುದು ಪೋಷಕ ಆ್ಯಕ್ಸೆಸ್ ಬಟನ್‌ % (ಎಡಬದಿ) @@ -1454,7 +1454,7 @@ ಫೋನ್ ಹಬ್ ಬಳಸಿಕೊಂಡು, ನಿಮ್ಮ ಫೋನ್‌ನ ಸಂದೇಶಗಳನ್ನು ತ್ವರಿತವಾಗಿ ಕಳುಹಿಸಿ ಅಥವಾ ಪ್ರತ್ಯುತ್ತರಿಸಿ ಎಲ್ಲಾ ಆ್ಯಪ್‌ಗಳು, ಎಲ್ಲಾ ಆ್ಯಪ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಆ್ಯರೋ ಕೀಗಳನ್ನು ಬಳಸಿ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ ಫೋಕಸ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ತೋರಿಸಿ. ಟೈಮರ್‌ ಅನ್ನು ಗೆ ಸೆಟ್ ಮಾಡಲಾಗಿದೆ. -ನಿಮ್ಮ ಸಾಧನ ನಿಮ್ಮ ಕೇಬಲ್‌ಗಿಂತ ಹೆಚ್ಚಿನ ಡೇಟಾ ದರವನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ. ಸಾಧನದ ಕಾರ್ಯಕ್ಷಮತೆ ಸೀಮಿತವಾಗಿರಬಹುದು. +ನಿಮ್ಮ ಸಾಧನ ನಿಮ್ಮ ಕೇಬಲ್‌ಗಿಂತ ಹೆಚ್ಚಿನ ಡೇಟಾ ದರವನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ. ಸಾಧನದ ಪರ್ಫಾರ್ಮೆನ್ಸ್ ಸೀಮಿತವಾಗಿರಬಹುದು. ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಆನ್ ಆಗಿದೆ ಬಾಕಿಯಿದೆ ನಿಮ್ಮ ನಲ್ಲಿ ನಿಮಗೆ ಅಗತ್ಯವಿರುವ ಎಲ್ಲವನ್ನೂ ಮಾಡಲು ಆ್ಯಪ್‌ಗಳನ್ನು ಬಳಸಿ. ಲಾಂಚರ್‌ನಲ್ಲಿ ನಿಮ್ಮ ಆ್ಯಪ್‌ಗಳನ್ನು ನೀವು ಕಾಣಬಹುದು. diff -Nru chromium-137.0.7151.68/ash/system/palette/palette_tray.cc chromium-137.0.7151.103/ash/system/palette/palette_tray.cc --- chromium-137.0.7151.68/ash/system/palette/palette_tray.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/ash/system/palette/palette_tray.cc 2025-06-09 18:33:48.000000000 +0000 @@ -430,6 +430,10 @@ if (!GetVisible()) return; + // Also check preferred visibility. + if (!visible_preferred()) + return; + // Only respond on the internal display. if (!IsWidgetOnInternalDisplay()) return; diff -Nru chromium-137.0.7151.68/ash/webui/camera_app_ui/resources/strings/camera_strings_de.xtb chromium-137.0.7151.103/ash/webui/camera_app_ui/resources/strings/camera_strings_de.xtb --- chromium-137.0.7151.68/ash/webui/camera_app_ui/resources/strings/camera_strings_de.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/ash/webui/camera_app_ui/resources/strings/camera_strings_de.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -130,7 +130,7 @@ Fotoaufnahme nicht möglich Wird nach unten verschoben Alle zurücksetzen -Ok +OK Porträt 3 Sekunden 10-Sekunden-Timer diff -Nru chromium-137.0.7151.68/build/util/LASTCHANGE chromium-137.0.7151.103/build/util/LASTCHANGE --- chromium-137.0.7151.68/build/util/LASTCHANGE 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/build/util/LASTCHANGE 2025-06-09 18:33:48.000000000 +0000 @@ -1,2 +1,2 @@ -LASTCHANGE=2989ffee9373ea8b8623bd98b3cb350a8e95cadc-refs/branch-heads/7151@{#1873} +LASTCHANGE=3dcc738117a3439068c9773ccd31f9858923fc4a-refs/branch-heads/7151@{#1957} LASTCHANGE_YEAR=2025 diff -Nru chromium-137.0.7151.68/build/util/LASTCHANGE.committime chromium-137.0.7151.103/build/util/LASTCHANGE.committime --- chromium-137.0.7151.68/build/util/LASTCHANGE.committime 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/build/util/LASTCHANGE.committime 2025-06-09 18:33:48.000000000 +0000 @@ -1 +1 @@ -1748634632 \ No newline at end of file +1749494028 \ No newline at end of file diff -Nru chromium-137.0.7151.68/chrome/VERSION chromium-137.0.7151.103/chrome/VERSION --- chromium-137.0.7151.68/chrome/VERSION 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/VERSION 2025-06-09 18:33:48.000000000 +0000 @@ -1,4 +1,4 @@ MAJOR=137 MINOR=0 BUILD=7151 -PATCH=68 +PATCH=103 diff -Nru chromium-137.0.7151.68/chrome/app/resources/chromium_strings_de.xtb chromium-137.0.7151.103/chrome/app/resources/chromium_strings_de.xtb --- chromium-137.0.7151.68/chrome/app/resources/chromium_strings_de.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/app/resources/chromium_strings_de.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -442,7 +442,7 @@ Wenn Tests aktiviert sind, können mithilfe der Anzeigenanalyse von dir besuchte Websites Informationen von Chromium anfordern, mit denen sie die Leistung ihrer Werbung analysieren können. Durch die Anzeigenanalyse wird das websiteübergreifende Tracking eingeschränkt, indem so wenig Informationen wie möglich zwischen Websites ausgetauscht werden. Wenn du eine Website besuchst, kann diese von Chromium dann deine Interessen anfordern, um die dir gezeigte Werbung zu personalisieren. Chromium kann bis zu drei Interessen teilen. Link in Chromium-Inkognitofenster öffnen -Ok +OK Schwache Passwörter sind einfach zu erraten. Erlaube Chromium, ein sicheres Passwort für deine Onlinekonten zu erstellen und zu speichern. Chromium OS-Nutzungsbedingungen Chromium benötigt für diese Website die Berechtigung, auf dein Mikrofon zuzugreifen diff -Nru chromium-137.0.7151.68/chrome/app/resources/generated_resources_ar.xtb chromium-137.0.7151.103/chrome/app/resources/generated_resources_ar.xtb --- chromium-137.0.7151.68/chrome/app/resources/generated_resources_ar.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/app/resources/generated_resources_ar.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -17,7 +17,7 @@ يمكن لهذه الإضافة قراءة بياناتك وتغييرها على المواقع. يمكنك التحكُّم في المواقع التي يمكن لهذه الإضافة الوصول إليها. ‏تفعيل "متجر Google Play" تصدير الإشارات المرجعية -يتذكّر "" طريقة تسجيل دخولك ويسجِّل دخولك تلقائيًا إن أمكن ذلك. وعندما يكون متوقفًا، سيُطلَب منك تأكيد البيانات في كل مرّة. +يتذكّر "" طريقة تسجيل دخولك ويسجِّل دخولك تلقائيًا إن أمكن ذلك. وعندما يكون هذا الخيار غير مفعّل، سيُطلَب منك تأكيد البيانات في كل مرّة. ليس الآن اسم الموقع الإلكتروني عناصر التحكُّم في الألعاب متاحة الآن diff -Nru chromium-137.0.7151.68/chrome/app/resources/generated_resources_de.xtb chromium-137.0.7151.103/chrome/app/resources/generated_resources_de.xtb --- chromium-137.0.7151.68/chrome/app/resources/generated_resources_de.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/app/resources/generated_resources_de.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -8437,7 +8437,7 @@ Textcursor hervorheben Held Aus Gruppe entfernen -Ok +OK Arbeitsspeicher auf Grundlage der Inaktivität von Tabs freigeben Port Gerät diff -Nru chromium-137.0.7151.68/chrome/app/resources/generated_resources_es.xtb chromium-137.0.7151.103/chrome/app/resources/generated_resources_es.xtb --- chromium-137.0.7151.68/chrome/app/resources/generated_resources_es.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/app/resources/generated_resources_es.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -2846,7 +2846,7 @@ La navegación web debería ser rápida. Dedica un momento a revisar tus extensiones ahora. Ir a Un navegador web rápido, seguro y fácil de usar creado para la Web actual. -Quiero registrarme +Registrarme Este dispositivo no recibirá más actualizaciones de seguridad. Cambia a un nuevo Chromebook. no tiene permiso para enviar notificaciones. Se te volverá a preguntar la próxima vez que visites el sitio. Sección anidada dentro de un grupo: diff -Nru chromium-137.0.7151.68/chrome/app/resources/generated_resources_ka.xtb chromium-137.0.7151.103/chrome/app/resources/generated_resources_ka.xtb --- chromium-137.0.7151.68/chrome/app/resources/generated_resources_ka.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/app/resources/generated_resources_ka.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -2845,7 +2845,7 @@ ვების დათვალიერება სწრაფი უნდა იყოს. დაუთმეთ დრო გამოყენებული გაფართოებების შემოწმებას. -ზე გადასვლა სწრაფი, მარტივი და უსაფრთხო ვებ-ბრაუზერი, შექმნილი სპეციალურად თანამედროვე ინტერნეტისთვის. -რეგისტრაცია +დამარეგისტრირე უსაფრთხოების განახლებებს აღარ მიიღებთ. გამოცვალეთ თქვენი Chromebook. შეტყობინებები არ არის დაშვებული -ისთვის. მომდევნო ვიზიტისას ხელახლა გაკითხავთ. სექცია ჩადგმულია ჯგუფში: diff -Nru chromium-137.0.7151.68/chrome/app/resources/generated_resources_ne.xtb chromium-137.0.7151.103/chrome/app/resources/generated_resources_ne.xtb --- chromium-137.0.7151.68/chrome/app/resources/generated_resources_ne.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/app/resources/generated_resources_ne.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -2843,7 +2843,7 @@ वेब ब्राउजिङ तीव्र हुनु पर्छ। केही क्षण निकालेर अहिले नै आफ्ना एक्स्टेन्सनहरू जाँच्नुहोस् मा जानुहोस् आधुनिक वेबको लागि निर्मित एउटा छिटो, सरल, र सुरक्षित वेब ब्राउजर। -मलाई साइन अप गर्नुहोस् +साइन अप गर्नुहोस् तपाईं अब आफ्नो Chromebook मा सुरक्षासम्बन्धी अपडेटहरू प्राप्त गर्नु हुने छैन। यो Chromebook अपग्रेड गरी नयाँ Chromebook लिनुहोस्। का हकमा सूचना पठाउने अनुमति दिइएको छैन। तपाईंले अर्को पटक यो वेबसाइट खोल्दा तपाईंलाई फेरि सोधिने छ। समूहभित्र खण्ड छ: diff -Nru chromium-137.0.7151.68/chrome/app/resources/generated_resources_pt-BR.xtb chromium-137.0.7151.103/chrome/app/resources/generated_resources_pt-BR.xtb --- chromium-137.0.7151.68/chrome/app/resources/generated_resources_pt-BR.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/app/resources/generated_resources_pt-BR.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -2858,7 +2858,7 @@ A navegação da Web deverá ser rápida. Aproveite para verificar suas extensões agora. Ir para a página Um navegador da Web rápido, simples e seguro, desenvolvido para a Web moderna. -Inscrever-me +Fazer inscrição As atualizações de segurança foram encerradas. Faça upgrade para um novo Chromebook. Notificações não permitidas para . Vamos perguntar novamente na próxima visita. Seção aninhada no grupo: diff -Nru chromium-137.0.7151.68/chrome/app/resources/generated_resources_sr-Latn.xtb chromium-137.0.7151.103/chrome/app/resources/generated_resources_sr-Latn.xtb --- chromium-137.0.7151.68/chrome/app/resources/generated_resources_sr-Latn.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/app/resources/generated_resources_sr-Latn.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -5582,7 +5582,7 @@ Ne podsećaj me sledeći put Otvori Može da pristupa ovom sajtu -Sajtovi obično koriste mikrofon za potrebe funkcija za komunikaciju poput video ćaskanja +Sajtovi obično koriste mikrofon za potrebe funkcija za komunikaciju poput video četa Svi sajtovi &Menadžer zadataka Poboljšana zaštita je isključena @@ -9285,7 +9285,7 @@ Pomoć pri čitanju Nema dovoljno memorijskog prostora za ažuriranje Napunjenost baterije -Sajtovi obično koriste video kameru za potrebe funkcija komunikacije poput video ćaskanja +Sajtovi obično koriste video kameru za potrebe funkcija komunikacije poput video četa Kontrole za navigaciju Dozvoljeno je – . Povežite kameru sa uređajem. Upari diff -Nru chromium-137.0.7151.68/chrome/app/resources/generated_resources_sr.xtb chromium-137.0.7151.103/chrome/app/resources/generated_resources_sr.xtb --- chromium-137.0.7151.68/chrome/app/resources/generated_resources_sr.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/app/resources/generated_resources_sr.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -5582,7 +5582,7 @@ Не подсећај ме следећи пут Отвори Може да приступа овом сајту -Сајтови обично користе микрофон за потребе функција за комуникацију попут видео ћаскања +Сајтови обично користе микрофон за потребе функција за комуникацију попут видео чета Сви сајтови &Менаџер задатака Побољшана заштита је искључена @@ -9285,7 +9285,7 @@ Помоћ при читању Нема довољно меморијског простора за ажурирање Напуњеност батерије -Сајтови обично користе видео камеру за потребе функција комуникације попут видео ћаскања +Сајтови обично користе видео камеру за потребе функција комуникације попут видео чета Контроле за навигацију Дозвољено је – . Повежите камеру са уређајем. Упари diff -Nru chromium-137.0.7151.68/chrome/app/resources/generated_resources_uz.xtb chromium-137.0.7151.103/chrome/app/resources/generated_resources_uz.xtb --- chromium-137.0.7151.68/chrome/app/resources/generated_resources_uz.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/app/resources/generated_resources_uz.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -2501,7 +2501,7 @@ Bu yangilanish Chromebook qurilmangizni ilk sozlamalarga qaytaradi va undagi foydalanuvchi ma’lumotlarini tozalaydi. Fayllarni sinxronlash yoniqligida joy ochilmaydi Bu sozlamani ota-ona boshqaradi. -Kursorning kichik harakatlari inkor etilsin +Kursorning kichik harakatlarini inkor etish Tungi rejim Antivirus dasturi virus aniqlandi. Quyidagi cookie fayllari bloklandi: @@ -4332,7 +4332,7 @@ Ayrim ilova maʼlumotlari tozalanishi mumkin noma’lum ishlab chiqaruvchining qurilmalari Play Market ilovalari bu qurilma bilan ishlay oladi. -Bosishdan avvalgi kutish vaqti +Klikdan oldingi kechikish Email manzil biriktirilmasin Demo rejimi ishga tushmadi Keyingi sahifa diff -Nru chromium-137.0.7151.68/chrome/app/resources/google_chrome_strings_ar.xtb chromium-137.0.7151.103/chrome/app/resources/google_chrome_strings_ar.xtb --- chromium-137.0.7151.68/chrome/app/resources/google_chrome_strings_ar.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/app/resources/google_chrome_strings_ar.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -430,7 +430,7 @@ ‏يحتاج Chrome إلى إذن للوصول إلى الكاميرا من أجل إنشاء خريطة ثلاثية الأبعاد للمكان حولك. - إصدار قناة مطوري البرامج من Google Chrome ‏لاستخدام الموقع الجغرافي، يجب منح Chrome إذن الوصول في إعدادات النظام -‏تعديل كلمة المرور في "مدير كلمات المرور" من Google على هذا الجهاز +‏يمكن إجراء التعديل في "مدير كلمات المرور في Google" على هذا الجهاز ‏أصبح نظام التشغيل ChromeOS Flex متاحًا من خلال برنامج إضافي مفتوح المصدر. ‏سيتم تطبيق التغييرات في هذا الإعداد بعد إعادة تشغيل Chrome. ‏هل تريد تسجيل الدخول إلى Chrome؟ diff -Nru chromium-137.0.7151.68/chrome/app/resources/google_chrome_strings_de.xtb chromium-137.0.7151.103/chrome/app/resources/google_chrome_strings_de.xtb --- chromium-137.0.7151.68/chrome/app/resources/google_chrome_strings_de.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/app/resources/google_chrome_strings_de.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -451,7 +451,7 @@ ChromeOS-System Du benötigst Windows 10 oder höher, um zukünftige Google Chrome-Updates zu erhalten. Dieser Computer verwendet Windows 8.1. Die Browserdaten dieser Person werden von diesem Gerät gelöscht. Um die Daten wiederherzustellen, melde dich als in Chrome an. -Ok +OK Eingangsregel für die Zulassung von mDNS-Verkehr in Google Chrome Beta. Gründe, warum Chrome einige Dateien blockiert, wird in neuem Tab geöffnet Google Lens-Verknüpfung immer anzeigen diff -Nru chromium-137.0.7151.68/chrome/browser/BUILD.gn chromium-137.0.7151.103/chrome/browser/BUILD.gn --- chromium-137.0.7151.68/chrome/browser/BUILD.gn 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/BUILD.gn 2025-06-09 18:33:48.000000000 +0000 @@ -637,6 +637,8 @@ "lifetime/browser_shutdown.h", "loader/from_gws_navigation_and_keep_alive_request_observer.cc", "loader/from_gws_navigation_and_keep_alive_request_observer.h", + "loader/from_gws_navigation_and_keep_alive_request_tab_helper.cc", + "loader/from_gws_navigation_and_keep_alive_request_tab_helper.h", "loader/from_gws_navigation_and_keep_alive_request_tracker.cc", "loader/from_gws_navigation_and_keep_alive_request_tracker.h", "loader/from_gws_navigation_and_keep_alive_request_tracker_factory.cc", diff -Nru chromium-137.0.7151.68/chrome/browser/ash/login/demo_mode/demo_session.cc chromium-137.0.7151.103/chrome/browser/ash/login/demo_mode/demo_session.cc --- chromium-137.0.7151.68/chrome/browser/ash/login/demo_mode/demo_session.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/ash/login/demo_mode/demo_session.cc 2025-06-09 18:33:48.000000000 +0000 @@ -62,6 +62,7 @@ #include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/ash/components/system/statistics_provider.h" #include "chromeos/constants/chromeos_features.h" +#include "components/account_manager_core/pref_names.h" #include "components/language/core/browser/pref_names.h" #include "components/policy/core/common/policy_pref_names.h" #include "components/prefs/pref_registry_simple.h" @@ -661,6 +662,13 @@ << current_locale_iso_code; } + if (features::IsDemoModeSecondaryGoogleAccountSigninAllowedFalse()) { + // Prevent users from signing in with their own account. + ProfileManager::GetActiveUserProfile()->GetPrefs()->SetBoolean( + account_manager::prefs::kSecondaryGoogleAccountSigninAllowed, + false); + } + RestoreDefaultLocaleForNextSession(); if (chromeos::PowerManagerClient::Get()) { diff -Nru chromium-137.0.7151.68/chrome/browser/extensions/extension_service.cc chromium-137.0.7151.103/chrome/browser/extensions/extension_service.cc --- chromium-137.0.7151.68/chrome/browser/extensions/extension_service.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/extensions/extension_service.cc 2025-06-09 18:33:48.000000000 +0000 @@ -353,27 +353,7 @@ LoadExtensionsFromCommandLineFlag(switches::kDisableExtensionsExcept); if (load_command_line_extensions) { - bool command_line_blocked = true; - if (base::FeatureList::IsEnabled( - extensions_features::kDisableLoadExtensionCommandLineSwitch)) { - LOG(WARNING) - << "--load-extension is not allowed in Google Chrome, ignoring."; - } else if (safe_browsing::IsEnhancedProtectionEnabled( - *profile_->GetPrefs())) { - VLOG(1) << "--load-extension is not allowed for users opted into " - << "Enhanced Safe Browsing, ignoring."; - } else if (ShouldBlockCommandLineExtension(*profile_)) { - // TODO(crbug.com/401529219): Deprecate this restriction once - // --load-extension switch is restricted on Chrome builds. - VLOG(1) - << "--load-extension is not allowed for users that have the policy " - << "ExtensionInstallTypeBlocklist::command_line, ignoring."; - } else { - LoadExtensionsFromCommandLineFlag(switches::kLoadExtension); - command_line_blocked = false; - } - base::UmaHistogramBoolean("Extensions.LoadingFromCommandLineBlocked", - command_line_blocked); + LoadExtensionsFromCommandLineFlag(switches::kLoadExtension); } EnabledReloadableExtensions(); delayed_install_manager_->FinishInstallationsDelayedByShutdown(); @@ -407,22 +387,58 @@ void ExtensionService::LoadExtensionsFromCommandLineFlag( const char* switch_name) { - if (command_line_->HasSwitch(switch_name)) { - base::CommandLine::StringType path_list = - command_line_->GetSwitchValueNative(switch_name); - base::StringTokenizerT - t(path_list, FILE_PATH_LITERAL(",")); - while (t.GetNext()) { - std::string extension_id; - UnpackedInstaller::Create(profile_)->LoadFromCommandLine( - base::FilePath(t.token_piece()), &extension_id, - false /*only-allow-apps*/); - if (switch_name == switches::kDisableExtensionsExcept) { - extension_registrar_->AddDisableFlagExemptedExtension(extension_id); - } + CHECK(switch_name == switches::kLoadExtension || + switch_name == switches::kDisableExtensionsExcept); + if (!command_line_->HasSwitch(switch_name)) { + return; + } + + // Check that --load-extension is allowed. + // TODO(crbug.com/419530940): Apply restrictions to + // --disable-extensions-except switch once the feature is approved and + // implemented. + if (switch_name == switches::kLoadExtension) { + if (base::FeatureList::IsEnabled( + extensions_features::kDisableLoadExtensionCommandLineSwitch)) { + LOG(WARNING) + << "--load-extension is not allowed in Google Chrome, ignoring."; + return; + } + if (safe_browsing::IsEnhancedProtectionEnabled(*profile_->GetPrefs())) { + VLOG(1) << "--load-extension is not allowed for users opted into " + << "Enhanced Safe Browsing, ignoring."; + return; + } + if (ShouldBlockCommandLineExtension(*profile_)) { + // TODO(crbug.com/401529219): Deprecate this restriction once + // --load-extension removal on Chrome builds is fully launched. + VLOG(1) + << "--load-extension is not allowed for users that have the policy " + << "ExtensionInstallTypeBlocklist::command_line, ignoring."; + return; } } + + base::CommandLine::StringType path_list = + command_line_->GetSwitchValueNative(switch_name); + base::StringTokenizerT + t(path_list, FILE_PATH_LITERAL(",")); + while (t.GetNext()) { + std::string extension_id; + UnpackedInstaller::Create(profile_)->LoadFromCommandLine( + base::FilePath(t.token_piece()), &extension_id, + /*only-allow-apps=*/false); + if (switch_name == switches::kDisableExtensionsExcept) { + extension_registrar_->AddDisableFlagExemptedExtension(extension_id); + } + } + + base::UmaHistogramEnumeration( + "Extensions.LoadingFromCommandLine", + switch_name == switches::kLoadExtension + ? ExtensionService::LoadExtensionFlag::kLoadExtension + : ExtensionService::LoadExtensionFlag::kDisableExtensionsExcept); } #if BUILDFLAG(IS_CHROMEOS) diff -Nru chromium-137.0.7151.68/chrome/browser/extensions/extension_service.h chromium-137.0.7151.103/chrome/browser/extensions/extension_service.h --- chromium-137.0.7151.68/chrome/browser/extensions/extension_service.h 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/extensions/extension_service.h 2025-06-09 18:33:48.000000000 +0000 @@ -246,6 +246,21 @@ } #endif + // Load Extension Flags. + // These values are persisted to logs. Entries should not be renumbered and + // numeric values should never be reused. + // + // LINT.IfChange(LoadExtensionFlag) + enum class LoadExtensionFlag { + // --load-extension flag. + kLoadExtension = 0, + // --disable-extensions-except flag. + kDisableExtensionsExcept = 1, + + kMaxValue = kDisableExtensionsExcept, + }; + // LINT.ThenChange(/tools/metrics/histograms/metadata/extensions/enums.xml:LoadExtensionFlag) + private: // Loads extensions specified via a command line flag/switch. void LoadExtensionsFromCommandLineFlag(const char* switch_name); diff -Nru chromium-137.0.7151.68/chrome/browser/extensions/extension_service_unittest.cc chromium-137.0.7151.103/chrome/browser/extensions/extension_service_unittest.cc --- chromium-137.0.7151.68/chrome/browser/extensions/extension_service_unittest.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/extensions/extension_service_unittest.cc 2025-06-09 18:33:48.000000000 +0000 @@ -5937,6 +5937,7 @@ // Tests that --load-extension is ignored for users opted in to Enhanced Safe // Browsing (ESB). TEST_F(ExtensionServiceTest, WillNotLoadFromCommandLineForESBUsers) { + base::HistogramTester histograms; InitializeEmptyExtensionServiceWithTestingPrefs(); // Enable ESB. profile()->GetPrefs()->SetBoolean(prefs::kSafeBrowsingEnabled, true); @@ -5950,6 +5951,8 @@ task_environment()->RunUntilIdle(); ASSERT_EQ(0u, loaded_extensions().size()); ValidatePrefKeyCount(0); + + histograms.ExpectTotalCount("Extensions.LoadingFromCommandLine", 0); } // Tests --load-extension works for non-ESB users. @@ -5970,14 +5973,16 @@ ASSERT_EQ(1u, loaded_extensions().size()); ValidatePrefKeyCount(1); - histograms.ExpectUniqueSample("Extensions.LoadingFromCommandLineBlocked", - false, 1); + histograms.ExpectUniqueSample( + "Extensions.LoadingFromCommandLine", + ExtensionService::LoadExtensionFlag::kLoadExtension, 1); } // Tests that --load-extension is ignored for users with policy // ExtensionInstallTypeBlocklist containing command_line. TEST_F(ExtensionServiceTest, WillNotLoadFromCommandLineForUsersWithPolicyFalse) { + base::HistogramTester histograms; InitializeEmptyExtensionServiceWithTestingPrefs(); profile()->GetPrefs()->SetList(pref_names::kExtensionInstallTypeBlocklist, @@ -5992,11 +5997,15 @@ task_environment()->RunUntilIdle(); ASSERT_EQ(0u, loaded_extensions().size()); ValidatePrefKeyCount(0); + + histograms.ExpectTotalCount("Extensions.LoadingFromCommandLine", 0); } -// Tests --load-extension works for users with policy -// ExtensionInstallTypeBlocklist not containing "command_line" (default value) +// Tests --load-extension and --disable-extensions-except work for users with +// policy ExtensionInstallTypeBlocklist not containing "command_line" (default +// value) TEST_F(ExtensionServiceTest, LoadsFromCommandLineForUsersWithoutPolicy) { + base::HistogramTester histograms; InitializeEmptyExtensionServiceWithTestingPrefs(); // Not setting pref as false is default value. // Try to load an extension from command line. @@ -6004,11 +6013,20 @@ base::MakeAbsoluteFilePath(data_dir().AppendASCII("good_unpacked")); base::CommandLine::ForCurrentProcess()->AppendSwitchPath( switches::kLoadExtension, path); + base::CommandLine::ForCurrentProcess()->AppendSwitchPath( + switches::kDisableExtensionsExcept, path); service()->Init(); task_environment()->RunUntilIdle(); EXPECT_EQ(0u, GetErrors().size()); ASSERT_EQ(1u, loaded_extensions().size()); ValidatePrefKeyCount(1); + + histograms.ExpectBucketCount( + "Extensions.LoadingFromCommandLine", + ExtensionService::LoadExtensionFlag::kLoadExtension, 1); + histograms.ExpectBucketCount( + "Extensions.LoadingFromCommandLine", + ExtensionService::LoadExtensionFlag::kDisableExtensionsExcept, 1); } TEST_F(ExtensionServiceTest, DisableLoadExtensionCommandLineSwitch) { @@ -6034,8 +6052,7 @@ ASSERT_EQ(0u, loaded_extensions().size()); ValidatePrefKeyCount(0); - histograms.ExpectUniqueSample("Extensions.LoadingFromCommandLineBlocked", - true, 1); + histograms.ExpectTotalCount("Extensions.LoadingFromCommandLine", 0); } // Tests that we generate IDs when they are not specified in the manifest for diff -Nru chromium-137.0.7151.68/chrome/browser/extensions/service_worker_tracking_browsertest.cc chromium-137.0.7151.103/chrome/browser/extensions/service_worker_tracking_browsertest.cc --- chromium-137.0.7151.68/chrome/browser/extensions/service_worker_tracking_browsertest.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/extensions/service_worker_tracking_browsertest.cc 2025-06-09 18:33:48.000000000 +0000 @@ -16,6 +16,7 @@ #include "chrome/browser/ui/browser.h" #include "chrome/test/base/ui_test_utils.h" #include "content/public/browser/service_worker_context.h" +#include "content/public/common/result_codes.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" #include "content/public/test/service_worker_test_helpers.h" @@ -621,6 +622,60 @@ EXPECT_FALSE(worker_state); } +// Test that if a renderer process exit notification is received before +// a browser stop notification (since these things can be triggered +// independently) and a context stop notification, it updates the worker's +// renderer active state to inactive. +IN_PROC_BROWSER_TEST_F(ServiceWorkerStopTrackingBrowserTest, + RenderProcessExitedUpdatesRendererState) { + ASSERT_NO_FATAL_FAILURE(LoadServiceWorkerExtension()); + + // Get information about worker for extension that will be stopped soon. + ServiceWorkerTaskQueue::WorkerState* worker_state = GetWorkerState(); + ASSERT_TRUE(worker_state); + std::optional worker_id = worker_state->worker_id(); + ASSERT_TRUE(worker_id); + content::ServiceWorkerContext* sw_context = + GetServiceWorkerContext(profile()); + ASSERT_TRUE(sw_context); + ASSERT_TRUE(base::Contains(sw_context->GetRunningServiceWorkerInfos(), + worker_id->version_id)); + + ServiceWorkerTaskQueue* task_queue = ServiceWorkerTaskQueue::Get(profile()); + ASSERT_TRUE(task_queue); + // Confirm the worker is renderer state active. + ASSERT_EQ(worker_state->renderer_state(), + ServiceWorkerTaskQueue::RendererState::kActive); + + // Remove the task queue as an observer of `ServiceWorkerContext` so that + // the browser stop notification will not run immediately. + ServiceWorkerTaskQueue::Get(profile())->StopObservingContextForTest( + sw_context); + // Setup intercept of `ServiceWorkerHost::DidStopServiceWorkerContext()`. + // This simulates the worker renderer thread never informing that the worker + // context terminated. + ServiceWorkerHostInterceptorForWorkerStop stop_interceptor(*worker_id); + + // Kill the service worker's renderer. + content::RenderProcessHost* worker_render_process_host = + content::RenderProcessHost::FromID(worker_id->render_process_id); + ASSERT_TRUE(worker_render_process_host); + content::RenderProcessHostWatcher process_exit_observer( + worker_render_process_host, + content::RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT); + worker_render_process_host->Shutdown(content::RESULT_CODE_KILLED); + process_exit_observer.Wait(); + + // Verify the service worker was stopped. + ASSERT_TRUE( + content::CheckServiceWorkerIsStopped(sw_context, worker_id->version_id)); + + // Confirm the worker state still exists and renderer state has been set to + // inactive by `ServiceWorkerHost::RenderProcessForWorkerExited`. + EXPECT_EQ(worker_state->renderer_state(), + ServiceWorkerTaskQueue::RendererState::kNotActive); +} + using ServiceWorkerRendererTrackingBrowserTest = ExtensionApiTest; // Tests that when reloading an extension that has a worker to a version of the diff -Nru chromium-137.0.7151.68/chrome/browser/loader/from_gws_navigation_and_keep_alive_request_observer.h chromium-137.0.7151.103/chrome/browser/loader/from_gws_navigation_and_keep_alive_request_observer.h --- chromium-137.0.7151.68/chrome/browser/loader/from_gws_navigation_and_keep_alive_request_observer.h 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/loader/from_gws_navigation_and_keep_alive_request_observer.h 2025-06-09 18:33:48.000000000 +0000 @@ -50,7 +50,7 @@ const network::ResourceRequest& resource_request, content::RenderFrameHost* initiator_rfh) override; - private: + protected: explicit FromGWSNavigationAndKeepAliveRequestObserver( content::WebContents* web_contents); }; diff -Nru chromium-137.0.7151.68/chrome/browser/loader/from_gws_navigation_and_keep_alive_request_tab_helper.cc chromium-137.0.7151.103/chrome/browser/loader/from_gws_navigation_and_keep_alive_request_tab_helper.cc --- chromium-137.0.7151.68/chrome/browser/loader/from_gws_navigation_and_keep_alive_request_tab_helper.cc 1970-01-01 00:00:00.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/loader/from_gws_navigation_and_keep_alive_request_tab_helper.cc 2025-06-09 18:33:48.000000000 +0000 @@ -0,0 +1,18 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/loader/from_gws_navigation_and_keep_alive_request_tab_helper.h" + +#include "content/public/browser/web_contents.h" + +FromGWSNavigationAndKeepAliveRequestTabHelper:: + FromGWSNavigationAndKeepAliveRequestTabHelper(content::WebContents* tab) + : FromGWSNavigationAndKeepAliveRequestObserver(tab), + content::WebContentsUserData< + FromGWSNavigationAndKeepAliveRequestTabHelper>(*tab) {} + +FromGWSNavigationAndKeepAliveRequestTabHelper:: + ~FromGWSNavigationAndKeepAliveRequestTabHelper() = default; + +WEB_CONTENTS_USER_DATA_KEY_IMPL(FromGWSNavigationAndKeepAliveRequestTabHelper); diff -Nru chromium-137.0.7151.68/chrome/browser/loader/from_gws_navigation_and_keep_alive_request_tab_helper.h chromium-137.0.7151.103/chrome/browser/loader/from_gws_navigation_and_keep_alive_request_tab_helper.h --- chromium-137.0.7151.68/chrome/browser/loader/from_gws_navigation_and_keep_alive_request_tab_helper.h 1970-01-01 00:00:00.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/loader/from_gws_navigation_and_keep_alive_request_tab_helper.h 2025-06-09 18:33:48.000000000 +0000 @@ -0,0 +1,42 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_LOADER_FROM_GWS_NAVIGATION_AND_KEEP_ALIVE_REQUEST_TAB_HELPER_H_ +#define CHROME_BROWSER_LOADER_FROM_GWS_NAVIGATION_AND_KEEP_ALIVE_REQUEST_TAB_HELPER_H_ + +#include "chrome/browser/loader/from_gws_navigation_and_keep_alive_request_observer.h" +#include "content/public/browser/web_contents_user_data.h" + +namespace content { +class WebContents; +} // namespace content + +// FromGWSNavigationAndKeepAliveRequestTabHelper observes eligible navigations +// and fetch keepalive requests made from Google search result pages (SRP). +// See parent class for more details. +// +// This should only be used on Android where TabFeatures is not available. +class FromGWSNavigationAndKeepAliveRequestTabHelper + : public FromGWSNavigationAndKeepAliveRequestObserver, + public content::WebContentsUserData< + FromGWSNavigationAndKeepAliveRequestTabHelper> { + public: + // Not copyable or movable. + FromGWSNavigationAndKeepAliveRequestTabHelper( + const FromGWSNavigationAndKeepAliveRequestTabHelper&) = delete; + FromGWSNavigationAndKeepAliveRequestTabHelper& operator=( + const FromGWSNavigationAndKeepAliveRequestTabHelper&) = delete; + ~FromGWSNavigationAndKeepAliveRequestTabHelper() override; + + private: + friend class content::WebContentsUserData< + FromGWSNavigationAndKeepAliveRequestTabHelper>; + + explicit FromGWSNavigationAndKeepAliveRequestTabHelper( + content::WebContents* tab); + + WEB_CONTENTS_USER_DATA_KEY_DECL(); +}; + +#endif // CHROME_BROWSER_LOADER_FROM_GWS_NAVIGATION_AND_KEEP_ALIVE_REQUEST_TAB_HELPER_H_ diff -Nru chromium-137.0.7151.68/chrome/browser/os_crypt/app_bound_encryption_win.cc chromium-137.0.7151.103/chrome/browser/os_crypt/app_bound_encryption_win.cc --- chromium-137.0.7151.68/chrome/browser/os_crypt/app_bound_encryption_win.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/os_crypt/app_bound_encryption_win.cc 2025-06-09 18:33:48.000000000 +0000 @@ -59,7 +59,7 @@ namespace features { BASE_FEATURE(kAppBoundDataReencrypt, "AppBoundDataReencrypt", - base::FEATURE_ENABLED_BY_DEFAULT); + base::FEATURE_DISABLED_BY_DEFAULT); } // namespace features SupportLevel GetAppBoundEncryptionSupportLevel(PrefService* local_state) { diff -Nru chromium-137.0.7151.68/chrome/browser/safe_browsing/tailored_security/consented_message_android.cc chromium-137.0.7151.103/chrome/browser/safe_browsing/tailored_security/consented_message_android.cc --- chromium-137.0.7151.68/chrome/browser/safe_browsing/tailored_security/consented_message_android.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/safe_browsing/tailored_security/consented_message_android.cc 2025-06-09 18:33:48.000000000 +0000 @@ -38,7 +38,8 @@ // The user clicked the Turn On button on the disable dialog. kAcceptedTurnOn = 2, kDismissed = 3, - kMaxValue = kDismissed, + kAcceptedFailed = 4, + kMaxValue = kAcceptedFailed, }; // LINT.ThenChange(//tools/metrics/histograms/metadata/safe_browsing/enums.xml:SyncedEsbOutcome) @@ -186,15 +187,17 @@ void TailoredSecurityConsentedModalAndroid::HandleMessageDismissed( messages::DismissReason dismiss_reason) { LogOutcome(TailoredSecurityOutcome::kDismissed, is_enable_message_); - message_.reset(); - if (dismiss_callback_) - std::move(dismiss_callback_).Run(); if (is_requested_by_synced_esb_) { LogSyncedEsbDialogOutcome(is_enable_message_, SyncedEsbOutcome::kDismissed); base::UmaHistogramEnumeration( "SafeBrowsing.SyncedEsbDialogEnabledMessageDismissReason", dismiss_reason); } + message_.reset(); + if (dismiss_callback_) { + // The callback may delete `this`. Do not add code after running it. + std::move(dismiss_callback_).Run(); + } } void TailoredSecurityConsentedModalAndroid::HandleMessageAccepted() { @@ -202,6 +205,13 @@ // LogOutcome to record ChAI actions. LogOutcome(TailoredSecurityOutcome::kAccepted, is_enable_message_); if (base::FeatureList::IsEnabled(safe_browsing::kEsbAsASyncedSetting)) { + if (!web_contents_) { + // WebContents has been destroyed. The handler failed to finish running. + // Log this situation. + LogSyncedEsbDialogOutcome(is_enable_message_, + SyncedEsbOutcome::kAcceptedFailed); + return; + } Profile* profile = Profile::FromBrowserContext(web_contents_->GetBrowserContext()); SetSafeBrowsingState(profile->GetPrefs(), diff -Nru chromium-137.0.7151.68/chrome/browser/safe_browsing/tailored_security/consented_message_android.h chromium-137.0.7151.103/chrome/browser/safe_browsing/tailored_security/consented_message_android.h --- chromium-137.0.7151.68/chrome/browser/safe_browsing/tailored_security/consented_message_android.h 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/safe_browsing/tailored_security/consented_message_android.h 2025-06-09 18:33:48.000000000 +0000 @@ -30,6 +30,14 @@ private: friend class TailoredSecurityConsentedModalAndroidTest; + FRIEND_TEST_ALL_PREFIXES(TailoredSecurityConsentedModalAndroidTest, + HandleMessageDismissedWithSelfDeletingCallback); + FRIEND_TEST_ALL_PREFIXES( + TailoredSecurityConsentedModalAndroidTest, + HandleAccepted_EsbSynced_NullWebContents_EnabledMessage_LogsFailed); + FRIEND_TEST_ALL_PREFIXES( + TailoredSecurityConsentedModalAndroidTest, + HandleAccepted_EsbSynced_NullWebContents_DisabledMessage_LogsFailed); void DismissMessageInternal(messages::DismissReason dismiss_reason); void HandleSettingsClicked(); void HandleMessageAccepted(); diff -Nru chromium-137.0.7151.68/chrome/browser/safe_browsing/tailored_security/consented_message_android_unittest.cc chromium-137.0.7151.103/chrome/browser/safe_browsing/tailored_security/consented_message_android_unittest.cc --- chromium-137.0.7151.68/chrome/browser/safe_browsing/tailored_security/consented_message_android_unittest.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/safe_browsing/tailored_security/consented_message_android_unittest.cc 2025-06-09 18:33:48.000000000 +0000 @@ -17,6 +17,8 @@ #include "ui/android/window_android.h" namespace safe_browsing { +constexpr int kSyncedEsbOutcomeAcceptedFailed = 4; + class TailoredSecurityConsentedModalAndroidTest : public testing::Test { protected: TailoredSecurityConsentedModalAndroidTest() { @@ -195,4 +197,99 @@ 1); } +TEST_F(TailoredSecurityConsentedModalAndroidTest, + HandleMessageDismissedWithSelfDeletingCallback) { + // Create the ScopedWindowAndroidForTesting wrapper. + std::unique_ptr + scoped_window_wrapper = ui::WindowAndroid::CreateForTesting(); + ASSERT_TRUE(scoped_window_wrapper); + + // Get the actual WindowAndroid* from the wrapper. + ui::WindowAndroid* actual_window_android = scoped_window_wrapper->get(); + ASSERT_TRUE(actual_window_android); + ASSERT_TRUE(web_contents_.get()); + ui::ViewAndroid* web_contents_view = web_contents_->GetNativeView(); + ASSERT_TRUE(web_contents_view); + + // Call AddChild on the actual WindowAndroid instance + actual_window_android->AddChild(web_contents_view); + + EXPECT_CALL(message_dispatcher_bridge_, + EnqueueWindowScopedMessage(testing::_, actual_window_android, + testing::_)); + auto modal_ptr = std::make_unique( + web_contents_.get(), /*enable=*/true, + base::DoNothing(), // This will be overwritten + /*is_requested_by_synced_esb=*/false); + + auto* modal_raw_ptr = modal_ptr.get(); + modal_raw_ptr->dismiss_callback_ = base::BindOnce( + [](std::unique_ptr + modal_to_delete) { + modal_to_delete.reset(); // This triggers the destructor + }, + std::move(modal_ptr)); + + DoMessageDismissed(modal_raw_ptr, messages::DismissReason::TIMER); + + SUCCEED(); // If it reaches here without crashing, the test passes. +} + +TEST_F(TailoredSecurityConsentedModalAndroidTest, + HandleAccepted_EsbSynced_NullWebContents_EnabledMessage_LogsFailed) { + scoped_feature_list_.InitAndEnableFeature( + safe_browsing::kEsbAsASyncedSetting); + + // The modal constructor needs a valid WebContents and an associated window. + std::unique_ptr window = + ui::WindowAndroid::CreateForTesting(); + ASSERT_TRUE(window && window->get() && web_contents_ && + web_contents_->GetNativeView()); + window->get()->AddChild(web_contents_->GetNativeView()); + + TailoredSecurityConsentedModalAndroid consented_modal( + web_contents_.get(), /*enabled=*/true, base::DoNothing(), + /*is_requested_by_synced_esb=*/false); + + consented_modal.web_contents_ = nullptr; + + base::HistogramTester histogram_tester; + DoMessageAccepted(&consented_modal); + + histogram_tester.ExpectUniqueSample( + "SafeBrowsing.SyncedEsbDialogEnabledMessageOutcome", + kSyncedEsbOutcomeAcceptedFailed, 1); + // Ensure the other related histogram is not affected. + histogram_tester.ExpectTotalCount( + "SafeBrowsing.SyncedEsbDialogDisabledMessageOutcome", 0); +} + +TEST_F(TailoredSecurityConsentedModalAndroidTest, + HandleAccepted_EsbSynced_NullWebContents_DisabledMessage_LogsFailed) { + scoped_feature_list_.InitAndEnableFeature( + safe_browsing::kEsbAsASyncedSetting); + + std::unique_ptr window = + ui::WindowAndroid::CreateForTesting(); + ASSERT_TRUE(window && window->get() && web_contents_ && + web_contents_->GetNativeView()) + << "Test setup failed: window or web_contents issue."; + window->get()->AddChild(web_contents_->GetNativeView()); + + TailoredSecurityConsentedModalAndroid consented_modal( + web_contents_.get(), /*enabled=*/false, base::DoNothing(), + /*is_requested_by_synced_esb=*/false); + + consented_modal.web_contents_ = nullptr; + + base::HistogramTester histogram_tester; + DoMessageAccepted(&consented_modal); + + histogram_tester.ExpectUniqueSample( + "SafeBrowsing.SyncedEsbDialogDisabledMessageOutcome", + kSyncedEsbOutcomeAcceptedFailed, 1); + histogram_tester.ExpectTotalCount( + "SafeBrowsing.SyncedEsbDialogEnabledMessageOutcome", 0); +} + } // namespace safe_browsing diff -Nru chromium-137.0.7151.68/chrome/browser/ui/BUILD.gn chromium-137.0.7151.103/chrome/browser/ui/BUILD.gn --- chromium-137.0.7151.68/chrome/browser/ui/BUILD.gn 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/ui/BUILD.gn 2025-06-09 18:33:48.000000000 +0000 @@ -966,6 +966,7 @@ "//components/page_info/android:android", "//components/page_info/core", "//components/page_info/core:proto", + "//components/page_load_metrics/browser:browser", "//components/password_manager/core/browser:browser", "//components/plus_addresses:hats_utils", "//components/plus_addresses:prefs", diff -Nru chromium-137.0.7151.68/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb chromium-137.0.7151.103/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb --- chromium-137.0.7151.68/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -1113,7 +1113,7 @@ الانضمام إلى مجموعة علامات التبويب التي تضمّ "" المزيد من التفاصيل أُزيلَ عنصر -علامة التبويب "تصغير" +تصغير علامة التبويب {TAB_COUNT,plural, =1{علامة تبويب واحدة ()}zero{‫ علامة تبويب}two{علامتا تبويب ()}few{‫ علامات تبويب}many{‫ علامة تبويب}other{‫ علامة تبويب}} لغة يمكنك تغيير إعدادات الموقع الإلكتروني من هنا. diff -Nru chromium-137.0.7151.68/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb chromium-137.0.7151.103/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb --- chromium-137.0.7151.68/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -1333,7 +1333,7 @@ Lesezeichen löschen Aktuell ausgewählt: , . Wähle ein Konto aus. Inkognitomodus deaktivieren -Ok +OK {NUMBER_OF_TABS,plural, =1{ Tab mit neuer Aktivität in freigegebenen Tabgruppen ansehen}other{ Tabs mit neuer Aktivität in freigegebenen Tabgruppen ansehen}} Nicht genehmigen , neuer oder aktualisierter Tab diff -Nru chromium-137.0.7151.68/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb chromium-137.0.7151.103/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb --- chromium-137.0.7151.68/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -1511,7 +1511,7 @@ Ajouter une adresse Confirmez la phrase secrète Fermer -Conformément à une loi en vigueur dans votre région, vous devez choisir un navigateur et un moteur de recherche +Conformément à une loi en vigueur dans votre région, vous devez choisir un navigateur et un moteur de recherche. {PAYMENT_METHOD,plural, =1{\u2026 et de plus}one{\u2026 et de plus}other{\u2026 et de plus}} Lorsque vous êtes connecté, vous êtes protégé dans tous les services Google. Revenez plus tard pour découvrir d'autres événements diff -Nru chromium-137.0.7151.68/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb chromium-137.0.7151.103/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb --- chromium-137.0.7151.68/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -1511,7 +1511,7 @@ Aggiungi indirizzo Conferma passphrase Chiudi -In base a una legge della tua regione, devi scegliere il browser e il motore di ricerca +In base a una legge della tua regione, devi scegliere il browser e il motore di ricerca. {PAYMENT_METHOD,plural, =1{\u2026 e altri }other{\u2026 e altri }} Se hai eseguito l'accesso, ti protegge nei servizi Google. Ricontrolla più tardi se ci sono nuove notizie diff -Nru chromium-137.0.7151.68/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb chromium-137.0.7151.103/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb --- chromium-137.0.7151.68/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -1553,7 +1553,7 @@ está desatualizado. A sincronização precisa confirmar sua identidade Sempre abrir PDFs baixados -O cartão virtual oculta o físico para proteger você contra possíveis tentativas de fraude. Saiba mais sobre cartões virtuais +Com o cartão virtual, você oculta o físico e se protege contra tentativas de fraude. Saiba mais sobre cartões virtuais. Guias neste dispositivo Você desativou o acesso ao armazenamento. Acesse as Configurações para reativá-lo. Fornecedor: diff -Nru chromium-137.0.7151.68/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb chromium-137.0.7151.103/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb --- chromium-137.0.7151.68/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -1511,7 +1511,7 @@ เพิ่มที่อยู่ ยืนยันข้อความรหัสผ่าน ปิด -คุณต้องเลือกเบราว์เซอร์และเครื่องมือค้นหาตามกฎหมายในภูมิภาคของคุณ +ตามกฎหมายในภูมิภาคของคุณ คุณต้องเลือกเบราว์เซอร์และเครื่องมือค้นหาที่ต้องการใช้ {PAYMENT_METHOD,plural, =1{\u2026 และอีก วิธี}other{\u2026 และอีก วิธี}} เมื่อลงชื่อเข้าใช้ ฟีเจอร์จะปกป้องคุณในบริการต่างๆ ของ Google กลับมาดูเรื่องราวใหม่ๆ ภายหลัง diff -Nru chromium-137.0.7151.68/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb chromium-137.0.7151.103/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb --- chromium-137.0.7151.68/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -1793,7 +1793,7 @@ Tải xuống thư mục mặc định? Dữ liệu đã được mã hoá bằng cụm mật khẩu của bạn. Nhập cụm mật khẩu để lưu dữ liệu Chrome vào Tài khoản Google và sử dụng dữ liệu đó. Mở thẻ mới trong chế độ Ẩn danh -Theo mặc định, các ứng dụng bạn chọn sẽ được sử dụng. Nếu chưa có trên thiết bị này thì ứng dụng sẽ được tải xuống ngay. +Các ứng dụng bạn chọn sẽ được sử dụng theo mặc định. Nếu chưa có trên thiết bị này thì ứng dụng sẽ được tải xuống trong giây lát. Chọn nhà cung cấp khác Tính năng đăng nhập không hoạt động trên thiết bị của bạn Không thể thu nhỏ thẻ. Hãy thử lại sau. diff -Nru chromium-137.0.7151.68/chrome/browser/ui/lens/lens_overlay_controller.cc chromium-137.0.7151.103/chrome/browser/ui/lens/lens_overlay_controller.cc --- chromium-137.0.7151.68/chrome/browser/ui/lens/lens_overlay_controller.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/ui/lens/lens_overlay_controller.cc 2025-06-09 18:33:48.000000000 +0000 @@ -312,8 +312,9 @@ !lens::features::UseApcAsContext()) { return true; } - return page_context_eligibility->api().IsPageContextEligible( - main_frame_url.host(), main_frame_url.path(), std::move(frame_metadata)); + return optimization_guide::IsPageContextEligible( + main_frame_url.host(), main_frame_url.path(), std::move(frame_metadata), + page_context_eligibility); } } // namespace diff -Nru chromium-137.0.7151.68/chrome/browser/ui/omnibox/chrome_omnibox_client.cc chromium-137.0.7151.103/chrome/browser/ui/omnibox/chrome_omnibox_client.cc --- chromium-137.0.7151.68/chrome/browser/ui/omnibox/chrome_omnibox_client.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/ui/omnibox/chrome_omnibox_client.cc 2025-06-09 18:33:48.000000000 +0000 @@ -473,6 +473,15 @@ show_happiness_survey ? kHatsSurveyTriggerOnFocusZpsSuggestionsHappiness : kHatsSurveyTriggerOnFocusZpsSuggestionsUtility; + const std::string& trigger_id = + show_happiness_survey + ? omnibox_feature_configs:: + HappinessTrackingSurveyForOmniboxOnFocusZps::Get() + .happiness_trigger_id + : omnibox_feature_configs:: + HappinessTrackingSurveyForOmniboxOnFocusZps::Get() + .utility_trigger_id; + HatsService* hats_service = HatsServiceFactory::GetForProfile(profile_, /*create_if_necessary=*/true); @@ -497,7 +506,8 @@ {{"page classification", metrics::OmniboxEventProto::PageClassification_Name( GetPageClassification(/*is_prefetch=*/false))}, - {"channel", channel}}); + {"channel", channel}}, + trigger_id, HatsService::SurveyOptions()); } } diff -Nru chromium-137.0.7151.68/chrome/browser/ui/tab_helpers.cc chromium-137.0.7151.103/chrome/browser/ui/tab_helpers.cc --- chromium-137.0.7151.68/chrome/browser/ui/tab_helpers.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/ui/tab_helpers.cc 2025-06-09 18:33:48.000000000 +0000 @@ -173,6 +173,7 @@ #include "chrome/browser/fast_checkout/fast_checkout_tab_helper.h" #include "chrome/browser/fingerprinting_protection/chrome_fingerprinting_protection_web_contents_helper_factory.h" #include "chrome/browser/flags/android/chrome_feature_list.h" +#include "chrome/browser/loader/from_gws_navigation_and_keep_alive_request_tab_helper.h" #include "chrome/browser/plugins/plugin_observer_android.h" #include "chrome/browser/privacy_sandbox/tracking_protection_settings_factory.h" #include "chrome/browser/ui/android/context_menu_helper.h" @@ -180,6 +181,7 @@ #include "components/facilitated_payments/core/features/features.h" #include "components/fingerprinting_protection_filter/common/fingerprinting_protection_filter_features.h" #include "components/ip_protection/common/ip_protection_status.h" +#include "components/page_load_metrics/browser/features.h" #include "components/sensitive_content/android/android_sensitive_content_client.h" #include "components/sensitive_content/features.h" #include "components/webapps/browser/android/app_banner_manager_android.h" @@ -608,6 +610,12 @@ ContextMenuHelper::CreateForWebContents(web_contents); FastCheckoutTabHelper::CreateForWebContents(web_contents); + if (base::FeatureList::IsEnabled( + page_load_metrics::features::kBeaconLeakageLogging)) { + FromGWSNavigationAndKeepAliveRequestTabHelper::CreateForWebContents( + web_contents); + } + javascript_dialogs::TabModalDialogManager::CreateForWebContents( web_contents, std::make_unique( diff -Nru chromium-137.0.7151.68/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_win.cc chromium-137.0.7151.103/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_win.cc --- chromium-137.0.7151.68/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_win.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_win.cc 2025-06-09 18:33:48.000000000 +0000 @@ -19,7 +19,6 @@ #include "base/win/windows_version.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/lifetime/application_lifetime_desktop.h" -#include "chrome/browser/lifetime/browser_shutdown.h" #include "chrome/browser/profiles/profile_avatar_icon_util.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/themes/theme_service.h" @@ -301,16 +300,6 @@ browser_view_->UpdateLoadingAnimations(restored); } -void BrowserDesktopWindowTreeHostWin::HandleRequestClose() { - if (browser_shutdown::HasShutdownStarted()) { - return; - } - // Ignore unload handlers. - browser_shutdown::OnShutdownStarting( - browser_shutdown::ShutdownType::kSilentExit); - chrome::CloseAllBrowsersAndQuit(); -} - std::string BrowserDesktopWindowTreeHostWin::GetWorkspace() const { return virtual_desktop_helper_ ? virtual_desktop_helper_->GetWorkspace() : std::string(); diff -Nru chromium-137.0.7151.68/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_win.h chromium-137.0.7151.103/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_win.h --- chromium-137.0.7151.68/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_win.h 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/ui/views/frame/browser_desktop_window_tree_host_win.h 2025-06-09 18:33:48.000000000 +0000 @@ -78,7 +78,6 @@ bool ShouldUseNativeFrame() const override; bool ShouldWindowContentsBeTransparent() const override; void HandleWindowMinimizedOrRestored(bool restored) override; - void HandleRequestClose() override; // ProfileAttributesStorage::Observer: void OnProfileAvatarChanged(const base::FilePath& profile_path) override; diff -Nru chromium-137.0.7151.68/chrome/browser/ui/views/frame/browser_view.cc chromium-137.0.7151.103/chrome/browser/ui/views/frame/browser_view.cc --- chromium-137.0.7151.68/chrome/browser/ui/views/frame/browser_view.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/ui/views/frame/browser_view.cc 2025-06-09 18:33:48.000000000 +0000 @@ -2405,12 +2405,15 @@ // Enable immersive before the browser refreshes its list of enabled // commands. // Enable immersive mode when entering browser fullscreen, unless it's in - // app mode. + // app mode or requested by an extension. if (IsFullscreen()) { + auto* fullscreen_controller = + GetExclusiveAccessManager()->fullscreen_controller(); + bool enable_immersive = - !IsRunningInAppMode() && GetExclusiveAccessManager() - ->fullscreen_controller() - ->IsFullscreenForBrowser(); + !IsRunningInAppMode() && + !fullscreen_controller->IsExtensionFullscreenOrPending() && + fullscreen_controller->IsFullscreenForBrowser(); immersive_mode_controller_->SetEnabled(enable_immersive); } else if (!immersive_mode_controller_ ->ShouldStayImmersiveAfterExitingFullscreen()) { diff -Nru chromium-137.0.7151.68/chrome/browser/ui/web_applications/web_app_browsertest.cc chromium-137.0.7151.103/chrome/browser/ui/web_applications/web_app_browsertest.cc --- chromium-137.0.7151.68/chrome/browser/ui/web_applications/web_app_browsertest.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/ui/web_applications/web_app_browsertest.cc 2025-06-09 18:33:48.000000000 +0000 @@ -850,7 +850,13 @@ /*expected_launch_display=*/DisplayMode::kMinimalUi)); } -IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, WithoutMinimalUiButtons) { +// TODO(https://crbug.com/413273037): Flaky. +#if BUILDFLAG(IS_MAC) +#define MAYBE_WithoutMinimalUiButtons DISABLED_WithoutMinimalUiButtons +#else +#define MAYBE_WithoutMinimalUiButtons WithoutMinimalUiButtons +#endif +IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, MAYBE_WithoutMinimalUiButtons) { EXPECT_FALSE(HasMinimalUiButtons( DisplayMode::kStandalone, std::nullopt, /*open_as_window=*/true, @@ -892,8 +898,16 @@ /*expected_launch_display=*/DisplayMode::kMinimalUi)); } +// TODO(https://crbug.com/413273037): Flaky. +#if BUILDFLAG(IS_MAC) +#define MAYBE_WithoutMinimalUiButtons_DisplayOverride \ + DISABLED_WithoutMinimalUiButtons_DisplayOverride +#else +#define MAYBE_WithoutMinimalUiButtons_DisplayOverride \ + WithoutMinimalUiButtons_DisplayOverride +#endif IN_PROC_BROWSER_TEST_F(WebAppBrowserTest, - WithoutMinimalUiButtons_DisplayOverride) { + MAYBE_WithoutMinimalUiButtons_DisplayOverride) { EXPECT_FALSE(HasMinimalUiButtons( DisplayMode::kStandalone, DisplayMode::kBrowser, /*open_as_window=*/true, diff -Nru chromium-137.0.7151.68/chrome/browser/updater/check_updater_health_task.cc chromium-137.0.7151.103/chrome/browser/updater/check_updater_health_task.cc --- chromium-137.0.7151.68/chrome/browser/updater/check_updater_health_task.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/browser/updater/check_updater_health_task.cc 2025-06-09 18:33:48.000000000 +0000 @@ -68,6 +68,10 @@ // Scheduled task metrics. scoped_refptr task_scheduler = TaskScheduler::CreateInstance(scope_); + if (!task_scheduler) { + // Cannot get metrics without a TaskScheduler instance. + return; + } const std::wstring task_name = task_scheduler->FindFirstTaskName(GetTaskNamePrefix(scope_, version)); diff -Nru chromium-137.0.7151.68/chrome/common/chrome_features.cc chromium-137.0.7151.103/chrome/common/chrome_features.cc --- chromium-137.0.7151.68/chrome/common/chrome_features.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chrome/common/chrome_features.cc 2025-06-09 18:33:48.000000000 +0000 @@ -261,7 +261,7 @@ #if BUILDFLAG(IS_ANDROID) BASE_FEATURE(kDisplayEdgeToEdgeFullscreen, "DisplayEdgeToEdgeFullscreen", - base::FEATURE_ENABLED_BY_DEFAULT); + base::FEATURE_DISABLED_BY_DEFAULT); #endif #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) diff -Nru chromium-137.0.7151.68/chromeos/CHROMEOS_LKGM chromium-137.0.7151.103/chromeos/CHROMEOS_LKGM --- chromium-137.0.7151.68/chromeos/CHROMEOS_LKGM 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chromeos/CHROMEOS_LKGM 2025-06-09 18:33:48.000000000 +0000 @@ -1 +1 @@ -16267.33.0 \ No newline at end of file +16267.43.0 \ No newline at end of file diff -Nru chromium-137.0.7151.68/chromeos/strings/chromeos_strings_de.xtb chromium-137.0.7151.103/chromeos/strings/chromeos_strings_de.xtb --- chromium-137.0.7151.68/chromeos/strings/chromeos_strings_de.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/chromeos/strings/chromeos_strings_de.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -1345,7 +1345,7 @@ Pfeil nach rechts Blume Lege zuerst das Dokument in den Scanner -Ok +OK Gerät Ok mit (leuchtend) diff -Nru chromium-137.0.7151.68/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb chromium-137.0.7151.103/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb --- chromium-137.0.7151.68/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/components/browser_ui/strings/android/translations/browser_ui_strings_de.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -479,7 +479,7 @@ Websites dürfen keine Texte oder Bilder aus der Zwischenablage abrufen Auswählen Websites, die du besuchst, können Informationen zu deinen Aktivitäten speichern, um erwartungsgemäß zu funktionieren – beispielsweise um dafür zu sorgen, dass du angemeldet bleibst oder um Artikel in deinem Einkaufswagen zu speichern. Oft speichern Websites diese Informationen vorübergehend auf deinem Gerät. -Ok +OK Websitedaten löschen? Bedienungshilfen Nachfragen, bevor Websites auf mein Mikrofon zugreifen dürfen (empfohlen) diff -Nru chromium-137.0.7151.68/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb chromium-137.0.7151.103/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb --- chromium-137.0.7151.68/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/components/browser_ui/strings/android/translations/browser_ui_strings_sr-Latn.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -310,7 +310,7 @@ Sačuvano zumiranje za sajtove Pitaj kada sajt želi da zna kada aktivno koristim ovaj uređaj Uvrsti sve sajtove u okviru ovog domena -Sajtovi obično koriste mikrofon za potrebe funkcija za komunikaciju poput video ćaskanja +Sajtovi obično koriste mikrofon za potrebe funkcija za komunikaciju poput video četa Podešavanja kojima se upravlja ne mogu da se resetuju Pre nego što dozvolite sajtovima da koriste uređaj i podatke virtuelne realnosti prikazuje se upit (preporučeno) Grupe ćete pronaći u odeljku za grupe kartica na svim uređajima @@ -520,7 +520,7 @@ Izađite iz pretrage u centru Sajt koristi mikrofon Uvek -Sajtovi obično koriste video kameru za potrebe funkcija komunikacije poput video ćaskanja +Sajtovi obično koriste video kameru za potrebe funkcija komunikacije poput video četa Blokiraj da sajtovi puštaju zaštićeni sadržaj Povezan je sa Bluetooth uređajem Možete da izbrišete delove ili celu istoriju, kolačiće, podatke o sajtovima i drugo diff -Nru chromium-137.0.7151.68/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb chromium-137.0.7151.103/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb --- chromium-137.0.7151.68/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/components/browser_ui/strings/android/translations/browser_ui_strings_sr.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -310,7 +310,7 @@ Сачувано зумирање за сајтове Питај када сајт жели да зна када активно користим овај уређај Уврсти све сајтове у оквиру овог домена -Сајтови обично користе микрофон за потребе функција за комуникацију попут видео ћаскања +Сајтови обично користе микрофон за потребе функција за комуникацију попут видео чета Подешавања којима се управља не могу да се ресетују Пре него што дозволите сајтовима да користе уређај и податке виртуелне реалности приказује се упит (препоручено) Групе ћете пронаћи у одељку за групе картица на свим уређајима @@ -520,7 +520,7 @@ Изађите из претраге у центру Сајт користи микрофон Увек -Сајтови обично користе видео камеру за потребе функција комуникације попут видео ћаскања +Сајтови обично користе видео камеру за потребе функција комуникације попут видео чета Блокирај да сајтови пуштају заштићени садржај Повезан је са Bluetooth уређајем Можете да избришете делове или целу историју, колачиће, податке о сајтовима и друго diff -Nru chromium-137.0.7151.68/components/certificate_transparency/data/log_list.json chromium-137.0.7151.103/components/certificate_transparency/data/log_list.json --- chromium-137.0.7151.68/components/certificate_transparency/data/log_list.json 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/components/certificate_transparency/data/log_list.json 2025-06-09 18:33:48.000000000 +0000 @@ -1,6 +1,6 @@ { - "version": "54.19", - "log_list_timestamp": "2025-05-30T12:58:08Z", + "version": "54.29", + "log_list_timestamp": "2025-06-09T12:56:36Z", "operators": [ { "name": "Google", diff -Nru chromium-137.0.7151.68/components/omnibox/common/omnibox_feature_configs.cc chromium-137.0.7151.103/components/omnibox/common/omnibox_feature_configs.cc --- chromium-137.0.7151.68/components/omnibox/common/omnibox_feature_configs.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/components/omnibox/common/omnibox_feature_configs.cc 2025-06-09 18:33:48.000000000 +0000 @@ -402,5 +402,13 @@ base::FeatureParam(&kHappinessTrackingSurveyForOmniboxOnFocusZps, "SurveyDelay", 7000) .Get(); + happiness_trigger_id = base::FeatureParam( + &kHappinessTrackingSurveyForOmniboxOnFocusZps, + "HappinessTriggerId", "") + .Get(); + utility_trigger_id = + base::FeatureParam( + &kHappinessTrackingSurveyForOmniboxOnFocusZps, "UtilityTriggerId", "") + .Get(); } } // namespace omnibox_feature_configs diff -Nru chromium-137.0.7151.68/components/omnibox/common/omnibox_feature_configs.h chromium-137.0.7151.103/components/omnibox/common/omnibox_feature_configs.h --- chromium-137.0.7151.68/components/omnibox/common/omnibox_feature_configs.h 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/components/omnibox/common/omnibox_feature_configs.h 2025-06-09 18:33:48.000000000 +0000 @@ -338,6 +338,10 @@ size_t focus_threshold; // Number of ms before the survey may be shown. size_t survey_delay; + // Trigger ID of Intent and Satisfaction survey. + std::string happiness_trigger_id; + // Trigger ID of Usefulness and Distraction survey. + std::string utility_trigger_id; }; // Do not add new configs here at the bottom by default. They should be ordered diff -Nru chromium-137.0.7151.68/components/optimization_guide/content/browser/page_context_eligibility.cc chromium-137.0.7151.103/components/optimization_guide/content/browser/page_context_eligibility.cc --- chromium-137.0.7151.68/components/optimization_guide/content/browser/page_context_eligibility.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/components/optimization_guide/content/browser/page_context_eligibility.cc 2025-06-09 18:33:48.000000000 +0000 @@ -4,6 +4,7 @@ #include "components/optimization_guide/content/browser/page_context_eligibility.h" +#include "base/compiler_specific.h" #include "base/memory/ptr_util.h" #include "base/no_destructor.h" #include "components/optimization_guide/content/browser/page_context_eligibility_api.h" @@ -17,6 +18,7 @@ PageContextEligibility::~PageContextEligibility() = default; // static +DISABLE_CFI_DLSYM PageContextEligibility* PageContextEligibility::Get() { static base::NoDestructor> page_context_eligibility{Create()}; @@ -49,4 +51,20 @@ return base::WrapUnique(new PageContextEligibility(api)); } +DISABLE_CFI_DLSYM +bool IsPageContextEligible( + const std::string& host, + const std::string& path, + const std::vector& frame_metadata, + const PageContextEligibility* api_holder) { + // TODO(crbug.com/421932889): `api_holder` should not be provided by caller + // and instead be retrieved as part of this function call. + if (!api_holder) { + return true; + } + + return api_holder->api().IsPageContextEligible(host, path, + std::move(frame_metadata)); +} + } // namespace optimization_guide diff -Nru chromium-137.0.7151.68/components/optimization_guide/content/browser/page_context_eligibility.h chromium-137.0.7151.103/components/optimization_guide/content/browser/page_context_eligibility.h --- chromium-137.0.7151.68/components/optimization_guide/content/browser/page_context_eligibility.h 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/components/optimization_guide/content/browser/page_context_eligibility.h 2025-06-09 18:33:48.000000000 +0000 @@ -16,6 +16,8 @@ namespace optimization_guide { +// TODO(crbug.com/421932889): Forward declare PageContextEligibility so that +// callers cannot invoke api() directly. class PageContextEligibility { public: explicit PageContextEligibility(const PageContextEligibilityAPI* api); @@ -39,6 +41,15 @@ raw_ptr api_; }; +// Checks if the page is context eligible using the api provided in +// `api_holder`. This function must be called instead of the function in the API +// directly in order to have properly disabled CFI. +bool IsPageContextEligible( + const std::string& host, + const std::string& path, + const std::vector& frame_metadata, + const PageContextEligibility* api_holder); + } // namespace optimization_guide #endif // COMPONENTS_OPTIMIZATION_GUIDE_CONTENT_BROWSER_PAGE_CONTEXT_ELIGIBILITY_H_ diff -Nru chromium-137.0.7151.68/components/strings/components_strings_de.xtb chromium-137.0.7151.103/components/strings/components_strings_de.xtb --- chromium-137.0.7151.68/components/strings/components_strings_de.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/components/strings/components_strings_de.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -3448,7 +3448,7 @@ Ersetzt Stellen im öffentlichen Dienst Netzwerkkonfiguration konnte nicht geparst werden (ungültige JSON-Datei). -Ok +OK Gerät Perzeptiv 1 Datei wurde aufgrund des Inhalts blockiert diff -Nru chromium-137.0.7151.68/components/strings/components_strings_pt-BR.xtb chromium-137.0.7151.103/components/strings/components_strings_pt-BR.xtb --- chromium-137.0.7151.68/components/strings/components_strings_pt-BR.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/components/strings/components_strings_pt-BR.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -1603,7 +1603,7 @@ Revise antes de copiar os arquivos Eletrônicos para atividade física Sincronização em segundo plano -Aumentar a segurança usando um cartão virtual na próxima vez? +Aumentar a segurança com um cartão virtual na próxima vez? Você não pode visitar agora porque o website enviou credenciais embaralhadas que o Chromium não consegue processar. Erros de rede e ataques são geralmente temporários, de modo que esta página provavelmente funcionará mais tarde. O texto, o conteúdo e o URL da página em que você está escrevendo serão enviados ao Google, revisados por humanos e usados para melhorar esse recurso. Evite inserir informações pessoais, como detalhes médicos ou financeiros. Evite também usar essa ferramenta em sites que contenham informações particulares ou sensíveis. Metal (alto brilho) diff -Nru chromium-137.0.7151.68/components/strings/components_strings_th.xtb chromium-137.0.7151.103/components/strings/components_strings_th.xtb --- chromium-137.0.7151.68/components/strings/components_strings_th.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/components/strings/components_strings_th.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -1602,7 +1602,7 @@ ต้องตรวจสอบก่อนคัดลอก ผลิตภัณฑ์เทคโนโลยีด้านการออกกำลังกาย ซิงค์ในแบ็กกราวด์ -ใช้บัตรเสมือนในครั้งถัดไปเพื่อทําให้ปลอดภัยขึ้นไหม +ใช้บัตรเสมือนในครั้งถัดไปเพื่อชำระเงินอย่างปลอดภัยขึ้นไหม คุณไม่สามารถไปที่ ได้ในขณะนี้เนื่องจากเว็บไซต์ได้ส่งข้อมูลรับรองที่มีการแปลงข้อมูลซึ่ง Chromium ไม่สามารถดำเนินการได้ ข้อผิดพลาดของเครือข่ายและการโจมตีมักจะเกิดขึ้นชั่วคราว ดังนั้นหน้านี้อาจจะใช้งานได้ในภายหลัง ระบบจะส่งข้อความ เนื้อหา และ URL ของหน้าที่คุณเขียนไปยัง Google เพื่อตรวจสอบจากเจ้าหน้าที่ และใช้เพื่อปรับปรุงฟีเจอร์นี้ หลีกเลี่ยงการป้อนข้อมูลส่วนบุคคล (เช่น รายละเอียดทางการแพทย์หรือการเงิน) หรือใช้เครื่องมือนี้กับเว็บไซต์ที่มีข้อมูลส่วนตัวหรือข้อมูลที่ละเอียดอ่อน โลหะ (เงามาก) diff -Nru chromium-137.0.7151.68/components/strings/components_strings_vi.xtb chromium-137.0.7151.103/components/strings/components_strings_vi.xtb --- chromium-137.0.7151.68/components/strings/components_strings_vi.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/components/strings/components_strings_vi.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -4793,7 +4793,8 @@ Chỉnh sửa địa chỉ cảm biến chuyển động hoặc ánh sáng Giày dép -Thẻ ảo giúp ngụy trang thẻ thực của bạn để bảo vệ bạn khỏi nguy cơ bị lừa đảo. +Thẻ ảo giúp bạn ẩn thẻ thực, bảo vệ bạn trước nguy cơ bị lừa đảo. + Màu hồng "" đã được cài đặt không đúng trên máy tính hoặc mạng của bạn: diff -Nru chromium-137.0.7151.68/components/sync/model/processor_entity.cc chromium-137.0.7151.103/components/sync/model/processor_entity.cc --- chromium-137.0.7151.68/components/sync/model/processor_entity.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/components/sync/model/processor_entity.cc 2025-06-09 18:33:48.000000000 +0000 @@ -33,7 +33,7 @@ } std::string HashSpecifics(const sync_pb::EntitySpecifics& specifics) { - CHECK_GT(specifics.ByteSizeLong(), 0u, base::NotFatalUntil::M141); + DCHECK_GT(specifics.ByteSizeLong(), 0u); return base::Base64Encode( base::SHA1HashString(specifics.SerializeAsString())); } @@ -64,7 +64,7 @@ std::unique_ptr ProcessorEntity::CreateFromMetadata( const std::string& storage_key, sync_pb::EntityMetadata metadata) { - CHECK(!storage_key.empty(), base::NotFatalUntil::M141); + DCHECK(!storage_key.empty()); if (!MetadataIsValid(metadata)) { return nullptr; } @@ -83,8 +83,8 @@ ProcessorEntity::~ProcessorEntity() = default; void ProcessorEntity::SetStorageKey(const std::string& storage_key) { - CHECK(storage_key_.empty(), base::NotFatalUntil::M141); - CHECK(!storage_key.empty(), base::NotFatalUntil::M141); + DCHECK(storage_key_.empty()); + DCHECK(!storage_key.empty()); storage_key_ = storage_key; } @@ -93,7 +93,7 @@ } void ProcessorEntity::SetCommitData(std::unique_ptr data) { - CHECK(data); + DCHECK(data); // Update data's fields from metadata. data->client_tag_hash = ClientTagHash::FromHashed(metadata_.client_tag_hash()); @@ -104,7 +104,7 @@ data->modification_time = ProtoTimeToTime(metadata_.modification_time()); commit_data_ = std::move(data); - CHECK(HasCommitData()); + DCHECK(HasCommitData()); } bool ProcessorEntity::HasCommitData() const { @@ -120,23 +120,20 @@ } // Do not check for unique position changes explicitly because they are // supposed to be in specifics. - CHECK_GT(data.specifics.ByteSizeLong(), 0u, base::NotFatalUntil::M141); - return HashSpecifics(data.specifics) == metadata_.specifics_hash(); + return MatchesSpecificsHash(data.specifics); } bool ProcessorEntity::MatchesOwnBaseData() const { - // The `base_specifics_hash` is only set if the entity is unsynced. - CHECK(IsUnsynced(), base::NotFatalUntil::M141); + DCHECK(IsUnsynced()); if (metadata_.is_deleted()) { return false; } - CHECK(!metadata_.specifics_hash().empty(), base::NotFatalUntil::M141); + DCHECK(!metadata_.specifics_hash().empty()); return metadata_.specifics_hash() == metadata_.base_specifics_hash(); } bool ProcessorEntity::MatchesBaseData(const EntityData& data) const { - // The `base_specifics_hash` is only set if the entity is unsynced. - CHECK(IsUnsynced(), base::NotFatalUntil::M141); + DCHECK(IsUnsynced()); if (data.is_deleted() || metadata_.base_specifics_hash().empty()) { return false; } @@ -165,18 +162,17 @@ void ProcessorEntity::RecordIgnoredRemoteUpdate( const UpdateResponseData& update) { - CHECK(metadata_.server_id().empty() || - metadata_.server_id() == update.entity.id, - base::NotFatalUntil::M141); + DCHECK(metadata_.server_id().empty() || + metadata_.server_id() == update.entity.id); metadata_.set_server_id(update.entity.id); metadata_.set_server_version(update.response_version); // Either these already matched, acked was just bumped to squash a pending // commit and this should follow, or the pending commit needs to be requeued. commit_requested_sequence_number_ = metadata_.acked_sequence_number(); - // If a local change was made while the server assigned a new id to the - // entity, update the id in cached commit data. + // If local change was made while server assigned a new id to the entity, + // update id in cached commit data. if (HasCommitData() && commit_data_->id != metadata_.server_id()) { - CHECK(commit_data_->id.empty(), base::NotFatalUntil::M141); + DCHECK(commit_data_->id.empty()); commit_data_->id = metadata_.server_id(); } } @@ -185,7 +181,7 @@ const UpdateResponseData& update, sync_pb::EntitySpecifics trimmed_specifics, std::optional unique_position) { - CHECK(!IsUnsynced(), base::NotFatalUntil::M141); + DCHECK(!IsUnsynced()); RecordIgnoredRemoteUpdate(update); metadata_.set_is_deleted(update.entity.is_deleted()); metadata_.set_modification_time( @@ -234,6 +230,8 @@ std::unique_ptr data, sync_pb::EntitySpecifics trimmed_specifics, std::optional unique_position) { + DCHECK(!metadata_.client_tag_hash().empty()); + // Update metadata fields from updated data. base::Time modification_time = !data->modification_time.is_null() ? data->modification_time @@ -318,11 +316,10 @@ void ProcessorEntity::InitializeCommitRequestData(CommitRequestData* request) { if (!metadata_.is_deleted()) { - CHECK(HasCommitData(), base::NotFatalUntil::M141); - CHECK_EQ(commit_data_->client_tag_hash.value(), metadata_.client_tag_hash(), - base::NotFatalUntil::M141); - CHECK_EQ(commit_data_->id, metadata_.server_id(), - base::NotFatalUntil::M141); + DCHECK(HasCommitData()); + DCHECK_EQ(commit_data_->client_tag_hash.value(), + metadata_.client_tag_hash()); + DCHECK_EQ(commit_data_->id, metadata_.server_id()); request->entity = std::move(commit_data_); } else { // Make an EntityData with empty specifics to indicate deletion. This is @@ -406,6 +403,13 @@ return memory_usage; } +bool ProcessorEntity::MatchesSpecificsHash( + const sync_pb::EntitySpecifics& specifics) const { + DCHECK(!metadata_.is_deleted()); + DCHECK_GT(specifics.ByteSizeLong(), 0u); + return HashSpecifics(specifics) == metadata_.specifics_hash(); +} + void ProcessorEntity::UpdateSpecificsHash( const sync_pb::EntitySpecifics& specifics) { if (specifics.ByteSizeLong() > 0) { diff -Nru chromium-137.0.7151.68/components/sync/model/processor_entity.h chromium-137.0.7151.103/components/sync/model/processor_entity.h --- chromium-137.0.7151.68/components/sync/model/processor_entity.h 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/components/sync/model/processor_entity.h 2025-06-09 18:33:48.000000000 +0000 @@ -44,9 +44,8 @@ const std::string& server_id, base::Time creation_time); - // Construct an instance representing an item loaded from storage on init. The - // passed-in `storage_key` must not be empty. May return nullptr if the - // passed-in `metadata` is invalid. + // Construct an instance representing an item loaded from storage on init. May + // return nullptr if the passed-in `metadata` is invalid. static std::unique_ptr CreateFromMetadata( const std::string& storage_key, sync_pb::EntityMetadata metadata); @@ -108,9 +107,8 @@ // previously committed to server and tombstone should be sent. bool RecordLocalDeletion(const DeletionOrigin& origin); - // Initializes a message representing this item's uncommitted state. Assumes - // that the message is forwarded to the sync engine for committing, i.e. - // clears local commit data. + // Initializes a message representing this item's uncommitted state + // and assumes that it is forwarded to the sync engine for committing. void InitializeCommitRequestData(CommitRequestData* request); // Receives a successful commit response. @@ -137,21 +135,20 @@ void ClearStorageKey(); // Takes the passed commit data updates its fields with values from metadata - // and caches it in the instance. `data` must not be null. + // and caches it in the instance. void SetCommitData(std::unique_ptr data); - // Checks if the instance has cached commit data. + // Check if the instance has cached commit data. bool HasCommitData() const; - // Checks whether `data` matches the stored specifics hash. + // Check whether `data` matches the stored specifics hash. bool MatchesData(const EntityData& data) const; - // Checks whether the current metadata matches the stored base specifics hash. - // Must only be called if `IsUnsynced()` is true. + // Check whether the current metadata of an unsynced entity matches the stored + // base specifics hash. bool MatchesOwnBaseData() const; - // Check whether `data` matches the stored base specifics hash. Must only be - // called if `IsUnsynced()` is true. + // Check whether `data` matches the stored base specifics hash. bool MatchesBaseData(const EntityData& data) const; // Increment sequence number in the metadata. This will also update the @@ -167,6 +164,9 @@ ProcessorEntity(const std::string& storage_key, sync_pb::EntityMetadata metadata); + // Check whether `specifics` matches the stored specifics_hash. + bool MatchesSpecificsHash(const sync_pb::EntitySpecifics& specifics) const; + // Updates hash string for EntitySpecifics in the metadata. void UpdateSpecificsHash(const sync_pb::EntitySpecifics& specifics); diff -Nru chromium-137.0.7151.68/content/browser/accessibility/browser_accessibility_android.cc chromium-137.0.7151.103/content/browser/accessibility/browser_accessibility_android.cc --- chromium-137.0.7151.68/content/browser/accessibility/browser_accessibility_android.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/content/browser/accessibility/browser_accessibility_android.cc 2025-06-09 18:33:48.000000000 +0000 @@ -2285,6 +2285,11 @@ auto* manager = static_cast(this->manager()); manager->ClearNodeInfoCacheForGivenId(GetUniqueId()); + + if (BrowserAccessibilityAndroid* parent = + static_cast(PlatformGetParent())) { + manager->ClearNodeInfoCacheForGivenId(parent->GetUniqueId()); + } } int BrowserAccessibilityAndroid::CountChildrenWithRole( diff -Nru chromium-137.0.7151.68/content/browser/accessibility/browser_accessibility_android_unittest.cc chromium-137.0.7151.103/content/browser/accessibility/browser_accessibility_android_unittest.cc --- chromium-137.0.7151.68/content/browser/accessibility/browser_accessibility_android_unittest.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/content/browser/accessibility/browser_accessibility_android_unittest.cc 2025-06-09 18:33:48.000000000 +0000 @@ -9,6 +9,7 @@ #include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "content/browser/accessibility/browser_accessibility_manager_android.h" +#include "content/browser/accessibility/web_contents_accessibility_android.h" #include "content/public/test/browser_task_environment.h" #include "content/test/test_content_client.h" #include "testing/gtest/include/gtest/gtest.h" @@ -48,6 +49,12 @@ } }; +class MockWebContentsAccessibilityAndroid + : public WebContentsAccessibilityAndroid { + public: + MockWebContentsAccessibilityAndroid() {} +}; + class BrowserAccessibilityAndroidTest : public ::testing::Test { public: BrowserAccessibilityAndroidTest(); @@ -63,6 +70,7 @@ std::unique_ptr test_browser_accessibility_delegate_; ui::TestAXNodeIdDelegate node_id_delegate_; + MockWebContentsAccessibilityAndroid mock_web_contents_accessibility_android_; private: void SetUp() override; @@ -80,7 +88,8 @@ void BrowserAccessibilityAndroidTest::SetUp() { test_browser_accessibility_delegate_ = std::make_unique(); - + test_browser_accessibility_delegate_->SetWebContentsAccessibility( + &mock_web_contents_accessibility_android_); SetContentClient(&client_); } @@ -691,4 +700,120 @@ image_succeeded_with_name->GetSupplementalDescription()); } +TEST_F(BrowserAccessibilityAndroidTest, TestJavaNodeCache_AttributeChange) { + ui::AXTreeUpdate tree; + tree.root_id = 1; + tree.nodes.resize(2); + tree.nodes[0].id = 1; + tree.nodes[0].role = ax::mojom::Role::kRootWebArea; + tree.nodes[0].child_ids = {2}; + + tree.nodes[1].id = 2; + tree.nodes[1].role = ax::mojom::Role::kButton; + + std::unique_ptr manager( + BrowserAccessibilityManagerAndroid::Create( + tree, node_id_delegate_, test_browser_accessibility_delegate_.get())); + + BrowserAccessibilityManagerAndroid* android_manager = + ToBrowserAccessibilityManagerAndroid(manager.get()); + const auto& actual = android_manager->nodes_already_cleared_for_test(); + EXPECT_EQ(2, actual.size()); + EXPECT_TRUE(actual.contains(1)); + EXPECT_TRUE(actual.contains(2)); + + ui::AXUpdatesAndEvents updates_and_events; + updates_and_events.updates.resize(1); + updates_and_events.updates[0].nodes.resize(1); + updates_and_events.updates[0].nodes[0].id = 2; + updates_and_events.updates[0].nodes[0].AddStringAttribute( + ax::mojom::StringAttribute::kName, "hello"); + + manager->OnAccessibilityEvents(updates_and_events); + + EXPECT_EQ(2, actual.size()); + EXPECT_TRUE(actual.contains(1)); + EXPECT_TRUE(actual.contains(2)); +} + +TEST_F(BrowserAccessibilityAndroidTest, TestJavaNodeCache_NodeDeleted) { + ui::AXTreeUpdate tree; + tree.root_id = 1; + tree.nodes.resize(2); + tree.nodes[0].id = 1; + tree.nodes[0].role = ax::mojom::Role::kRootWebArea; + tree.nodes[0].child_ids = {2}; + + tree.nodes[1].id = 2; + tree.nodes[1].role = ax::mojom::Role::kButton; + + std::unique_ptr manager( + BrowserAccessibilityManagerAndroid::Create( + tree, node_id_delegate_, test_browser_accessibility_delegate_.get())); + + BrowserAccessibilityManagerAndroid* android_manager = + ToBrowserAccessibilityManagerAndroid(manager.get()); + const auto& actual = android_manager->nodes_already_cleared_for_test(); + EXPECT_EQ(2, actual.size()); + EXPECT_TRUE(actual.contains(1)); + EXPECT_TRUE(actual.contains(2)); + + ui::AXUpdatesAndEvents updates_and_events; + updates_and_events.updates.resize(1); + updates_and_events.updates[0].nodes.resize(1); + updates_and_events.updates[0].nodes[0].id = 1; + updates_and_events.updates[0].nodes[0].role = ax::mojom::Role::kRootWebArea; + + manager->OnAccessibilityEvents(updates_and_events); + + EXPECT_EQ(2, actual.size()); + EXPECT_TRUE(actual.contains(1)); + EXPECT_TRUE(actual.contains(2)); +} + +TEST_F(BrowserAccessibilityAndroidTest, TestJavaNodeCache_NodeUnignored) { + ui::AXTreeUpdate tree; + tree.root_id = 1; + tree.nodes.resize(3); + tree.nodes[0].id = 1; + tree.nodes[0].role = ax::mojom::Role::kRootWebArea; + tree.nodes[0].child_ids = {2}; + + tree.nodes[1].id = 2; + tree.nodes[1].role = ax::mojom::Role::kButton; + tree.nodes[1].AddState(ax::mojom::State::kIgnored); + tree.nodes[1].child_ids = {3}; + + tree.nodes[2].id = 3; + tree.nodes[2].role = ax::mojom::Role::kStaticText; + + std::unique_ptr manager( + BrowserAccessibilityManagerAndroid::Create( + tree, node_id_delegate_, test_browser_accessibility_delegate_.get())); + + BrowserAccessibilityManagerAndroid* android_manager = + ToBrowserAccessibilityManagerAndroid(manager.get()); + const auto& actual = android_manager->nodes_already_cleared_for_test(); + EXPECT_EQ(3, actual.size()); + EXPECT_TRUE(actual.contains(1)); + EXPECT_TRUE(actual.contains(2)); + EXPECT_TRUE(actual.contains(3)); + + ui::AXUpdatesAndEvents updates_and_events; + updates_and_events.updates.resize(1); + updates_and_events.updates[0].nodes.resize(1); + updates_and_events.updates[0].nodes[0].id = 2; + updates_and_events.updates[0].nodes[0].role = ax::mojom::Role::kButton; + + manager->OnAccessibilityEvents(updates_and_events); + + EXPECT_EQ(3, actual.size()); + // From an AXEventGenerator::Event::CHILDREN_CHANGED. + EXPECT_TRUE(actual.contains(1)); + // From an AXTreeObserver::Change; the only actual tree update. + EXPECT_TRUE(actual.contains(2)); + // From an AXEventGenerator::Event::PARENT_CHANGED. + EXPECT_TRUE(actual.contains(3)); +} + } // namespace content diff -Nru chromium-137.0.7151.68/content/browser/accessibility/browser_accessibility_manager_android.cc chromium-137.0.7151.103/content/browser/accessibility/browser_accessibility_manager_android.cc --- chromium-137.0.7151.68/content/browser/accessibility/browser_accessibility_manager_android.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/content/browser/accessibility/browser_accessibility_manager_android.cc 2025-06-09 18:33:48.000000000 +0000 @@ -182,8 +182,7 @@ GetFromAXNode(GetLastFocusedNode())) { BrowserAccessibilityAndroid* android_last_focused_node = static_cast(last_focused_node); - wcax->ClearNodeInfoCacheForGivenId( - android_last_focused_node->GetUniqueId()); + ClearNodeInfoCacheForGivenId(android_last_focused_node->GetUniqueId()); } BrowserAccessibilityAndroid* android_node = @@ -249,10 +248,6 @@ BrowserAccessibilityAndroid* android_node = static_cast(wrapper); - if (event_type == ui::AXEventGenerator::Event::CHILDREN_CHANGED) { - BrowserAccessibilityAndroid::ResetLeafCache(); - } - // Always send AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED to notify // the Android system that the accessibility hierarchy rooted at this // node has changed. @@ -342,9 +337,6 @@ break; } case ui::AXEventGenerator::Event::NAME_CHANGED: { - // Clear node from cache whenever the name changes to ensure fresh data. - wcax->ClearNodeInfoCacheForGivenId(android_node->GetUniqueId()); - // If this is a simple text element, also send an event to the framework. if (ui::IsText(android_node->GetRole()) || android_node->IsAndroidTextView()) { @@ -387,6 +379,10 @@ } break; + case ui::AXEventGenerator::Event::CHILDREN_CHANGED: + wcax->ClearNodeInfoCacheForGivenId(android_node->GetUniqueId()); + break; + // Currently unused events on this platform. case ui::AXEventGenerator::Event::NONE: case ui::AXEventGenerator::Event::ACCESS_KEY_CHANGED: @@ -399,7 +395,6 @@ case ui::AXEventGenerator::Event::BUSY_CHANGED: case ui::AXEventGenerator::Event::CARET_BOUNDS_CHANGED: case ui::AXEventGenerator::Event::CHECKED_STATE_DESCRIPTION_CHANGED: - case ui::AXEventGenerator::Event::CHILDREN_CHANGED: case ui::AXEventGenerator::Event::CONTROLS_CHANGED: case ui::AXEventGenerator::Event::DETAILS_CHANGED: case ui::AXEventGenerator::Event::DESCRIBED_BY_CHANGED: @@ -629,36 +624,52 @@ } } -void BrowserAccessibilityManagerAndroid::OnNodeWillBeDeleted(ui::AXTree* tree, - ui::AXNode* node) { - // https://crbug.com/361196029 looks like a nullptr deref. It's unexpected - // that ui::AXTree would pass a null node to an observer, and that the - // manager would not have a BrowserAccessibility wrapper for it. - DUMP_WILL_BE_CHECK(node); - ui::BrowserAccessibility* wrapper = GetFromAXNode(node); - DUMP_WILL_BE_CHECK(wrapper); +std::unique_ptr +BrowserAccessibilityManagerAndroid::CreateBrowserAccessibility( + ui::AXNode* node) { + return ui::BrowserAccessibility::Create(this, node); +} - BrowserAccessibilityAndroid* android_node = - static_cast(wrapper); +void BrowserAccessibilityManagerAndroid::OnAtomicUpdateStarting( + ui::AXTree* tree, + const std::set& deleting_nodes, + const std::set& reparenting_nodes) { + WebContentsAccessibilityAndroid* wcax = GetWebContentsAXFromRootManager(); + if (wcax) { + // This set needs to start fresh. This secondary cache is of requests to + // java to clear that primary cache of Android objects. The idea being only + // such such request is needed for each atomic update to the tree and node + // data. + nodes_already_cleared_.clear(); - ClearNodeInfoCacheForGivenId(android_node->GetUniqueId()); + // Update the maximum number of nodes in the cache after each atomic update. + wcax->UpdateMaxNodesInCache(); - // When a node will be deleted, clear its parent from the cache as well, or - // the parent could erroneously report the cleared node as a child later on. - BrowserAccessibilityAndroid* parent_node = - static_cast( - android_node->PlatformGetParent()); - if (parent_node != nullptr) { - ClearNodeInfoCacheForGivenId(parent_node->GetUniqueId()); - } + for (ui::AXNodeID id : deleting_nodes) { + ui::BrowserAccessibility* wrapper = GetFromID(id); + if (!wrapper) { + continue; + } - BrowserAccessibilityManager::OnNodeWillBeDeleted(tree, node); -} + BrowserAccessibilityAndroid* android_node = + static_cast(wrapper); -std::unique_ptr -BrowserAccessibilityManagerAndroid::CreateBrowserAccessibility( - ui::AXNode* node) { - return ui::BrowserAccessibility::Create(this, node); + ClearNodeInfoCacheForGivenId(android_node->GetUniqueId()); + + // When a node will be deleted, clear its parent from the cache as well, + // or the parent could erroneously report the cleared node as a child + // later on. + BrowserAccessibilityAndroid* parent_node = + static_cast( + android_node->PlatformGetParent()); + if (parent_node != nullptr) { + ClearNodeInfoCacheForGivenId(parent_node->GetUniqueId()); + } + } + } + + BrowserAccessibilityManager::OnAtomicUpdateStarting(tree, deleting_nodes, + reparenting_nodes); } void BrowserAccessibilityManagerAndroid::OnAtomicUpdateFinished( @@ -676,9 +687,6 @@ // Reset content changed events counter every time we finish an atomic update. wcax->ResetContentChangedEventsCounter(); - // Clear unordered_set of nodes cleared from the cache after atomic update. - nodes_already_cleared_.clear(); - // When the root changes, send the new root id and a navigate signal to Java. if (root_changed) { auto* root_manager = static_cast( @@ -692,8 +700,26 @@ wcax->HandleNavigate(root->GetUniqueId()); } - // Update the maximum number of nodes in the cache after each atomic update. - wcax->UpdateMaxNodesInCache(); + // Invalidate java-side cache for structural generated events. This + // encompasses less nodes than `changes`, but includes unignored retargeted + // event targets that isn't in `changes`. Eventually, we should prefer + // invalidations of generated events to those in + // BrowserAccessibility::OnDataChanged. + for (const auto& targeted_event : event_generator()) { + BrowserAccessibilityAndroid* wrapper = + static_cast( + GetFromID(targeted_event.node_id)); + CHECK(wrapper); + + auto event_type = targeted_event.event_params->event; + if (event_type == ui::AXEventGenerator::Event::CHILDREN_CHANGED || + event_type == ui::AXEventGenerator::Event::PARENT_CHANGED) { + // Structural changes in the unignored/platform tree requires the leaf + // cache be invalidated. + BrowserAccessibilityAndroid::ResetLeafCache(); + ClearNodeInfoCacheForGivenId(wrapper->GetUniqueId()); + } + } } WebContentsAccessibilityAndroid* diff -Nru chromium-137.0.7151.68/content/browser/accessibility/browser_accessibility_manager_android.h chromium-137.0.7151.103/content/browser/accessibility/browser_accessibility_manager_android.h --- chromium-137.0.7151.68/content/browser/accessibility/browser_accessibility_manager_android.h 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/content/browser/accessibility/browser_accessibility_manager_android.h 2025-06-09 18:33:48.000000000 +0000 @@ -78,6 +78,10 @@ allow_image_descriptions_for_testing_ = is_allowed; } + const std::unordered_set& nodes_already_cleared_for_test() const { + return nodes_already_cleared_; + } + // By default, the tree is pruned for a better screen reading experience, // including: // * If the node has only static text children @@ -156,13 +160,15 @@ private: // AXTreeObserver overrides. + void OnAtomicUpdateStarting( + ui::AXTree* tree, + const std::set& deleting_nodes, + const std::set& reparenting_nodes) override; void OnAtomicUpdateFinished( ui::AXTree* tree, bool root_changed, const std::vector& changes) override; - void OnNodeWillBeDeleted(ui::AXTree* tree, ui::AXNode* node) override; - WebContentsAccessibilityAndroid* GetWebContentsAXFromRootManager(); // This gives BrowserAccessibilityManager::Create access to the class diff -Nru chromium-137.0.7151.68/content/browser/accessibility/web_contents_accessibility_android.cc chromium-137.0.7151.103/content/browser/accessibility/web_contents_accessibility_android.cc --- chromium-137.0.7151.68/content/browser/accessibility/web_contents_accessibility_android.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/content/browser/accessibility/web_contents_accessibility_android.cc 2025-06-09 18:33:48.000000000 +0000 @@ -1023,6 +1023,8 @@ return GetCanonicalJNIString(env, all_keys).AsLocalRef(env); } +WebContentsAccessibilityAndroid::WebContentsAccessibilityAndroid() {} + jint WebContentsAccessibilityAndroid::GetRootId(JNIEnv* env) { if (BrowserAccessibilityManagerAndroid* root_manager = GetRootBrowserAccessibilityManager()) { diff -Nru chromium-137.0.7151.68/content/browser/accessibility/web_contents_accessibility_android.h chromium-137.0.7151.103/content/browser/accessibility/web_contents_accessibility_android.h --- chromium-137.0.7151.68/content/browser/accessibility/web_contents_accessibility_android.h 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/content/browser/accessibility/web_contents_accessibility_android.h 2025-06-09 18:33:48.000000000 +0000 @@ -407,6 +407,10 @@ base::WeakPtr GetWeakPtr(); private: + friend class MockWebContentsAccessibilityAndroid; + + WebContentsAccessibilityAndroid(); + BrowserAccessibilityManagerAndroid* GetRootBrowserAccessibilityManager(); BrowserAccessibilityAndroid* GetAXFromUniqueID(int32_t unique_id); diff -Nru chromium-137.0.7151.68/content/browser/indexed_db/instance/leveldb/backing_store.cc chromium-137.0.7151.103/content/browser/indexed_db/instance/leveldb/backing_store.cc --- chromium-137.0.7151.68/content/browser/indexed_db/instance/leveldb/backing_store.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/content/browser/indexed_db/instance/leveldb/backing_store.cc 2025-06-09 18:33:48.000000000 +0000 @@ -93,10 +93,7 @@ std::unique_ptr& GetTransactionalLevelDBFactory() { static base::NoDestructor> - factory; - if (!*factory) { - *factory = std::make_unique(); - } + factory(std::make_unique()); return *factory; } diff -Nru chromium-137.0.7151.68/content/browser/preloading/prerender/prerender_browsertest.cc chromium-137.0.7151.103/content/browser/preloading/prerender/prerender_browsertest.cc --- chromium-137.0.7151.68/content/browser/preloading/prerender/prerender_browsertest.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/content/browser/preloading/prerender/prerender_browsertest.cc 2025-06-09 18:33:48.000000000 +0000 @@ -1190,6 +1190,88 @@ "Prerender.Experimental.MatchableHostCountOnActivation", 1, 1); } +// Tests the case where prerendering navigation fails while a potential +// activation navigation is waiting for the No-Vary-Search header. +// This is a regression test for crbug.com/420906968. +IN_PROC_BROWSER_TEST_F(NoVarySearchPrerenderBrowserTest, + FailureOnPrerenderNavigation) { + const std::string kTestingRelativeUrl = + "/delayed_with_no_vary_search?prerender"; + const std::string kPrerenderingRelativeUrl = kTestingRelativeUrl + "&a=5"; + // Create a HTTP response to control prerendering main-frame navigation. + net::test_server::ControllableHttpResponse main_prerender_response( + embedded_test_server(), kPrerenderingRelativeUrl); + + ASSERT_TRUE(embedded_test_server()->Start()); + + const GURL initial_url = embedded_test_server()->GetURL("/empty.html"); + const GURL prerendering_url = + embedded_test_server()->GetURL(kPrerenderingRelativeUrl); + const GURL navigation_url = + embedded_test_server()->GetURL(kTestingRelativeUrl + "&a=3"); + + // Navigate to an initial page. + ASSERT_TRUE(NavigateToURL(shell(), initial_url)); + ASSERT_EQ(web_contents()->GetLastCommittedURL(), initial_url); + + // Start prerendering with the No-Vary-Search hint. + content::test::PrerenderHostCreationWaiter host_creation_waiter; + AddPrerenderAsync(prerendering_url, R"(params=(\\\"a\\\"))"); + FrameTreeNodeId host_id = host_creation_waiter.Wait(); + auto* host = + web_contents_impl()->GetPrerenderHostRegistry()->FindNonReservedHostById( + host_id); + ASSERT_TRUE(host); + ASSERT_TRUE(host->no_vary_search_hint().has_value()); + + // Add a testing PrerenderHost::Observer to the prerender host that we'd like + // to monitor. + NoVarySearchHintPrerenderHostObserver observer(*host); + + // Start navigation in primary page. + TestActivationManager primary_page_manager(web_contents(), navigation_url); + std::unique_ptr nav_observer = + test::PrerenderTestHelper::NavigatePrimaryPageAsync(*web_contents_impl(), + navigation_url); + + // Wait until the navigation is deferred by CommitDeferringCondition. + ASSERT_TRUE(primary_page_manager.WaitForBeforeChecks()); + primary_page_manager.ResumeActivation(); + ASSERT_FALSE(host->were_headers_received()); + + auto* prerender_web_contents = + content::WebContents::FromFrameTreeNodeId(host_id); + content::test::PrerenderHostObserver host_observer(*prerender_web_contents, + host_id); + + // Abort the request. This fails the prerender navigation. + main_prerender_response.WaitForRequest(); + main_prerender_response.Done(); + + ASSERT_TRUE(primary_page_manager.WaitForAfterChecks()); + primary_page_manager.ResumeActivation(); + + // Wait for the navigation to finish. + nav_observer->Wait(); + primary_page_manager.WaitForNavigationFinished(); + + // Check that the prerender host was not activated. + ASSERT_FALSE(host_observer.was_activated()); + host_observer.WaitForDestroyed(); + + ASSERT_TRUE(observer.wait_for_headers_start_reason().has_value()); + ASSERT_TRUE(observer.wait_for_headers_finish_reason().has_value()); + + EXPECT_EQ(observer.wait_for_headers_start_reason().value(), + StartedReason::kWithTimeout); + EXPECT_EQ(observer.wait_for_headers_finish_reason().value(), + FinishedReason::kPrerenderNavigationFailed); + + histogram_tester().ExpectUniqueSample( + "Prerender.Experimental.WaitingForHeadersFinishedReason.SpeculationRule", + FinishedReason::kPrerenderNavigationFailed, 1); +} + // Test that the timer is enabled and cleared appropriately when navigating to // a No-Vary-Search hint matched prerender with timeout waiting for headers. // Flaky on android: crbug.com/395337644 diff -Nru chromium-137.0.7151.68/content/browser/preloading/prerender/prerender_host.cc chromium-137.0.7151.103/content/browser/preloading/prerender/prerender_host.cc --- chromium-137.0.7151.68/content/browser/preloading/prerender/prerender_host.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/content/browser/preloading/prerender/prerender_host.cc 2025-06-09 18:33:48.000000000 +0000 @@ -572,7 +572,7 @@ // ReadyToCommitNavigation is called when the headers are received. were_headers_received_ = true; for (auto& observer : observers_) { - observer.OnHeadersReceived(); + observer.OnHeadersReceived(*navigation_handle); } } diff -Nru chromium-137.0.7151.68/content/browser/preloading/prerender/prerender_host.h chromium-137.0.7151.103/content/browser/preloading/prerender/prerender_host.h --- chromium-137.0.7151.68/content/browser/preloading/prerender/prerender_host.h 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/content/browser/preloading/prerender/prerender_host.h 2025-06-09 18:33:48.000000000 +0000 @@ -119,7 +119,10 @@ kNoVarySearchHeaderReceivedButNotMatched = 7, kNoVarySearchHeaderReceivedButDefaultValue = 8, - kMaxValue = kNoVarySearchHeaderReceivedButDefaultValue, + kUnknownFailure = 9, + kPrerenderNavigationFailed = 10, + + kMaxValue = kPrerenderNavigationFailed, }; // LINT.ThenChange(//tools/metrics/histograms/metadata/navigation/enums.xml:PrerenderWaitingForHeadersFinishedReason) @@ -132,7 +135,7 @@ // Called from PrerenderHost::ReadyToCommitNavigation when headers are // received for the initial navigation. - virtual void OnHeadersReceived() {} + virtual void OnHeadersReceived(NavigationHandle& navigation_handle) {} // Called from PrerenderHost::OnWaitingForHeadersStarted when we start // blocking navigation waiting for headers. diff -Nru chromium-137.0.7151.68/content/browser/preloading/prerender/prerender_no_vary_search_hint_commit_deferring_condition.cc chromium-137.0.7151.103/content/browser/preloading/prerender/prerender_no_vary_search_hint_commit_deferring_condition.cc --- chromium-137.0.7151.68/content/browser/preloading/prerender/prerender_no_vary_search_hint_commit_deferring_condition.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/content/browser/preloading/prerender/prerender_no_vary_search_hint_commit_deferring_condition.cc 2025-06-09 18:33:48.000000000 +0000 @@ -177,7 +177,8 @@ return "PrerenderNoVarySearchHintCommitDeferringCondition"; } -void PrerenderNoVarySearchHintCommitDeferringCondition::OnHeadersReceived() { +void PrerenderNoVarySearchHintCommitDeferringCondition::OnHeadersReceived( + NavigationHandle& navigation_handle) { // Verify all conditions are met: // * headers should have been received and // * the prerender_frame_tree_node is still alive. @@ -199,9 +200,11 @@ if (waiting_on_headers_) { waiting_on_headers_ = false; + auto* navigation_request = NavigationRequest::From(&navigation_handle); + // Determine the finished reason. using FinishedReason = PrerenderHost::WaitingForHeadersFinishedReason; - std::optional reason; + FinishedReason reason = FinishedReason::kUnknownFailure; if (prerender_host.no_vary_search_parse_error().has_value()) { using ParseError = network::mojom::NoVarySearchParseError; switch (prerender_host.no_vary_search_parse_error().value()) { @@ -234,9 +237,10 @@ } else { reason = FinishedReason::kNoVarySearchHeaderReceivedButNotMatched; } + } else if (navigation_request->DidEncounterError()) { + reason = FinishedReason::kPrerenderNavigationFailed; } - CHECK(reason.has_value()); - prerender_host.OnWaitingForHeadersFinished(*reason); + prerender_host.OnWaitingForHeadersFinished(reason); } // We don't need the timer anymore. diff -Nru chromium-137.0.7151.68/content/browser/preloading/prerender/prerender_no_vary_search_hint_commit_deferring_condition.h chromium-137.0.7151.103/content/browser/preloading/prerender/prerender_no_vary_search_hint_commit_deferring_condition.h --- chromium-137.0.7151.68/content/browser/preloading/prerender/prerender_no_vary_search_hint_commit_deferring_condition.h 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/content/browser/preloading/prerender/prerender_no_vary_search_hint_commit_deferring_condition.h 2025-06-09 18:33:48.000000000 +0000 @@ -49,7 +49,7 @@ NavigationRequest& navigation_request, FrameTreeNodeId candidate_prerender_frame_tree_node_id); // PrerenderHost::Observer - void OnHeadersReceived() override; + void OnHeadersReceived(NavigationHandle& navigation_handle) override; void OnHostDestroyed(PrerenderFinalStatus status) override; // Called when `block_until_head_timer_` fires. diff -Nru chromium-137.0.7151.68/content/public/test/prerender_test_util.cc chromium-137.0.7151.103/content/public/test/prerender_test_util.cc --- chromium-137.0.7151.68/content/public/test/prerender_test_util.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/content/public/test/prerender_test_util.cc 2025-06-09 18:33:48.000000000 +0000 @@ -299,7 +299,7 @@ std::move(waiting_for_activation_).Run(); } - void OnHeadersReceived() override { + void OnHeadersReceived(NavigationHandle& navigation_handle) override { received_headers_ = true; if (waiting_for_headers_) { std::move(waiting_for_headers_).Run(); diff -Nru chromium-137.0.7151.68/debian/changelog chromium-137.0.7151.103/debian/changelog --- chromium-137.0.7151.68/debian/changelog 2025-06-03 16:23:46.000000000 +0000 +++ chromium-137.0.7151.103/debian/changelog 2025-06-10 19:08:42.000000000 +0000 @@ -1,3 +1,25 @@ +chromium (137.0.7151.103-1~deb12u1) bookworm-security; urgency=high + + * New upstream security release. + - CVE-2025-5958: Use after free in Media. + Reported by Huang Xilin of Ant Group Light-Year Security Lab. + - CVE-2025-5959: Type Confusion in V8. + Reported by Seunghyun Lee as part of TyphoonPWN 2025. + * Add build-dep on libc++-19-dev and switch to building statically + against clang's libc++ (instead of gcc's libstdc++). + * d/patches: + - fixes/absl-optional.patch: drop, only needed for libstdc++. + - fixes/font-gc-asan.patch: drop, only needed for libstdc++. + - fixes/stdatomic.patch: drop, only needed for libstdc++. + - fixes/make-pair.patch: drop, only needed for libstdc++. + - bookworm/constflatset.patch: drop, only needed for libstdc++. + - bookworm/constexpr2.patch: drop, only needed for libstdc++. + - bookworm/constexpr3.patch: drop, only needed for libstdc++. + - bookworm/foreach.patch: add patch from bookworm branch to fix + clang-19 build failure. + + -- Andres Salomon Tue, 10 Jun 2025 15:08:42 -0400 + chromium (137.0.7151.68-1~deb12u1) bookworm-security; urgency=high [ Andres Salomon] diff -Nru chromium-137.0.7151.68/debian/control chromium-137.0.7151.103/debian/control --- chromium-137.0.7151.68/debian/control 2025-05-28 18:28:47.000000000 +0000 +++ chromium-137.0.7151.103/debian/control 2025-06-10 19:08:42.000000000 +0000 @@ -17,6 +17,7 @@ clang-19:native, clang-format-19:native, libclang-rt-19-dev, + libc++-19-dev, rustc-web:any (>= 1.74), libstd-rust-dev (>= 1.74) , bindgen:native, diff -Nru chromium-137.0.7151.68/debian/patches/series chromium-137.0.7151.103/debian/patches/series --- chromium-137.0.7151.68/debian/patches/series 2025-05-28 22:59:59.000000000 +0000 +++ chromium-137.0.7151.103/debian/patches/series 2025-06-10 19:08:42.000000000 +0000 @@ -16,12 +16,12 @@ fixes/fix-assert-in-vnc-sessions.patch fixes/armhf-timespec.patch fixes/updater-test.patch -fixes/absl-optional.patch -fixes/font-gc-asan.patch +#fixes/absl-optional.patch +#fixes/font-gc-asan.patch fixes/libsync-rk3588-panthor.patch fixes/headless-gn.patch -fixes/stdatomic.patch -fixes/make-pair.patch +#fixes/stdatomic.patch +#fixes/make-pair.patch fixes/media-cstdint.patch fixes/armhf-no-thumb.patch @@ -60,7 +60,7 @@ bookworm/dq-forward-iterator.patch bookworm/gn-revert-path-exists.patch bookworm/clang19.patch -bookworm/constflatset.patch +#bookworm/constflatset.patch bookworm/libxml-parseerr.patch bookworm/gn-allowlist.patch bookworm/adler1.patch @@ -69,8 +69,8 @@ bookworm/gn-absl.patch bookworm/partially-deployed-mseal-syscall.patch bookworm/constexpr.patch -bookworm/constexpr2.patch -bookworm/constexpr3.patch +#bookworm/constexpr2.patch +#bookworm/constexpr3.patch bookworm/bubble-contents.patch bookworm/rust-visibility.patch bookworm/less-void.patch diff -Nru chromium-137.0.7151.68/debian/rules chromium-137.0.7151.103/debian/rules --- chromium-137.0.7151.68/debian/rules 2025-06-03 16:23:46.000000000 +0000 +++ chromium-137.0.7151.103/debian/rules 2025-06-10 19:08:42.000000000 +0000 @@ -38,8 +38,8 @@ # initial flags from dpkg-buildflags export DEB_CXXFLAGS_MAINT_STRIP=-g -export CXXFLAGS:=$(shell dpkg-buildflags --get CXXFLAGS) -export LDFLAGS:=$(shell dpkg-buildflags --get LDFLAGS) +export CXXFLAGS:=$(shell dpkg-buildflags --get CXXFLAGS) -stdlib=libc++ +export LDFLAGS:=$(shell dpkg-buildflags --get LDFLAGS) -stdlib=libc++ -static-libstdc++ # more verbose linker output export LDFLAGS+=-Wl,--stats diff -Nru chromium-137.0.7151.68/extensions/browser/process_manager.cc chromium-137.0.7151.103/extensions/browser/process_manager.cc --- chromium-137.0.7151.68/extensions/browser/process_manager.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/extensions/browser/process_manager.cc 2025-06-09 18:33:48.000000000 +0000 @@ -47,6 +47,7 @@ #include "extensions/browser/process_manager_factory.h" #include "extensions/browser/process_manager_observer.h" #include "extensions/browser/renderer_startup_helper.h" +#include "extensions/browser/service_worker/service_worker_task_queue.h" #include "extensions/browser/view_type_utils.h" #include "extensions/common/constants.h" #include "extensions/common/extension.h" @@ -1034,6 +1035,8 @@ all_running_extension_workers_.GetAllForExtension(extension_id, render_process_id)) { StopTrackingServiceWorkerRunningInstance(worker_id); + ServiceWorkerTaskQueue::Get(browser_context_) + ->RenderProcessForWorkerExited(worker_id); } } #if DCHECK_IS_ON() diff -Nru chromium-137.0.7151.68/extensions/browser/service_worker/service_worker_task_queue.cc chromium-137.0.7151.103/extensions/browser/service_worker/service_worker_task_queue.cc --- chromium-137.0.7151.68/extensions/browser/service_worker/service_worker_task_queue.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/extensions/browser/service_worker/service_worker_task_queue.cc 2025-06-09 18:33:48.000000000 +0000 @@ -95,14 +95,14 @@ DCHECK(!process_manager->HasServiceWorker(*worker_id_) || g_allow_multiple_workers_per_extension); // Clear stale renderer state if there's any. - renderer_state_ = RendererState::kInitial; + renderer_state_ = RendererState::kNotActive; } worker_id_ = worker_id; } bool ServiceWorkerTaskQueue::WorkerState::ready() const { return browser_state_ == BrowserState::kStarted && - renderer_state_ == RendererState::kStarted && worker_id_.has_value(); + renderer_state_ == RendererState::kActive && worker_id_.has_value(); } ServiceWorkerTaskQueue::TestObserver::TestObserver() = default; @@ -298,14 +298,32 @@ // // TODO(lazyboy): Update the renderer state in RenderProcessExited() and // uncomment the following DCHECK: - // DCHECK_NE(RendererState::kStarted, worker_state->renderer_state_) + // DCHECK_NE(RendererState::kActive, worker_state->renderer_state_) // << "Worker already started"; worker_state->SetWorkerId(worker_id, ProcessManager::Get(browser_context_)); - worker_state->SetRendererState(RendererState::kStarted); + worker_state->SetRendererState(RendererState::kActive); RunPendingTasksIfWorkerReady(context_id); } +void ServiceWorkerTaskQueue::RenderProcessForWorkerExited( + const WorkerId& worker_id) { + auto activation_token = GetCurrentActivationToken(worker_id.extension_id); + if (!activation_token) { + // Extension has been deactivated so worker state should already be erased. + return; + } + + const SequencedContextId context_id = { + worker_id.extension_id, browser_context_->UniqueId(), *activation_token}; + WorkerState* worker_state = GetWorkerState(context_id); + // If the extension is still activated, worker state should still exist. + CHECK(worker_state); + + worker_state->SetRendererState(RendererState::kNotActive); + worker_state->ResetWorkerId(); +} + void ServiceWorkerTaskQueue::DidStopServiceWorkerContext( int render_process_id, const ExtensionId& extension_id, @@ -334,8 +352,8 @@ return; } - DCHECK_NE(RendererState::kStopped, worker_state->renderer_state()); - worker_state->SetRendererState(RendererState::kStopped); + DCHECK_NE(RendererState::kNotActive, worker_state->renderer_state()); + worker_state->SetRendererState(RendererState::kNotActive); worker_state->ResetWorkerId(); if (g_test_observer) { @@ -405,7 +423,7 @@ if (worker_state->browser_state() != BrowserState::kReady) { return false; } - if (worker_state->renderer_state() != RendererState::kStarted) { + if (worker_state->renderer_state() != RendererState::kActive) { return false; } @@ -554,7 +572,7 @@ // receive tasks/events again and the renderer stop notifications are not 100% // reliable. worker_state->SetBrowserState(BrowserState::kInitial); - worker_state->SetRendererState(RendererState::kInitial); + worker_state->SetRendererState(RendererState::kNotActive); worker_state->ResetWorkerId(); } diff -Nru chromium-137.0.7151.68/extensions/browser/service_worker/service_worker_task_queue.h chromium-137.0.7151.103/extensions/browser/service_worker/service_worker_task_queue.h --- chromium-137.0.7151.68/extensions/browser/service_worker/service_worker_task_queue.h 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/extensions/browser/service_worker/service_worker_task_queue.h 2025-06-09 18:33:48.000000000 +0000 @@ -168,12 +168,10 @@ // Render process worker state of an activated extension. enum class RendererState { - // Initial state, neither started nor stopped. - kInitial, - // Worker thread has started. - kStarted, - // Worker thread has not started or has been stopped. - kStopped, + // Worker thread has not started or has been stopped/terminated. + kNotActive, + // Worker thread has started and it's running. + kActive, }; // The current worker related state of an activated extension. @@ -204,7 +202,7 @@ private: BrowserState browser_state_ = BrowserState::kInitial; - RendererState renderer_state_ = RendererState::kInitial; + RendererState renderer_state_ = RendererState::kNotActive; // Contains the worker's WorkerId associated with this WorkerState, once we // have discovered info about the worker. @@ -279,6 +277,9 @@ const GURL& service_worker_scope, int64_t service_worker_version_id, int thread_id); + // Called when the extension renderer process that was running an extension + // Service Worker has exited. + void RenderProcessForWorkerExited(const WorkerId& worker_id); // Returns the current activation token for an extension, if the extension // is currently activated. Returns std::nullopt if the extension isn't diff -Nru chromium-137.0.7151.68/extensions/common/extension_resource.cc chromium-137.0.7151.103/extensions/common/extension_resource.cc --- chromium-137.0.7151.68/extensions/common/extension_resource.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/extensions/common/extension_resource.cc 2025-06-09 18:33:48.000000000 +0000 @@ -53,25 +53,27 @@ const base::FilePath& extension_root, const base::FilePath& relative_path, SymlinkPolicy symlink_policy) { - // We need to normalize `extension_root` on its own because `IsParent` doesn't - // normalize file paths. Without normalization parent references, Windows - // short paths, or different path capitalization will cause `IsParent` to - // return false. - base::FilePath normalized_extension_root; - if (!base::NormalizeFilePath(extension_root, &normalized_extension_root)) { + // We need to resolve the parent references in the extension_root + // path on its own because IsParent doesn't like parent references. + base::FilePath clean_extension_root( + base::MakeAbsoluteFilePath(extension_root)); + if (clean_extension_root.empty()) return base::FilePath(); - } - base::FilePath full_path = normalized_extension_root.Append(relative_path); + base::FilePath full_path = clean_extension_root.Append(relative_path); // If we are allowing the file to be a symlink outside of the root, then the // path before resolving the symlink must still be within it. if (symlink_policy == FOLLOW_SYMLINKS_ANYWHERE) { + std::vector components = + relative_path.GetComponents(); int depth = 0; - for (const auto& component : relative_path.GetComponents()) { - if (component == base::FilePath::kParentDirectory) { + + for (std::vector::const_iterator + i = components.begin(); i != components.end(); i++) { + if (*i == base::FilePath::kParentDirectory) { depth--; - } else if (component != base::FilePath::kCurrentDirectory) { + } else if (*i != base::FilePath::kCurrentDirectory) { depth++; } if (depth < 0) { @@ -82,26 +84,16 @@ // We must resolve the absolute path of the combined path when // the relative path contains references to a parent folder (i.e., '..'). - // NormalizeFilePath will fail if the path doesn't exist. - if (base::FilePath full_path_normalized; - base::NormalizeFilePath(full_path, &full_path_normalized)) { - full_path = std::move(full_path_normalized); - } else { -#if BUILDFLAG(IS_WIN) - // On Windows, if `NormalizeFilePath` fails, fall back to - // `MakeAbsoluteFilePath` and proceed if the file exists. This can happen - // if, for example, the file isn't accessible due to permissions. - full_path = base::MakeAbsoluteFilePath(full_path); - if (full_path.empty() || !base::PathExists(full_path)) { - return base::FilePath(); - } -#else - return base::FilePath(); -#endif - } - - if (symlink_policy != FOLLOW_SYMLINKS_ANYWHERE && - !normalized_extension_root.IsParent(full_path)) { + // We also check if the path exists because the posix version of + // MakeAbsoluteFilePath will fail if the path doesn't exist, and we want the + // same behavior on Windows... So until the posix and Windows version of + // MakeAbsoluteFilePath are unified, we need an extra call to PathExists, + // unfortunately. + // TODO(mad): Fix this once MakeAbsoluteFilePath is unified. + full_path = base::MakeAbsoluteFilePath(full_path); + if (!base::PathExists(full_path) || + (symlink_policy != FOLLOW_SYMLINKS_ANYWHERE && + !clean_extension_root.IsParent(full_path))) { return base::FilePath(); } diff -Nru chromium-137.0.7151.68/extensions/common/extension_resource_unittest.cc chromium-137.0.7151.103/extensions/common/extension_resource_unittest.cc --- chromium-137.0.7151.68/extensions/common/extension_resource_unittest.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/extensions/common/extension_resource_unittest.cc 2025-06-09 18:33:48.000000000 +0000 @@ -19,10 +19,6 @@ #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/l10n/l10n_util.h" -#if BUILDFLAG(IS_WIN) -#include "base/test/file_path_reparse_point_win.h" -#endif - namespace extensions { TEST(ExtensionResourceTest, CreateEmptyResource) { @@ -75,14 +71,6 @@ symlink_file); #endif -#if BUILDFLAG(IS_WIN) - base::FilePath reparse_dir = inner_dir.AppendASCII("reparse"); - ASSERT_TRUE(base::CreateDirectory(reparse_dir)); - auto reparse_point = - base::test::FilePathReparsePoint::Create(reparse_dir, temp.GetPath()); - ASSERT_TRUE(reparse_point.has_value()); -#endif - // A non-packing extension should be able to access the file within the // directory. ExtensionResource r1(extension_id, inner_dir, @@ -130,28 +118,6 @@ r6.set_follow_symlinks_anywhere(); EXPECT_FALSE(r6.GetFilePath().empty()); #endif - -#if BUILDFLAG(IS_WIN) - base::FilePath outer_via_reparse = - base::FilePath().AppendASCII("reparse").AppendASCII("outer"); - - // The non-packing extension should also not be able to access a resource that - // points out of the directory via a reparse point. - ExtensionResource r7(extension_id, inner_dir, outer_via_reparse); - EXPECT_TRUE(r7.GetFilePath().empty()); - - // ... but a packing extension can. - ExtensionResource r8(extension_id, inner_dir, outer_via_reparse); - r8.set_follow_symlinks_anywhere(); - EXPECT_FALSE(r8.GetFilePath().empty()); - - // Make sure that a non-normalized extension root path is supported. - base::FilePath inner_dir_non_normalized = - temp.GetPath().AppendASCII("dIrEcToRy"); - ExtensionResource r9(extension_id, inner_dir_non_normalized, - base::FilePath().AppendASCII("inner")); - EXPECT_FALSE(r9.GetFilePath().empty()); -#endif } TEST(ExtensionResourceTest, CreateWithAllResourcesOnDisk) { diff -Nru chromium-137.0.7151.68/gpu/config/gpu_lists_version.h chromium-137.0.7151.103/gpu/config/gpu_lists_version.h --- chromium-137.0.7151.68/gpu/config/gpu_lists_version.h 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/gpu/config/gpu_lists_version.h 2025-06-09 18:33:48.000000000 +0000 @@ -3,6 +3,6 @@ #ifndef GPU_CONFIG_GPU_LISTS_VERSION_H_ #define GPU_CONFIG_GPU_LISTS_VERSION_H_ -#define GPU_LISTS_VERSION "2989ffee9373ea8b8623bd98b3cb350a8e95cadc" +#define GPU_LISTS_VERSION "3dcc738117a3439068c9773ccd31f9858923fc4a" #endif // GPU_CONFIG_GPU_LISTS_VERSION_H_ diff -Nru chromium-137.0.7151.68/infra/config/generated/builders/ci/linux-chromeos-rel/targets/chromium.chromiumos.json chromium-137.0.7151.103/infra/config/generated/builders/ci/linux-chromeos-rel/targets/chromium.chromiumos.json --- chromium-137.0.7151.68/infra/config/generated/builders/ci/linux-chromeos-rel/targets/chromium.chromiumos.json 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/infra/config/generated/builders/ci/linux-chromeos-rel/targets/chromium.chromiumos.json 2025-06-09 18:33:48.000000000 +0000 @@ -104,6 +104,7 @@ "swarming": { "dimensions": { "cpu": "x86-64", + "gce_has_external_ip": "1", "os": "Ubuntu-22.04" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", diff -Nru chromium-137.0.7151.68/infra/config/generated/builders/try/linux-chromeos-rel/targets/chromium.chromiumos.json chromium-137.0.7151.103/infra/config/generated/builders/try/linux-chromeos-rel/targets/chromium.chromiumos.json --- chromium-137.0.7151.68/infra/config/generated/builders/try/linux-chromeos-rel/targets/chromium.chromiumos.json 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/infra/config/generated/builders/try/linux-chromeos-rel/targets/chromium.chromiumos.json 2025-06-09 18:33:48.000000000 +0000 @@ -104,6 +104,7 @@ "swarming": { "dimensions": { "cpu": "x86-64", + "gce_has_external_ip": "1", "os": "Ubuntu-22.04" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", diff -Nru chromium-137.0.7151.68/infra/config/targets/mixins.star chromium-137.0.7151.103/infra/config/targets/mixins.star --- chromium-137.0.7151.68/infra/config/targets/mixins.star 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/infra/config/targets/mixins.star 2025-06-09 18:33:48.000000000 +0000 @@ -2139,6 +2139,20 @@ ) targets.mixin( + # Tests that reach out to Skia's gold instance slowdown substantially when + # ran on GCE bots without external IPs. By explicitly targeting bots with + # external IPs in such tests, we can roll out internal IPs more broadly + # without affecting these Skia gold tests. + name = "skia_gold_test_on_linux_gce", + generate_pyl_entry = False, + swarming = targets.swarming( + dimensions = { + "gce_has_external_ip": "1", + }, + ), +) + +targets.mixin( name = "swarming_containment_auto", generate_pyl_entry = targets.IGNORE_UNUSED, swarming = targets.swarming( diff -Nru chromium-137.0.7151.68/infra/config/targets/tests.star chromium-137.0.7151.103/infra/config/targets/tests.star --- chromium-137.0.7151.68/infra/config/targets/tests.star 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/infra/config/targets/tests.star 2025-06-09 18:33:48.000000000 +0000 @@ -171,6 +171,7 @@ name = "ash_pixeltests", mixins = [ "skia_gold_test", + "skia_gold_test_on_linux_gce", ], args = [ "--enable-pixel-output-in-tests", diff -Nru chromium-137.0.7151.68/media/audio/win/audio_low_latency_input_win.cc chromium-137.0.7151.103/media/audio/win/audio_low_latency_input_win.cc --- chromium-137.0.7151.68/media/audio/win/audio_low_latency_input_win.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/media/audio/win/audio_low_latency_input_win.cc 2025-06-09 18:33:48.000000000 +0000 @@ -732,6 +732,13 @@ ErrorToString(hr).c_str()); } + if (SUCCEEDED(hr) && audio_render_client_for_loopback_.Get()) { + hr = audio_render_client_for_loopback_->Start(); + if (FAILED(hr)) + SendLogMessage("%s => (ERROR: IAudioClient::Start=[%s] (loopback))", + __func__, ErrorToString(hr).c_str()); + } + started_ = SUCCEEDED(hr); } @@ -1513,13 +1520,14 @@ DCHECK_EQ(OPEN_RESULT_OK, open_result_); SendLogMessage("%s()", __func__); - // Use event-driven mode for regular input devices and for loopback. - DWORD flags = - AUDCLNT_STREAMFLAGS_EVENTCALLBACK | AUDCLNT_STREAMFLAGS_NOPERSIST; + DWORD flags; + // Use event-driven mode only for regular input devices. For loopback the + // EVENTCALLBACK flag is specified when initializing + // |audio_render_client_for_loopback_|. if (AudioDeviceDescription::IsLoopbackDevice(device_id_)) { - // Create a loopback stream that captures what the system is playing - // instead of the microphone input. - flags |= AUDCLNT_STREAMFLAGS_LOOPBACK; + flags = AUDCLNT_STREAMFLAGS_LOOPBACK | AUDCLNT_STREAMFLAGS_NOPERSIST; + } else { + flags = AUDCLNT_STREAMFLAGS_EVENTCALLBACK | AUDCLNT_STREAMFLAGS_NOPERSIST; } // Initialize the audio stream between the client and the device. @@ -1591,7 +1599,46 @@ // Set the event handle that the audio engine will signal each time a buffer // becomes ready to be processed by the client. - hr = audio_client_->SetEventHandle(audio_samples_ready_event_.Get()); + // + // In loopback case the capture device doesn't receive any events, so we + // need to create a separate playback client to get notifications. According + // to MSDN: + // + // A pull-mode capture client does not receive any events when a stream is + // initialized with event-driven buffering and is loopback-enabled. To + // work around this, initialize a render stream in event-driven mode. Each + // time the client receives an event for the render stream, it must signal + // the capture client to run the capture thread that reads the next set of + // samples from the capture endpoint buffer. + // + // http://msdn.microsoft.com/en-us/library/windows/desktop/dd316551(v=vs.85).aspx + if (AudioDeviceDescription::IsLoopbackDevice(device_id_)) { + SendLogMessage("%s => (WARNING: loopback mode is selected)", __func__); + hr = endpoint_device_->Activate(__uuidof(IAudioClient), CLSCTX_ALL, nullptr, + &audio_render_client_for_loopback_); + if (FAILED(hr)) { + open_result_ = OPEN_RESULT_LOOPBACK_ACTIVATE_FAILED; + return hr; + } + + hr = audio_render_client_for_loopback_->Initialize( + AUDCLNT_SHAREMODE_SHARED, + AUDCLNT_STREAMFLAGS_EVENTCALLBACK | AUDCLNT_STREAMFLAGS_NOPERSIST, 0, 0, + reinterpret_cast(&input_format_), + AudioDeviceDescription::IsCommunicationsDevice(device_id_) + ? &kCommunicationsSessionId + : nullptr); + if (FAILED(hr)) { + open_result_ = OPEN_RESULT_LOOPBACK_INIT_FAILED; + return hr; + } + + hr = audio_render_client_for_loopback_->SetEventHandle( + audio_samples_ready_event_.Get()); + } else { + hr = audio_client_->SetEventHandle(audio_samples_ready_event_.Get()); + } + if (FAILED(hr)) { open_result_ = OPEN_RESULT_SET_EVENT_HANDLE; return hr; diff -Nru chromium-137.0.7151.68/media/audio/win/audio_low_latency_input_win.h chromium-137.0.7151.103/media/audio/win/audio_low_latency_input_win.h --- chromium-137.0.7151.68/media/audio/win/audio_low_latency_input_win.h 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/media/audio/win/audio_low_latency_input_win.h 2025-06-09 18:33:48.000000000 +0000 @@ -273,6 +273,14 @@ // an audio stream between an audio application and the audio engine. Microsoft::WRL::ComPtr audio_client_; + // Loopback IAudioClient doesn't support event-driven mode, so a separate + // IAudioClient is needed to receive notifications when data is available in + // the buffer. For loopback input |audio_client_| is used to receive data, + // while |audio_render_client_for_loopback_| is used to get notifications + // when a new buffer is ready. See comment in InitializeAudioEngine() for + // details. + Microsoft::WRL::ComPtr audio_render_client_for_loopback_; + // The IAudioCaptureClient interface enables a client to read input data // from a capture endpoint buffer. Microsoft::WRL::ComPtr audio_capture_client_; diff -Nru chromium-137.0.7151.68/media/audio/win/audio_low_latency_input_win_unittest.cc chromium-137.0.7151.103/media/audio/win/audio_low_latency_input_win_unittest.cc --- chromium-137.0.7151.68/media/audio/win/audio_low_latency_input_win_unittest.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/media/audio/win/audio_low_latency_input_win_unittest.cc 2025-06-09 18:33:48.000000000 +0000 @@ -83,24 +83,16 @@ FakeAudioInputCallback& operator=(const FakeAudioInputCallback&) = delete; bool error() const { return error_; } - int num_callbacks() const { return num_callbacks_; } int num_received_audio_frames() const { return num_received_audio_frames_; } // Waits until OnData() is called on another thread. void WaitForData() { data_event_.Wait(); } - // Waits for OnData() to be called on another thread. - // Returns true if the event is signaled, false if it times out. - bool WaitForDataWithTimeout(base::TimeDelta timeout) { - return data_event_.TimedWait(timeout); - } - void OnData(const AudioBus* src, base::TimeTicks capture_time, double volume, const AudioGlitchInfo& glitch_info) override { EXPECT_GE(capture_time, base::TimeTicks()); - num_callbacks_++; num_received_audio_frames_ += src->frames(); data_event_.Signal(); } @@ -108,50 +100,11 @@ void OnError() override { error_ = true; } private: - int num_callbacks_ = 0; int num_received_audio_frames_; base::WaitableEvent data_event_; bool error_; }; -class FakeAudioOutputCallback : public AudioOutputStream::AudioSourceCallback { - public: - FakeAudioOutputCallback() - : num_rendered_audio_frames_(0), - data_event_(base::WaitableEvent::ResetPolicy::AUTOMATIC, - base::WaitableEvent::InitialState::NOT_SIGNALED), - error_(false) {} - - FakeAudioOutputCallback(const FakeAudioOutputCallback&) = delete; - FakeAudioOutputCallback& operator=(const FakeAudioOutputCallback&) = delete; - - bool error() const { return error_; } - int num_callbacks() const { return num_callbacks_; } - int num_rendered_audio_frames() const { return num_rendered_audio_frames_; } - - // Waits until OnMoreData() is called on another thread. - void WaitForMoreData() { data_event_.Wait(); } - - int OnMoreData(base::TimeDelta delay, - base::TimeTicks delay_timestamp, - const AudioGlitchInfo& glitch_info, - AudioBus* dest) override { - num_callbacks_++; - num_rendered_audio_frames_ += dest->frames(); - dest->Zero(); - data_event_.Signal(); - return dest->frames(); - } - - void OnError(ErrorType type) override { error_ = true; } - - private: - int num_callbacks_ = 0; - int num_rendered_audio_frames_; - base::WaitableEvent data_event_; - bool error_; -}; - // This audio sink implementation should be used for manual tests only since // the recorded data is stored on a raw binary data file. class WriteToFileAudioSink : public AudioInputStream::AudioInputCallback { @@ -296,7 +249,6 @@ class ScopedAudioInputStream { public: - ScopedAudioInputStream() : stream_(nullptr) {} explicit ScopedAudioInputStream(AudioInputStream* stream) : stream_(stream) {} ScopedAudioInputStream(const ScopedAudioInputStream&) = delete; @@ -328,41 +280,6 @@ raw_ptr stream_; }; -class ScopedAudioOutputStream { - public: - ScopedAudioOutputStream() : stream_(nullptr) {} - explicit ScopedAudioOutputStream(AudioOutputStream* stream) - : stream_(stream) {} - - ScopedAudioOutputStream(const ScopedAudioOutputStream&) = delete; - ScopedAudioOutputStream& operator=(const ScopedAudioOutputStream&) = delete; - - ~ScopedAudioOutputStream() { - if (stream_) { - stream_->Close(); - } - } - - void Close() { - if (stream_) { - stream_->Close(); - } - stream_ = nullptr; - } - - AudioOutputStream* operator->() { return stream_; } - - AudioOutputStream* get() const { return stream_; } - - void Reset(AudioOutputStream* new_stream) { - Close(); - stream_ = new_stream; - } - - private: - raw_ptr stream_; -}; - class WinAudioInputTest : public ::testing::Test { public: WinAudioInputTest() { @@ -721,81 +638,31 @@ } } -class WinAudioInputLoopbackTest : public WinAudioInputTest { - public: - WinAudioInputLoopbackTest() : device_info_accessor_(audio_manager_.get()) { - // Defer stream creation and parameter fetching to SetUp. - } - - void SetUp() override { - // Abort early if requirements are mot met. - bool prerequisites_met = device_info_accessor_.HasAudioOutputDevices() && - CoreAudioUtil::IsSupported(); - if (!prerequisites_met) { - GTEST_SKIP() << "Missing audio output devices or CoreAudio support"; - } - - CreateParameters(); - CreateStreams(); - } - - void CreateParameters() { - params_ = device_info_accessor_.GetInputStreamParameters( - AudioDeviceDescription::kLoopbackInputDeviceId); - output_params_ = - device_info_accessor_.GetOutputStreamParameters(std::string()); - } - - void CreateStreams() { - stream_.Reset(audio_manager_->MakeAudioInputStream( - params_, AudioDeviceDescription::kLoopbackInputDeviceId, - base::BindRepeating(&LogCallbackDummy))); - output_stream_.Reset(audio_manager_->MakeAudioOutputStream( - output_params_, std::string(), base::BindRepeating(&LogCallbackDummy))); - - ASSERT_THAT(stream_.get(), NotNull()); - ASSERT_THAT(stream_->Open(), Eq(AudioInputStream::OpenOutcome::kSuccess)); - ASSERT_THAT(output_stream_.get(), NotNull()); - ASSERT_TRUE(output_stream_->Open()); - } - - protected: - AudioDeviceInfoAccessorForTests device_info_accessor_; - AudioParameters params_; - AudioParameters output_params_; - ScopedAudioInputStream stream_; - ScopedAudioOutputStream output_stream_; -}; +// Test that we can capture a stream in loopback. +TEST_F(WinAudioInputTest, WASAPIAudioInputStreamLoopback) { + AudioDeviceInfoAccessorForTests device_info_accessor(audio_manager_.get()); + ABORT_AUDIO_TEST_IF_NOT(device_info_accessor.HasAudioOutputDevices() && + CoreAudioUtil::IsSupported()); + AudioParameters params = device_info_accessor.GetInputStreamParameters( + AudioDeviceDescription::kLoopbackInputDeviceId); + EXPECT_EQ(params.effects(), AudioParameters::NO_EFFECTS); -TEST_F(WinAudioInputLoopbackTest, ValidateMatchingInputOutputParameters) { - // Input parameters should be the same as default output parameters in - // loopback capturing mode. - ASSERT_THAT(params_.sample_rate(), Eq(output_params_.sample_rate())); - ASSERT_THAT(params_.channel_layout(), Eq(output_params_.channel_layout())); -} - -TEST_F(WinAudioInputLoopbackTest, - LoopbackEventsWhenDefaultOutputDeviceIsRenderingAudio) { - // Start a silent output stream and ensure that rendering starts. - FakeAudioOutputCallback source; - output_stream_->Start(&source); - output_stream_->SetVolume(0.0); - source.WaitForMoreData(); - - EXPECT_EQ(source.num_callbacks(), 1); - EXPECT_GT(source.num_rendered_audio_frames(), 0); - EXPECT_FALSE(source.error()); + AudioParameters output_params = + device_info_accessor.GetOutputStreamParameters(std::string()); + EXPECT_EQ(params.sample_rate(), output_params.sample_rate()); + EXPECT_EQ(params.channel_layout(), output_params.channel_layout()); - // Start the loopback stream and verify that loopback events are now fired - // since the default audio output device plays out audio. + ScopedAudioInputStream stream(audio_manager_->MakeAudioInputStream( + params, AudioDeviceDescription::kLoopbackInputDeviceId, + base::BindRepeating(&LogCallbackDummy))); + EXPECT_EQ(stream->Open(), AudioInputStream::OpenOutcome::kSuccess); FakeAudioInputCallback sink; - stream_->Start(&sink); + stream->Start(&sink); ASSERT_FALSE(sink.error()); + sink.WaitForData(); - sink.WaitForData(); - stream_.Close(); + stream.Close(); - EXPECT_EQ(sink.num_callbacks(), 2); EXPECT_GT(sink.num_received_audio_frames(), 0); EXPECT_FALSE(sink.error()); } diff -Nru chromium-137.0.7151.68/net/http/transport_security_state_static.pins chromium-137.0.7151.103/net/http/transport_security_state_static.pins --- chromium-137.0.7151.68/net/http/transport_security_state_static.pins 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/net/http/transport_security_state_static.pins 2025-06-09 18:33:48.000000000 +0000 @@ -43,9 +43,9 @@ # hash function for preloaded entries again (we have already done so once). # -# Last updated: 2025-05-30 12:58 UTC +# Last updated: 2025-06-09 12:56 UTC PinsListTimestamp -1748609888 +1749473796 TestSPKI sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= diff -Nru chromium-137.0.7151.68/net/http/transport_security_state_static_pins.json chromium-137.0.7151.103/net/http/transport_security_state_static_pins.json --- chromium-137.0.7151.68/net/http/transport_security_state_static_pins.json 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/net/http/transport_security_state_static_pins.json 2025-06-09 18:33:48.000000000 +0000 @@ -31,7 +31,7 @@ // the 'static_spki_hashes' and 'bad_static_spki_hashes' fields in 'pinsets' // refer to, and the timestamp at which the pins list was last updated. // -// Last updated: 2025-05-30 12:58 UTC +// Last updated: 2025-06-09 12:56 UTC // { "pinsets": [ diff -Nru chromium-137.0.7151.68/remoting/resources/remoting_strings_de.xtb chromium-137.0.7151.103/remoting/resources/remoting_strings_de.xtb --- chromium-137.0.7151.68/remoting/resources/remoting_strings_de.xtb 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/remoting/resources/remoting_strings_de.xtb 2025-06-09 18:33:48.000000000 +0000 @@ -129,7 +129,7 @@ Hilfs-App für das Öffnen einer URL mit dem -Client Tastatur ein-/ausblenden Verbindungen zum Remote-Computer sind vorübergehend blockiert, da jemand versucht hat, eine Verbindung mit einer ungültigen PIN herzustellen. Bitte versuche es später noch einmal. -Ok +OK Möchtest du die Remote-Verbindung zu wirklich deaktivieren? Wenn du die Verbindung später erneut aktivieren möchtest, musst du dies von dem betreffenden Computer aus tun. Nicht erkannter Hostfehler: Remote-Unterstützung diff -Nru chromium-137.0.7151.68/third_party/blink/renderer/core/dom/scroll_button_pseudo_element.cc chromium-137.0.7151.103/third_party/blink/renderer/core/dom/scroll_button_pseudo_element.cc --- chromium-137.0.7151.68/third_party/blink/renderer/core/dom/scroll_button_pseudo_element.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/third_party/blink/renderer/core/dom/scroll_button_pseudo_element.cc 2025-06-09 18:33:48.000000000 +0000 @@ -63,6 +63,52 @@ PseudoElement::Trace(v); } +void ScrollButtonPseudoElement::HandleButtonActivation() { + Element& scrolling_element = UltimateOriginatingElement(); + LayoutBox* scroller = scrolling_element.GetLayoutBox(); + PaintLayerScrollableArea* scrollable_area = + scroller->IsDocumentElement() ? scroller->GetFrameView()->LayoutViewport() + : scroller->GetScrollableArea(); + CHECK(scrollable_area); + + LogicalToPhysical mapping( + scrolling_element.GetComputedStyle()->GetWritingDirection(), + GetPseudoId() == kPseudoIdScrollButtonInlineStart, + GetPseudoId() == kPseudoIdScrollButtonInlineEnd, + GetPseudoId() == kPseudoIdScrollButtonBlockStart, + GetPseudoId() == kPseudoIdScrollButtonBlockEnd); + gfx::Vector2dF displacement; + if (mapping.Top()) { + displacement.set_y(-scrollable_area->ScrollStep( + ui::ScrollGranularity::kScrollByPage, kVerticalScrollbar)); + } else if (mapping.Bottom()) { + displacement.set_y(scrollable_area->ScrollStep( + ui::ScrollGranularity::kScrollByPage, kVerticalScrollbar)); + } else if (mapping.Left()) { + displacement.set_x(-scrollable_area->ScrollStep( + ui::ScrollGranularity::kScrollByPage, kHorizontalScrollbar)); + } else if (mapping.Right()) { + displacement.set_x(scrollable_area->ScrollStep( + ui::ScrollGranularity::kScrollByPage, kHorizontalScrollbar)); + } + if (!displacement.IsZero()) { + gfx::PointF current_position = scrollable_area->ScrollPosition(); + std::unique_ptr strategy = + cc::SnapSelectionStrategy::CreateForEndAndDirection( + current_position, displacement, + RuntimeEnabledFeatures::FractionalScrollOffsetsEnabled()); + gfx::PointF new_position = + scrollable_area->GetSnapPositionAndSetTarget(*strategy).value_or( + current_position + displacement); + scrollable_area->ScrollToAbsolutePosition( + new_position, mojom::blink::ScrollBehavior::kAuto); + } + GetDocument().SetFocusedElement(this, + FocusParams(SelectionBehaviorOnFocus::kNone, + mojom::blink::FocusType::kNone, + /*capabilities=*/nullptr)); +} + void ScrollButtonPseudoElement::DefaultEventHandler(Event& event) { bool is_click = event.IsMouseEvent() && event.type() == event_type_names::kClick; @@ -71,59 +117,10 @@ bool is_enter_or_space = is_key_down && (To(event).keyCode() == VKEY_RETURN || To(event).keyCode() == VKEY_SPACE); - - Element& scrolling_element = UltimateOriginatingElement(); - auto* scroller = DynamicTo(scrolling_element.GetLayoutObject()); - - bool is_originating_element_scroller = - scroller && - (scroller->IsScrollContainer() || scroller->IsDocumentElement()); - bool should_intercept = is_originating_element_scroller && - event.target() == this && - (is_click || is_enter_or_space); + bool should_intercept = + event.target() == this && (is_click || is_enter_or_space); if (should_intercept) { - PaintLayerScrollableArea* scrollable_area = - scroller->IsDocumentElement() - ? scroller->GetFrameView()->LayoutViewport() - : scroller->GetScrollableArea(); - CHECK(scrollable_area); - - LogicalToPhysical mapping( - scrolling_element.GetComputedStyle()->GetWritingDirection(), - GetPseudoId() == kPseudoIdScrollButtonInlineStart, - GetPseudoId() == kPseudoIdScrollButtonInlineEnd, - GetPseudoId() == kPseudoIdScrollButtonBlockStart, - GetPseudoId() == kPseudoIdScrollButtonBlockEnd); - gfx::Vector2dF displacement; - if (mapping.Top()) { - displacement.set_y(-scrollable_area->ScrollStep( - ui::ScrollGranularity::kScrollByPage, kVerticalScrollbar)); - } else if (mapping.Bottom()) { - displacement.set_y(scrollable_area->ScrollStep( - ui::ScrollGranularity::kScrollByPage, kVerticalScrollbar)); - } else if (mapping.Left()) { - displacement.set_x(-scrollable_area->ScrollStep( - ui::ScrollGranularity::kScrollByPage, kHorizontalScrollbar)); - } else if (mapping.Right()) { - displacement.set_x(scrollable_area->ScrollStep( - ui::ScrollGranularity::kScrollByPage, kHorizontalScrollbar)); - } - if (!displacement.IsZero()) { - gfx::PointF current_position = scrollable_area->ScrollPosition(); - std::unique_ptr strategy = - cc::SnapSelectionStrategy::CreateForEndAndDirection( - current_position, displacement, - RuntimeEnabledFeatures::FractionalScrollOffsetsEnabled()); - gfx::PointF new_position = - scrollable_area->GetSnapPositionAndSetTarget(*strategy).value_or( - current_position + displacement); - scrollable_area->ScrollToAbsolutePosition( - new_position, mojom::blink::ScrollBehavior::kAuto); - } - GetDocument().SetFocusedElement(this, - FocusParams(SelectionBehaviorOnFocus::kNone, - mojom::blink::FocusType::kNone, - /*capabilities=*/nullptr)); + HandleButtonActivation(); event.SetDefaultHandled(); } PseudoElement::DefaultEventHandler(event); diff -Nru chromium-137.0.7151.68/third_party/blink/renderer/core/dom/scroll_button_pseudo_element.h chromium-137.0.7151.103/third_party/blink/renderer/core/dom/scroll_button_pseudo_element.h --- chromium-137.0.7151.68/third_party/blink/renderer/core/dom/scroll_button_pseudo_element.h 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/third_party/blink/renderer/core/dom/scroll_button_pseudo_element.h 2025-06-09 18:33:48.000000000 +0000 @@ -35,6 +35,8 @@ private: bool UpdateSnapshotInternal(); + void HandleButtonActivation(); + bool enabled_ = true; }; diff -Nru chromium-137.0.7151.68/third_party/blink/renderer/core/view_transition/view_transition.cc chromium-137.0.7151.103/third_party/blink/renderer/core/view_transition/view_transition.cc --- chromium-137.0.7151.68/third_party/blink/renderer/core/view_transition/view_transition.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/third_party/blink/renderer/core/view_transition/view_transition.cc 2025-06-09 18:33:48.000000000 +0000 @@ -598,6 +598,13 @@ break; } + if (RuntimeEnabledFeatures:: + ViewTransitionUpdateLifecycleBeforeReadyEnabled()) { + document_->View()->UpdateAllLifecyclePhasesExceptPaint( + DocumentUpdateReason::kViewTransition); + style_tracker_->RunPostPrePaintSteps(); + } + delegate_->AddPendingRequest( ViewTransitionRequest::CreateAnimateRenderer( transition_token_, MaybeCrossFrameSink())); diff -Nru chromium-137.0.7151.68/third_party/blink/renderer/platform/media/web_audio_source_provider_impl.cc chromium-137.0.7151.103/third_party/blink/renderer/platform/media/web_audio_source_provider_impl.cc --- chromium-137.0.7151.68/third_party/blink/renderer/platform/media/web_audio_source_provider_impl.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/third_party/blink/renderer/platform/media/web_audio_source_provider_impl.cc 2025-06-09 18:33:48.000000000 +0000 @@ -24,9 +24,10 @@ namespace blink { +// TODO(crbug.com/420150619): Re-enable this feature. BASE_FEATURE(kDelayStopForMediaElementSourceNode, "DelayStopForMediaElementSourceNode", - base::FEATURE_ENABLED_BY_DEFAULT); + base::FEATURE_DISABLED_BY_DEFAULT); // TeeFilter is a RenderCallback implementation that allows for a client to get // a copy of the data being rendered by the |renderer_| on Render(). This class diff -Nru chromium-137.0.7151.68/third_party/blink/renderer/platform/media/web_audio_source_provider_impl_test.cc chromium-137.0.7151.103/third_party/blink/renderer/platform/media/web_audio_source_provider_impl_test.cc --- chromium-137.0.7151.68/third_party/blink/renderer/platform/media/web_audio_source_provider_impl_test.cc 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/third_party/blink/renderer/platform/media/web_audio_source_provider_impl_test.cc 2025-06-09 18:33:48.000000000 +0000 @@ -13,6 +13,7 @@ #include "base/memory/scoped_refptr.h" #include "base/run_loop.h" +#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "media/base/audio_glitch_info.h" #include "media/base/audio_parameters.h" @@ -36,6 +37,10 @@ const float kTestVolume = 0.25; const int kTestSampleRate = 48000; + +// TODO(crbug.com/420150619): Re-enable this and make it a global feature. +constexpr bool kDelayStopForMediaElementSourceNode = false; + } // namespace class WebAudioSourceProviderImplTest : public testing::Test, @@ -79,12 +84,17 @@ testing::Mock::VerifyAndClear(mock_sink_.get()); } - void SetClient(WebAudioSourceProviderClient* client) { + void SetClient(WebAudioSourceProviderClient* client, + bool expect_format = true) { testing::InSequence s; if (client) { - EXPECT_CALL(*mock_sink_, Stop()).Times(0); - EXPECT_CALL(*this, SetFormat(params_.channels(), params_.sample_rate())); + EXPECT_CALL(*mock_sink_, Stop()) + .Times(kDelayStopForMediaElementSourceNode ? 0 : 1); + if (expect_format) { + EXPECT_CALL(*this, + SetFormat(params_.channels(), params_.sample_rate())); + } } wasp_impl_->SetClient(client); base::RunLoop().RunUntilIdle(); @@ -134,12 +144,7 @@ // setClient() with a nullptr client should do nothing if no client is set. wasp_impl_->SetClient(nullptr); - // `mock_sink_` should not be stopped during setClient(this). - if (mock_sink_) - EXPECT_CALL(*mock_sink_.get(), Stop()).Times(0); - - wasp_impl_->SetClient(this); - base::RunLoop().RunUntilIdle(); + SetClient(this, /*expect_format=*/false); wasp_impl_->SetClient(nullptr); base::RunLoop().RunUntilIdle(); @@ -172,7 +177,7 @@ // Removing the client should cause WASP to revert to the underlying sink. SetClient(nullptr); - CallAllSinkMethodsAndVerify(true); + CallAllSinkMethodsAndVerify(kDelayStopForMediaElementSourceNode); } // Test tainting effects on Render(). @@ -365,9 +370,7 @@ wasp_impl_->Initialize(params_, &fake_callback_); base::RunLoop().RunUntilIdle(); - // `mock_sink_` should not be stopped during setClient(this). - if (mock_sink_) - EXPECT_CALL(*mock_sink_.get(), Stop()).Times(0); + SetClient(this, /*expect_format=*/false); // setClient() with the same client should do nothing. wasp_impl_->SetClient(this); @@ -458,10 +461,7 @@ // SetClient when called with a valid client should trigger the callback once. EXPECT_CALL(*this, OnClientSet()).Times(1); - EXPECT_CALL(*mock_sink_, Stop()).Times(0); - wasp_impl_->SetClient(this); - base::RunLoop().RunUntilIdle(); - ::testing::Mock::VerifyAndClearExpectations(this); + SetClient(this, /*expect_format=*/false); // Future calls to set client should not trigger the callback. EXPECT_CALL(*this, OnClientSet()).Times(0); @@ -485,13 +485,11 @@ wasp_impl_->ConnectToDestinationReady(); EXPECT_CALL(*this, OnClientSet()).Times(1); - EXPECT_CALL(*mock_sink_, Stop()).Times(0); - wasp_impl_->SetClient(this); - base::RunLoop().RunUntilIdle(); - ::testing::Mock::VerifyAndClearExpectations(this); + SetClient(this, /*expect_format=*/false); // ConnectToDestinationReady after client calls sink stop() - EXPECT_CALL(*mock_sink_, Stop()).Times(1); + EXPECT_CALL(*mock_sink_, Stop()) + .Times(kDelayStopForMediaElementSourceNode ? 1 : 0); wasp_impl_->ConnectToDestinationReady(); base::RunLoop().RunUntilIdle(); diff -Nru chromium-137.0.7151.68/third_party/blink/renderer/platform/runtime_enabled_features.json5 chromium-137.0.7151.103/third_party/blink/renderer/platform/runtime_enabled_features.json5 --- chromium-137.0.7151.68/third_party/blink/renderer/platform/runtime_enabled_features.json5 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/third_party/blink/renderer/platform/runtime_enabled_features.json5 2025-06-09 18:33:48.000000000 +0000 @@ -4960,6 +4960,10 @@ status: "stable", }, { + name: "ViewTransitionUpdateLifecycleBeforeReady", + status: "stable", + }, + { name: "VisibilityCollapseColumn", }, { diff -Nru chromium-137.0.7151.68/third_party/devtools-frontend/src/front_end/panels/network/RequestHTMLView.ts chromium-137.0.7151.103/third_party/devtools-frontend/src/front_end/panels/network/RequestHTMLView.ts --- chromium-137.0.7151.68/third_party/devtools-frontend/src/front_end/panels/network/RequestHTMLView.ts 2025-05-30 19:50:32.000000000 +0000 +++ chromium-137.0.7151.103/third_party/devtools-frontend/src/front_end/panels/network/RequestHTMLView.ts 2025-06-09 18:33:48.000000000 +0000 @@ -45,7 +45,7 @@ // clang-format off render(html` -
+
${input.dataURL ? html`