Version in base suite: 121.0.6167.139-1~deb12u1 Version in overlay suite: 128.0.6613.84-1~deb12u1 Base version: chromium_128.0.6613.84-1~deb12u1 Target version: chromium_128.0.6613.113-1~deb12u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/c/chromium/chromium_128.0.6613.84-1~deb12u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/c/chromium/chromium_128.0.6613.113-1~deb12u1.dsc DEPS | 14 ash/glanceables/tasks/glanceables_task_view.cc | 8 ash/strings/ash_strings_ar.xtb | 4 ash/strings/ash_strings_te.xtb | 2 ash/system/video_conference/effects/video_conference_tray_effects_manager.cc | 11 build/util/LASTCHANGE | 2 build/util/LASTCHANGE.committime | 2 chrome/LACROS_QA_QUALIFIED_VERSION | 2 chrome/VERSION | 2 chrome/app/generated_resources.grd | 9 chrome/app/resources/chromium_strings_be.xtb | 4 chrome/app/resources/chromium_strings_ta.xtb | 4 chrome/app/resources/generated_resources_ar.xtb | 12 chrome/app/resources/generated_resources_be.xtb | 4 chrome/app/resources/generated_resources_el.xtb | 4 chrome/app/resources/generated_resources_en-GB.xtb | 2 chrome/app/resources/generated_resources_es.xtb | 2 chrome/app/resources/generated_resources_et.xtb | 1 chrome/app/resources/generated_resources_eu.xtb | 2 chrome/app/resources/generated_resources_fr-CA.xtb | 2 chrome/app/resources/generated_resources_gu.xtb | 2 chrome/app/resources/generated_resources_it.xtb | 2 chrome/app/resources/generated_resources_ja.xtb | 1 chrome/app/resources/generated_resources_kn.xtb | 2 chrome/app/resources/generated_resources_ko.xtb | 2 chrome/app/resources/generated_resources_nl.xtb | 4 chrome/app/resources/generated_resources_pt-BR.xtb | 4 chrome/app/resources/generated_resources_sw.xtb | 2 chrome/app/resources/generated_resources_te.xtb | 12 chrome/app/resources/generated_resources_uk.xtb | 2 chrome/app/resources/generated_resources_vi.xtb | 2 chrome/app/resources/generated_resources_zh-CN.xtb | 8 chrome/app/resources/google_chrome_strings_ta.xtb | 4 chrome/browser/ash/app_mode/kiosk_controller_impl.cc | 13 chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_zh-CN.xtb | 2 chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb | 4 chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb | 2 chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb | 2 chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb | 2 chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb | 6 chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb | 4 chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb | 2 chrome/browser/ui/ash/glanceables/glanceables_browsertest.cc | 65 chrome/browser/ui/views/location_bar/location_bar_view.cc | 4 chrome/browser/ui/views/location_bar/selected_keyword_view.cc | 28 chrome/browser/ui/views/location_bar/selected_keyword_view.h | 11 chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc | 105 chrome/browser/ui/views/omnibox/omnibox_match_cell_view.h | 27 chrome/browser/ui/views/omnibox/omnibox_match_cell_view_unittest.cc | 152 chrome/browser/ui/views/omnibox/omnibox_result_view.cc | 17 chrome/browser/ui/views/omnibox/omnibox_row_view.cc | 2 chrome/browser/ui/views/toolbar/toolbar_view.cc | 2 chrome/browser/ui/webui/cr_components/history_embeddings/history_embeddings_handler.cc | 18 chrome/browser/ui/webui/cr_components/history_embeddings/history_embeddings_handler_unittest.cc | 2 chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.cc | 51 chrome/credential_provider/gaiacp/strings/gaia_resources_hr.xtb | 2 chromeos/CHROMEOS_LKGM | 2 chromeos/strings/chromeos_strings_ar.xtb | 2 chromeos/strings/chromeos_strings_be.xtb | 2 chromeos/strings/chromeos_strings_de.xtb | 2 chromeos/strings/chromeos_strings_te.xtb | 4 components/certificate_transparency/data/log_list.json | 36 components/history_embeddings/BUILD.gn | 1 components/history_embeddings/DEPS | 1 components/history_embeddings/answerer.cc | 24 components/history_embeddings/answerer.h | 21 components/history_embeddings/history_embeddings_features.cc | 7 components/history_embeddings/history_embeddings_features.h | 5 components/history_embeddings/history_embeddings_service.cc | 255 components/history_embeddings/history_embeddings_service.h | 18 components/history_embeddings/history_embeddings_service_unittest.cc | 63 components/history_embeddings/ml_answerer.cc | 20 components/history_embeddings/sql_database.cc | 58 components/history_embeddings/sql_database_unittest.cc | 44 components/history_embeddings/vector_database.cc | 5 components/omnibox/browser/BUILD.gn | 4 components/omnibox/browser/autocomplete_controller.cc | 14 components/omnibox/browser/autocomplete_controller.h | 5 components/omnibox/browser/fake_autocomplete_provider_client.cc | 4 components/omnibox/browser/fake_autocomplete_provider_client.h | 18 components/omnibox/browser/featured_search_provider.cc | 116 components/omnibox/browser/featured_search_provider.h | 20 components/omnibox/browser/featured_search_provider_unittest.cc | 113 components/omnibox/browser/history_embeddings_provider.cc | 21 components/omnibox/browser/history_embeddings_provider.h | 14 components/omnibox/browser/history_embeddings_provider_unittest.cc | 41 components/omnibox/browser/omnibox_field_trial.cc | 5 components/omnibox/browser/omnibox_field_trial.h | 4 components/omnibox/browser/omnibox_prefs.cc | 21 components/omnibox/browser/omnibox_prefs.h | 35 components/omnibox_strings.grdp | 3 components/omnibox_strings_grdp/IDS_ACC_DISMISS_CHROME_TIP_BUTTON.png.sha1 | 1 components/os_crypt/sync/BUILD.gn | 2 components/os_crypt/sync/libsecret_util_linux.cc | 82 components/performance_manager/features.cc | 7 components/remote_cocoa/app_shim/native_widget_mac_nswindow.mm | 37 components/soda/soda_installer.cc | 6 components/soda/soda_installer.h | 6 components/soda/soda_installer_impl_chromeos.cc | 11 components/soda/soda_installer_impl_chromeos.h | 2 components/strings/components_strings_be.xtb | 8 components/strings/components_strings_el.xtb | 2 components/strings/components_strings_en-GB.xtb | 8 components/strings/components_strings_es.xtb | 2 components/strings/components_strings_fr.xtb | 4 components/strings/components_strings_it.xtb | 2 components/strings/components_strings_ja.xtb | 2 components/strings/components_strings_ko.xtb | 2 components/strings/components_strings_nl.xtb | 8 components/strings/components_strings_pt-BR.xtb | 2 components/strings/components_strings_te.xtb | 6 components/strings/components_strings_vi.xtb | 2 components/strings/components_strings_zh-CN.xtb | 6 components/viz/service/display/resolved_frame_data.cc | 3 content/browser/service_worker/embedded_worker_instance.cc | 11 content/browser/webid/digital_credentials/digital_identity_request_impl.cc | 83 content/browser/webid/digital_credentials/digital_identity_request_impl.h | 4 content/browser/webid/digital_credentials/digital_identity_request_impl_unittest.cc | 162 debian/changelog | 25 debian/control | 2 debian/patches/bookworm/crabbyav1f.patch | 25 debian/patches/bookworm/rust-downgrade-osstr-users.patch | 156 debian/patches/bookworm/rust-no-thin-lto.patch | 15 debian/patches/fixes/clang-rust-target.patch | 23 debian/patches/series | 5 gpu/config/gpu_lists_version.h | 2 gpu/webgpu/DAWN_VERSION | 2 net/http/transport_security_state_static.pins | 4 net/http/transport_security_state_static_pins.json | 2 net/http/url_security_manager_win.cc | 6 services/passage_embeddings/passage_embedder.cc | 29 skia/ext/skia_commit_hash.h | 2 testing/scripts/check_gn_headers.py | 3 testing/scripts/check_network_annotations.py | 3 testing/scripts/check_static_initializers.py | 18 testing/scripts/checkbins.py | 3 testing/scripts/common.py | 10 testing/scripts/count_filtered_tests.py | 3 testing/scripts/metrics_python_tests.py | 23 testing/scripts/test_traffic_annotation_auditor.py | 3 third_party/blink/public/strings/translations/blink_strings_te.xtb | 2 third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h | 12 third_party/blink/renderer/bindings/core/v8/native_value_traits_impl_test.cc | 43 third_party/blink/renderer/bindings/core/v8/pass_as_span.h | 74 third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py | 85 third_party/blink/renderer/bindings/scripts/bind_gen/interface.py | 12 third_party/blink/renderer/bindings/scripts/bind_gen/typedef.py | 10 third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py | 4 third_party/blink/renderer/bindings/scripts/web_idl/idl_type.py | 8 third_party/blink/renderer/core/editing/ime/edit_context.cc | 2 third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.idl | 122 third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.idl | 65 third_party/blink/renderer/platform/fonts/win/font_fallback_win.cc | 27 third_party/dawn/DEPS | 2 third_party/dawn/third_party/dxc/lib/Transforms/Scalar/ScalarReplAggregatesHLSL.cpp | 4 third_party/dawn/third_party/dxc/tools/clang/test/DXC/Passes/ScalarReplHLSL/scalarrepl-param-hlsl-entry-replace-zero-recurse-to-float.ll | 125 third_party/dawn/third_party/dxc/tools/clang/test/DXC/Passes/ScalarReplHLSL/scalarrepl-param-hlsl-entry-replace-zero-recurse-to-int.ll | 122 third_party/skia/src/gpu/ganesh/ops/DrawMeshOp.cpp | 6 third_party/skia/src/gpu/ganesh/ops/RegionOp.cpp | 9 third_party/webrtc/video/quality_convergence_controller.cc | 10 third_party/webrtc/video/quality_convergence_controller.h | 2 third_party/webrtc/video/video_stream_encoder.cc | 24 third_party/webrtc/video/video_stream_encoder.h | 3 tools/metrics/histograms/metadata/history/enums.xml | 2 tools/metrics/histograms/metadata/history/histograms.xml | 68 ui/strings/translations/auto_image_annotation_strings_ar.xtb | 4 ui/strings/translations/ui_strings_ar.xtb | 4 ui/views/bubble/bubble_frame_view.cc | 64 ui/views/bubble/bubble_frame_view.h | 9 v8/include/v8-version.h | 2 v8/src/ast/ast-function-literal-id-reindexer.cc | 7 v8/src/ast/ast-function-literal-id-reindexer.h | 1 v8/src/ast/ast.h | 43 v8/src/ast/scopes.cc | 117 v8/src/ast/scopes.h | 22 v8/src/builtins/builtins-function.cc | 9 v8/src/codegen/background-merge-task.h | 2 v8/src/codegen/compiler.cc | 303 - v8/src/codegen/compiler.h | 5 v8/src/common/globals.h | 2 v8/src/compiler/operation-typer.cc | 1 v8/src/debug/debug-evaluate.cc | 8 v8/src/debug/debug.cc | 9 v8/src/debug/liveedit.cc | 11 v8/src/diagnostics/objects-debug.cc | 9 v8/src/diagnostics/objects-printer.cc | 2 v8/src/flags/flag-definitions.h | 5 v8/src/heap/factory-base.cc | 3 v8/src/heap/factory.cc | 3 v8/src/heap/object-stats.cc | 5 v8/src/heap/object-stats.h | 2 v8/src/init/bootstrapper.cc | 2 v8/src/interpreter/bytecode-generator.cc | 2 v8/src/interpreter/interpreter.cc | 2 v8/src/objects/objects.cc | 7 v8/src/objects/scope-info.cc | 16 v8/src/objects/scope-info.h | 2 v8/src/objects/script-inl.h | 17 v8/src/objects/script.h | 8 v8/src/objects/script.tq | 2 v8/src/objects/shared-function-info-inl.h | 13 v8/src/objects/shared-function-info.cc | 28 v8/src/objects/shared-function-info.h | 4 v8/src/parsing/parse-info.cc | 2 v8/src/parsing/parse-info.h | 8 v8/src/parsing/parser-base.h | 73 v8/src/parsing/parser.cc | 47 v8/src/parsing/preparser-logger.h | 10 v8/src/parsing/preparser.cc | 9 v8/src/parsing/preparser.h | 7 v8/src/profiler/heap-snapshot-generator.cc | 5 v8/src/runtime/runtime-compiler.cc | 18 v8/src/snapshot/code-serializer.cc | 5 v8/src/wasm/canonical-types.cc | 26 v8/src/wasm/value-type.h | 1 v8/tools/builtins-pgo/profiles/profiles_version | 2 v8/tools/builtins-pgo/profiles/x64-rl.profile | 2080 +++---- v8/tools/builtins-pgo/profiles/x64.profile | 2567 ++++---- v8/tools/builtins-pgo/profiles/x86-rl.profile | 2099 +++---- v8/tools/builtins-pgo/profiles/x86.profile | 2885 ++++------ 220 files changed, 7385 insertions(+), 6563 deletions(-) diff -Nru chromium-128.0.6613.84/DEPS chromium-128.0.6613.113/DEPS --- chromium-128.0.6613.84/DEPS 2024-08-21 22:46:03.000000000 +0000 +++ chromium-128.0.6613.113/DEPS 2024-08-28 22:38:45.000000000 +0000 @@ -307,15 +307,15 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'src_internal_revision': 'd4953235852dd309498cf8ddf10bee59ac757b93', + 'src_internal_revision': '1c4b2bc8f28f57a68a8d94c6459e8e854ec7baef', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': 'fb67954b7e76dc59567dd1f87734ada0cd1bc7f6', + 'skia_revision': '8bd493b850f1a75482af8f30cb492cd70645498c', # 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': 'e6286d70c55da94a8e12658918989b9b9dc325c8', + 'v8_revision': '56d087b1521413bad8a5fcdacd19375a845c650f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. @@ -426,7 +426,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': '9f1487f627fac5897e3de9603dc377bd477a63e6', + 'dawn_revision': '5f86f5a316f4e082b2419d8b954ebb79c2be590d', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -1288,7 +1288,7 @@ 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - '21da7e4d0f455bf871b470cc14b1ce3367a1453c', + '31331c5a3adac2674f3c9527d484571986f8c84a', 'condition': 'checkout_android and checkout_src_internal', }, @@ -2560,7 +2560,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '198d1770062c1a8aba86e7d6e001bb47bea028ee', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'e7686023a186ac233ed1284da45cc166c0df4e1a', + Var('webrtc_git') + '/src.git' + '@' + 'f237dc146debcfde3d70038c2b66f71bfea8d24b', # Wuffs' canonical repository is at github.com/google/wuffs, but we use # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file. @@ -4820,7 +4820,7 @@ 'src/ios_internal': { 'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' + - 'f8c506ff321b7d47c057594af51699895725bbc3', + 'f54ce57e8a3d6208739cecb0648cb1a67d1c98f7', 'condition': 'checkout_ios and checkout_src_internal', }, diff -Nru chromium-128.0.6613.84/ash/glanceables/tasks/glanceables_task_view.cc chromium-128.0.6613.113/ash/glanceables/tasks/glanceables_task_view.cc --- chromium-128.0.6613.84/ash/glanceables/tasks/glanceables_task_view.cc 2024-08-21 22:46:03.000000000 +0000 +++ chromium-128.0.6613.113/ash/glanceables/tasks/glanceables_task_view.cc 2024-08-28 22:38:46.000000000 +0000 @@ -503,10 +503,10 @@ break; case TaskTitleViewState::kEdit: task_title_before_edit_ = task_title_; - task_title_textfield_ = - tasks_title_view_->AddChildView(std::make_unique( - base::BindRepeating(&GlanceablesTaskView::OnFinishedEditing, - base::Unretained(this)))); + task_title_textfield_ = tasks_title_view_->AddChildView( + std::make_unique(base::BindRepeating( + &GlanceablesTaskView::OnFinishedEditing, + state_change_weak_ptr_factory_.GetWeakPtr()))); task_title_textfield_->SetText(task_title_); GetWidget()->widget_delegate()->SetCanActivate(true); task_title_textfield_->RequestFocus(); diff -Nru chromium-128.0.6613.84/ash/strings/ash_strings_ar.xtb chromium-128.0.6613.113/ash/strings/ash_strings_ar.xtb --- chromium-128.0.6613.84/ash/strings/ash_strings_ar.xtb 2024-08-21 22:46:03.000000000 +0000 +++ chromium-128.0.6613.113/ash/strings/ash_strings_ar.xtb 2024-08-28 22:38:46.000000000 +0000 @@ -303,7 +303,7 @@ انقر لتفعيل/إيقاف "". "" - تراجع ليلة سعيدة ، -فتح "أداة اختيار الرموز التعبيرية" +فتح "أداة اختيار رموز الإيموجي" الألعاب لا يتوفّر اتصال بالشبكة الزر الآخر "" @@ -1551,7 +1551,7 @@ يُرجى تحديد نافذة للحصول لالتقاط صورة لها. ستظهر شاشتك فارغة لمدة أطول من المعتاد (تصل إلى دقيقة واحدة) أثناء هذا التحديث. يُرجى عدم الضغط على زر التشغيل خلال عملية التحديث. عدم الإزعاج -الرموز التعبيرية +رموز الإيموجي قوة الإشارة ، بطارية الهاتف جارٍ فحص الملف لتنزيله البث على diff -Nru chromium-128.0.6613.84/ash/strings/ash_strings_te.xtb chromium-128.0.6613.113/ash/strings/ash_strings_te.xtb --- chromium-128.0.6613.84/ash/strings/ash_strings_te.xtb 2024-08-21 22:46:04.000000000 +0000 +++ chromium-128.0.6613.113/ash/strings/ash_strings_te.xtb 2024-08-28 22:38:47.000000000 +0000 @@ -1803,7 +1803,7 @@ మీ కోసం మీరు బటన్ చర్యలను వ్యక్తిగతీకరించవచ్చు స్క్రీన్‌షాట్ మోడ్ ఎంచుకోబడింది క్యాలెండర్, వారం, ప్రస్తుతం ఎంపిక చేయబడింది. -డౌన్‌లోడ్ చేయి +డౌన్‌లోడ్ చేయండి Android పేజీ కింది వైపు కీ ఉష్ణోగ్రత యూనిట్‌లను (F వర్సెస్. C) టోగుల్ చేయండి diff -Nru chromium-128.0.6613.84/ash/system/video_conference/effects/video_conference_tray_effects_manager.cc chromium-128.0.6613.113/ash/system/video_conference/effects/video_conference_tray_effects_manager.cc --- chromium-128.0.6613.84/ash/system/video_conference/effects/video_conference_tray_effects_manager.cc 2024-08-21 22:46:04.000000000 +0000 +++ chromium-128.0.6613.113/ash/system/video_conference/effects/video_conference_tray_effects_manager.cc 2024-08-28 22:38:47.000000000 +0000 @@ -5,6 +5,7 @@ #include "ash/system/video_conference/effects/video_conference_tray_effects_manager.h" #include +#include #include #include "ash/constants/ash_features.h" @@ -20,6 +21,7 @@ #include "components/live_caption/pref_names.h" #include "components/prefs/pref_service.h" #include "components/soda/constants.h" +#include "components/soda/soda_installer.h" namespace ash { @@ -179,9 +181,16 @@ std::string locale = pref_service ? prefs::GetLiveCaptionLanguageCode(pref_service) : speech::kUsEnglishLocale; + std::string dlc_name = + speech::SodaInstaller::GetInstance()->GetLanguageDlcNameForLocale( + locale); + + // Should always have a language DLC lib for a specific language. + CHECK(!dlc_name.empty()); + // "Live caption" requires both a binary ("libsoda") as well as a specific // language model (e.g. "libsoda-model-en-us") to operate. - return {"libsoda", base::ToLowerASCII("libsoda-model-" + locale)}; + return {"libsoda", dlc_name}; } case VcEffectId::kTestEffect: case VcEffectId::kBackgroundBlur: diff -Nru chromium-128.0.6613.84/build/util/LASTCHANGE chromium-128.0.6613.113/build/util/LASTCHANGE --- chromium-128.0.6613.84/build/util/LASTCHANGE 2024-08-21 22:51:21.000000000 +0000 +++ chromium-128.0.6613.113/build/util/LASTCHANGE 2024-08-28 22:43:55.000000000 +0000 @@ -1,2 +1,2 @@ -LASTCHANGE=606aa55c7d687518d34b55accc5a71ea0bd28727-refs/branch-heads/6613@{#1335} +LASTCHANGE=9597ae93a15d4d03089b4e9997b1072228baa9ad-refs/branch-heads/6613@{#1429} LASTCHANGE_YEAR=2024 diff -Nru chromium-128.0.6613.84/build/util/LASTCHANGE.committime chromium-128.0.6613.113/build/util/LASTCHANGE.committime --- chromium-128.0.6613.84/build/util/LASTCHANGE.committime 2024-08-21 22:51:21.000000000 +0000 +++ chromium-128.0.6613.113/build/util/LASTCHANGE.committime 2024-08-28 22:43:55.000000000 +0000 @@ -1 +1 @@ -1724203947 \ No newline at end of file +1724811233 \ No newline at end of file diff -Nru chromium-128.0.6613.84/chrome/LACROS_QA_QUALIFIED_VERSION chromium-128.0.6613.113/chrome/LACROS_QA_QUALIFIED_VERSION --- chromium-128.0.6613.84/chrome/LACROS_QA_QUALIFIED_VERSION 2024-08-21 22:46:05.000000000 +0000 +++ chromium-128.0.6613.113/chrome/LACROS_QA_QUALIFIED_VERSION 2024-08-28 22:38:48.000000000 +0000 @@ -1 +1 @@ -128.0.6613.36 \ No newline at end of file +128.0.6613.103 \ No newline at end of file diff -Nru chromium-128.0.6613.84/chrome/VERSION chromium-128.0.6613.113/chrome/VERSION --- chromium-128.0.6613.84/chrome/VERSION 2024-08-21 22:46:05.000000000 +0000 +++ chromium-128.0.6613.113/chrome/VERSION 2024-08-28 22:38:48.000000000 +0000 @@ -1,4 +1,4 @@ MAJOR=128 MINOR=0 BUILD=6613 -PATCH=84 +PATCH=113 diff -Nru chromium-128.0.6613.84/chrome/app/generated_resources.grd chromium-128.0.6613.113/chrome/app/generated_resources.grd --- chromium-128.0.6613.84/chrome/app/generated_resources.grd 2024-08-21 22:46:05.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/generated_resources.grd 2024-08-28 22:38:49.000000000 +0000 @@ -7710,6 +7710,15 @@ Why this suggestion? + + Close + + + Thumbs up submits feedback that you like this result. + + + Thumbs down opens a form for submitting detailed feedback on why you dislike this result. + Remove suggestion diff -Nru chromium-128.0.6613.84/chrome/app/resources/chromium_strings_be.xtb chromium-128.0.6613.113/chrome/app/resources/chromium_strings_be.xtb --- chromium-128.0.6613.84/chrome/app/resources/chromium_strings_be.xtb 2024-08-21 22:46:06.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/chromium_strings_be.xtb 2024-08-28 22:38:49.000000000 +0000 @@ -79,7 +79,7 @@ Выдаліць уліковы запіс з Chromium Небяспечны сайт. Chromium адклікаў дазвол на апавяшчэнні. Вы даўно не наведвалі сайт. Chromium адклікаў наступныя дазволы: , . -Калі камп'ютар выкарыстоўваюць некалькі чалавек, кожны з іх можа наладзіць Chromium для сябе і праглядаць старонкі асобна ад іншых. +Калі камп’ютар выкарыстоўваюць некалькі чалавек, кожны з іх можа наладзіць Chromium для сябе і праглядаць старонкі асобна ад іншых. Правярае, ці знаходзяцца URL-адрасы ў спісе небяспечных сайтаў, захаваным у Chromium. Пры спробе сайта выкрасці пароль або пры спампоўванні шкоднага файла браўзер Chromium можа таксама адпраўляць у Бяспечны прагляд URL-адрасы, уключаючы фрагменты змесціва старонкі. Калі гэты параметр уключаны, Chromium перадзагружае старонкі, што паскарае работу браўзера і пошуку. Каб адпраўляць нумары з гэтай прылады на свой тэлефон Android, увайдзіце ў Chromium на абедзвюх прыладах. @@ -426,7 +426,7 @@ Профілі Chromium патрэбныя для раздзельнага выкарыстання браўзера рознымі людзьмі або ў розных мэтах. Выкарыстоўваючы іх, прасцей раздзяляць работу і забавы.  – Chromium Dev Chromium запытвае дазвол на доступ да вашай камеры для гэтага сайта -Каб атрымліваць наступныя абнаўленні Chromium, вам патрэбная версія Windows 10 ці пазнейшая. На гэтым камп'ютары выкарыстоўваецца Windows 7. +Каб атрымліваць наступныя абнаўленні Chromium, вам патрэбная версія Windows 10 ці пазнейшая. На гэтым камп’ютары выкарыстоўваецца Windows 7. Перазапусціць Chromium? Немагчыма ўсталяваць тую ж версію Chromium, што зараз працуе. Закрыйце Chromium і паўтарыце спробу. Верагодна, сайты будуць працаваць правільна. Калі вы закрыеце ўсе вокны Chromium, вы выйдзеце з большасці сайтаў, але застаняцеся ва Уліковым запісе Google, калі раней выканалі ўваход у Chromium. diff -Nru chromium-128.0.6613.84/chrome/app/resources/chromium_strings_ta.xtb chromium-128.0.6613.113/chrome/app/resources/chromium_strings_ta.xtb --- chromium-128.0.6613.84/chrome/app/resources/chromium_strings_ta.xtb 2024-08-21 22:46:06.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/chromium_strings_ta.xtb 2024-08-28 22:38:49.000000000 +0000 @@ -123,7 +123,7 @@ நிறுவல் பிழை: நிறுவியின் செயல்பாடு தொடங்கவில்லை. Chromium புதுப்பித்த நிலையில் உள்ளது எந்தத் தளமாவது உங்கள் கடவுச்சொல்லைத் திருட முயன்றாலோ தீங்கிழைக்கும் ஃபைலை நீங்கள் பதிவிறக்கினாலோ பக்க உள்ளடக்கத்தின் சிறிய பகுதிகள் உட்பட URLகளையும் பாதுகாப்பு உலாவலுக்கு Chromium அனுப்பக்கூடும் -உங்கள் உலாவல் அனுபவத்தை மேம்படுத்தவும், ஆதாரங்கள் கிடைக்கும்படி செய்யவும் இந்தப் பக்கங்களை Chromium முடக்கலாம். +உங்கள் உலாவல் அனுபவத்தை மேம்படுத்தவும், ரிசோர்ஸ்கள் கிடைக்கும்படி செய்யவும் இந்தப் பக்கங்களை Chromium முடக்கலாம். Chromiumமில் புதிய பக்கத்தில் ஐத் திறக்கும். Chromiumமால் உங்கள் கடவுச்சொற்களைச் சரிபார்க்க முடியவில்லை. பிறகு முயலவும். Chromium இல் சேர்க்கிறது... @@ -334,7 +334,7 @@ Chromium ஐ இயல்புநிலை உலாவியாக மாற்று Chromiumமால் புதுப்பிப்புகள் உள்ளதா எனப் பார்க்க முடியவில்லை. உங்கள் இணைய இணைப்பைச் சரிபார்க்க முயலவும். Chromium இலிருந்து வெளியேறவா? -இந்தப் பக்கங்கள் கூடுதல் வளங்களைப் பயன்படுத்துகின்றன. செயல்திறனை மேம்படுத்த, அவற்றை முடக்குவதற்கு Chromiumமை அனுமதியுங்கள். +இந்தப் பக்கங்கள் கூடுதல் ரிசோர்ஸ்களைப் பயன்படுத்துகின்றன. செயல்திறனை மேம்படுத்த, அவற்றை முடக்குவதற்கு Chromiumமை அனுமதியுங்கள். உங்கள் Chromium சுயவிவரத்தைப் பிரத்தியேகமாக்குக உங்கள் Chromium சுயவிவரத்திற்குப் பெயரிடுங்கள் நீட்டிப்பைப் பயன்படுத்த Chromiumமில் நீங்கள் உள்நுழைய வேண்டும் என்று அது விரும்புகிறது diff -Nru chromium-128.0.6613.84/chrome/app/resources/generated_resources_ar.xtb chromium-128.0.6613.113/chrome/app/resources/generated_resources_ar.xtb --- chromium-128.0.6613.84/chrome/app/resources/generated_resources_ar.xtb 2024-08-21 22:46:06.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/generated_resources_ar.xtb 2024-08-28 22:38:49.000000000 +0000 @@ -1436,7 +1436,7 @@ فتح الرابط في الإبلاغ عن مشكلة... ‏استخدِم حساب طفلك على Google أو حسابًا تديره مؤسسة تعليمية. ويمكنك أيضًا ضبط أدوات رقابة الأهل. -أداة الرموز التعبيرية +أداة رموز الإيموجي الأجهزة المتوافقة تم الاختيار تفعيل خيار "حفظ المجموعة" @@ -3285,7 +3285,7 @@ ‏تخصيص هذه الصفحة بواسطة الذكاء الاصطناعي (AI) &نسخ عنوان الصورة تم اكتشاف جهاز قابل للإزالة -‏الرموز التعبيرية المُقترَحة. اضغط على السهم المتّجه للأعلى أو للأسفل للتنقُّل ثم اضغط على Enter للإدخال. +‏رموز الإيموجي المُقترَحة. اضغط على السهم المتّجه للأعلى أو للأسفل للتنقُّل ثم اضغط على Enter للإدخال. الذاكرة المستخدَمة إضافة أزرار على قلم الشاشة أو تحديد مكانها يُرجى تفعيل ميزة "عرض شاشة القفل عند الخروج من وضع السكون"، ثمّ إعادة المحاولة. @@ -4005,7 +4005,7 @@ كلمة المرور غير صالحة ‏خط Serif القائمة المسموح بها داخليًا -تمّ إدراج رمز تعبيري +تمّ إدراج إيموجي ‏يمكنك الحصول على أدوات لتطوير المواقع الإلكترونية وتطبيقات Android والمزيد. سيؤدي تثبيت نظام التشغيل Linux إلى تنزيل من البيانات. المساعدة في تحسين الأمان على الإنترنت من أجل الجميع فتح في نافذة &التصفُّح المتخفي @@ -6482,13 +6482,13 @@ الموقع الجغرافي ‏يبدو أنّه سبق وأن تم إعداد ميزة "التعرّف على الصوت" من قِبل في خدمة "مساعد Google" على جهاز آخر. أمّا بالنسبة إلى التسجيلات الصوتية السابقة، فقد تم استخدامها لإنشاء نموذج صوتي على هذا الجهاز. ربط البيانات -يمكنك الحصول على اقتراحات الرموز التعبيرية بناءً على النص الذي تتم كتابته. +يمكنك الحصول على اقتراحات رموز الإيموجي بناءً على النص الذي تتم كتابته. لم يتمّ التعرُّف على البصمة الميكروفون قيد الاستخدام ‏أداة ADB في تطبيق Android لنظام التشغيل Linux الإبلاغ عن إساءة الاستخدام من "" ‏الملف الحالي بتنسيق PPD قيد الاستخدام: -أداة اختيار الرموز التعبيرية +أداة اختيار رموز الإيموجي أنت على وشك حذف بياناتك في "" تحقَّق مما إذا كان الحساب الذي اخترته صحيحًا. من @@ -8707,7 +8707,7 @@ ‏إغلاق صفحة "بحث Google" في اللوحة الجانبية ‏استخدام التطبيقات والإعدادات وغيرها الكثير على أي جهاز يعمل بنظام التشغيل Chrome ‏يتم عرض أسطح المكتب والنماذج المحفوظة. اضغط على مفتاح التبويب (Tab) للتنقّل بينها. -أداة اختيار الرموز التعبيرية +أداة اختيار رموز الإيموجي انقر بزر الماوس الأيمن لتشغيل المِس زر التشغيل بإصبعك. يتم تخزين بيانات بصمة الإصبع بشكل آمن وتظلّ محفوظة على جهاز فقط. السماح للمواقع الإلكترونية بطلب الاتصال بأجهزة تتضمّن بلوتوث diff -Nru chromium-128.0.6613.84/chrome/app/resources/generated_resources_be.xtb chromium-128.0.6613.113/chrome/app/resources/generated_resources_be.xtb --- chromium-128.0.6613.84/chrome/app/resources/generated_resources_be.xtb 2024-08-21 22:46:06.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/generated_resources_be.xtb 2024-08-28 22:38:49.000000000 +0000 @@ -6149,7 +6149,7 @@ Паказаць больш вынікаў пошуку Дадайце да пошукавага запыту Несапраўдная -Прагляд і выдаленне з камп'ютара фота, музыкі і іншых файлаў мультымедыя +Прагляд і выдаленне з камп’ютара фота, музыкі і іншых файлаў мультымедыя Раскладка Дворака Вы ўвялі няправільны PIN-код занадта шмат разоў. Каб атрымаць доступ да ключоў доступу і пароляў, змяніце PIN-код. Нататкі на экране блакіроўкі @@ -7416,7 +7416,7 @@ Заўсёды на EID прылады: ; серыйны нумар прылады: . Гэтыя нумары можна выкарыстаць для актывацыі сэрвісу. Каб адправіць гэту ўкладку на іншую прыладу, увайдзіце з гэтай прылады ў Chrome -У вашым камп'ютары ўсталявана прылада бяспекі Trusted Platform Module (TPM), якая выкарыстоўваецца для рэалізацыі многіх крытычна важных функцый бяспекі ў Chrome OS. Каб даведацца больш, адкрыйце Даведачны цэнтр Chromebook: https://support.google.com/chromebook/?p=tpm. +У вашым камп’ютары ўсталявана прылада бяспекі Trusted Platform Module (TPM), якая выкарыстоўваецца для рэалізацыі многіх крытычна важных функцый бяспекі ў Chrome OS. Каб даведацца больш, адкрыйце Даведачны цэнтр Chromebook: https://support.google.com/chromebook/?p=tpm. Сайты могуць запытваць дазвол на кіраванне прыладамі MIDI і іх перапраграмаванне Змяніце закладку Выкарыстанне даных пра месцазнаходжанне ў праграмах і сэрвісах для Android і ChromeOS. diff -Nru chromium-128.0.6613.84/chrome/app/resources/generated_resources_el.xtb chromium-128.0.6613.113/chrome/app/resources/generated_resources_el.xtb --- chromium-128.0.6613.84/chrome/app/resources/generated_resources_el.xtb 2024-08-21 22:46:06.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/generated_resources_el.xtb 2024-08-28 22:38:49.000000000 +0000 @@ -1765,7 +1765,7 @@ Χρησιμοποιήστε τα πλήκτρα βέλους για να περιηγηθείτε στα στοιχεία κατά γράμμα Η συσκευή σας ενημερώνεται αυτόματα στο παρασκήνιο για να σας προσφέρει τις πιο πρόσφατες λειτουργίες και βελτιώσεις ασφάλειας. Μπορείτε να ελέγξετε τις προτιμήσεις ενημερώσεων στις Ρυθμίσεις. -Να λαμβάνονται περιγραφές εικόνων από το Google; +Να λαμβάνονται περιγραφές εικόνων από την Google; Η διαχείριση της συσκευής σας γίνεται από τον οργανισμό σας Προεπισκόπηση φωνής Καθαρισμός της συσκευής σας @@ -6571,7 +6571,7 @@ Εδώ θα βρείτε τη λίστα ανάγνωσής σας Επιλέξτε μια διάθεση Είναι δυνατή η ανάγνωση των εγγράφων που στέλνετε για εκτύπωση μέσω με την εφαρμογή . -Επίσης, διαγράψτε δεδομένα περιήγησης () τα οποία ενδέχεται να σας αποσυνδέσουν από το Google.com. +Επίσης, διαγράψτε δεδομένα περιήγησης () τα οποία ενδέχεται να σας αποσυνδέσουν από την Google.com. Εισαγωγή στοιχείων Λογαριασμού Google Δεν βρέθηκαν συσκευές USB Αποθή&κευση ήχου ως... diff -Nru chromium-128.0.6613.84/chrome/app/resources/generated_resources_en-GB.xtb chromium-128.0.6613.113/chrome/app/resources/generated_resources_en-GB.xtb --- chromium-128.0.6613.84/chrome/app/resources/generated_resources_en-GB.xtb 2024-08-21 22:46:06.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/generated_resources_en-GB.xtb 2024-08-28 22:38:49.000000000 +0000 @@ -8874,7 +8874,7 @@ Error: Unable to decode extension Slower Delete displayed data -No Thanks +No, thanks Customise your toolbar Restore all {NUM_DAYS,plural, =1{Immediate return required}other{Return within {NUM_DAYS} days}} diff -Nru chromium-128.0.6613.84/chrome/app/resources/generated_resources_es.xtb chromium-128.0.6613.113/chrome/app/resources/generated_resources_es.xtb --- chromium-128.0.6613.84/chrome/app/resources/generated_resources_es.xtb 2024-08-21 22:46:06.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/generated_resources_es.xtb 2024-08-28 22:38:49.000000000 +0000 @@ -9243,7 +9243,7 @@ Ajusta los extremos de la pantalla Añadir búsqueda en el sitio Ver certificados importados desde ChromeOS -Opcionales +Opcional Permite que las aplicaciones, los sitios web y los servicios de ChromeOS y Android que tengan el permiso de ubicación usen la ubicación de este dispositivo. La precisión de la ubicación proporciona una ubicación más precisa para las aplicaciones y los servicios de Android. Para ello, Google procesa periódicamente la información de los sensores y señales inalámbricas de este dispositivo para recoger las ubicaciones de las señales inalámbricas. Estos datos se usan sin identificar a nadie para mejorar la precisión de la ubicación y los servicios basados en ella, así como para mejorar, proporcionar y mantener los servicios de Google en función de sus propios intereses legítimos y los de terceros con el fin de satisfacer las necesidades de los usuarios. No se puede usar esta cuenta Añadir dirección diff -Nru chromium-128.0.6613.84/chrome/app/resources/generated_resources_et.xtb chromium-128.0.6613.113/chrome/app/resources/generated_resources_et.xtb --- chromium-128.0.6613.84/chrome/app/resources/generated_resources_et.xtb 2024-08-21 22:46:06.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/generated_resources_et.xtb 2024-08-28 22:38:49.000000000 +0000 @@ -10003,6 +10003,7 @@ Vaadake lisateavet saidile ajutise loa andmise kohta kolmandate osapoolte küpsiste kasutamiseks Lõite selle pääsuvõtme kuupäeval Veebisaidid teie keeltes +Murduvad lained merel fantastilise linna ja lossi taustal, pimedas atmosfääris. Muud saadaolevad printerid Jäta vahele kõik domeeni saidid diff -Nru chromium-128.0.6613.84/chrome/app/resources/generated_resources_eu.xtb chromium-128.0.6613.113/chrome/app/resources/generated_resources_eu.xtb --- chromium-128.0.6613.84/chrome/app/resources/generated_resources_eu.xtb 2024-08-21 22:46:06.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/generated_resources_eu.xtb 2024-08-28 22:38:49.000000000 +0000 @@ -10445,7 +10445,7 @@ &Luzapenak Ezin dute erabili mikrofonoa Ez eman HID gailuetara konektatzeko baimena webguneei -Inaktibo +Aldi baterako etenda CSS cachea Konexio seguruak soilik Berrikusi baldintza hauek eta kontrolatu haurraren datuak diff -Nru chromium-128.0.6613.84/chrome/app/resources/generated_resources_fr-CA.xtb chromium-128.0.6613.113/chrome/app/resources/generated_resources_fr-CA.xtb --- chromium-128.0.6613.84/chrome/app/resources/generated_resources_fr-CA.xtb 2024-08-21 22:46:06.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/generated_resources_fr-CA.xtb 2024-08-28 22:38:49.000000000 +0000 @@ -5961,7 +5961,7 @@ Source non prise en charge Associer un commutateur Bluetooth Connecter -Rechercher la présence de logiciel malveillant +Vérifier la présence de logiciels malveillants L'Assistant Google fonctionne aussi ici Identifiant de demande d'assistance Se connecter en tant que diff -Nru chromium-128.0.6613.84/chrome/app/resources/generated_resources_gu.xtb chromium-128.0.6613.113/chrome/app/resources/generated_resources_gu.xtb --- chromium-128.0.6613.84/chrome/app/resources/generated_resources_gu.xtb 2024-08-21 22:46:06.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/generated_resources_gu.xtb 2024-08-28 22:38:49.000000000 +0000 @@ -9916,7 +9916,7 @@ સાઇટને છબીઓ બતાવવાની મંજૂરી આપશો નહીં તમારો નો ડેટા ડિલીટ કરો હવે ખોલો -કૃપા કરી અમારા એન્જિનિયરોને આ સમસ્યા ઠીક કરવામાં સહાય કરો. તમને પ્રોફાઇલમાં ભૂલ આવ્યાનો સંદેશ મળ્યો બિલકુલ તે પહેલા શું થયું હતું તે અમને જણાવો: +કૃપા કરી અમારા એન્જિનિયરોને આ સમસ્યા ઠીક કરવામાં સહાય કરો. તમને પ્રોફાઇલમાં ભૂલ આવ્યાનો મેસેજ મળ્યો બિલકુલ તે પહેલા શું થયું હતું તે અમને જણાવો: પરથી પેજ શેર કરવામાં આવ્યું આ ટૅબ અન્ય ટૅબ સાથે સંસાધનો શેર કરે છે, જે ડિબગીંગમાં અવરોધ ઊભો કરી શકે છે. બહાર નીકળો diff -Nru chromium-128.0.6613.84/chrome/app/resources/generated_resources_it.xtb chromium-128.0.6613.113/chrome/app/resources/generated_resources_it.xtb --- chromium-128.0.6613.84/chrome/app/resources/generated_resources_it.xtb 2024-08-21 22:46:06.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/generated_resources_it.xtb 2024-08-28 22:38:50.000000000 +0000 @@ -5295,7 +5295,7 @@ Vuoi annullare la sincronizzazione? Impossibile eliminare la passkey Chrome Root Store contiene certificati di autorità di certificazione attendibili per Chrome Root Program ed è sottoposto a revisione continua. -Elimina tessera +Elimina carta Impossibile collegarsi Controllo ortografico avanzato nel browser Chrome (testo inviato a Google per suggerimenti ortografici) Crea codice QR per questa immagine diff -Nru chromium-128.0.6613.84/chrome/app/resources/generated_resources_ja.xtb chromium-128.0.6613.113/chrome/app/resources/generated_resources_ja.xtb --- chromium-128.0.6613.84/chrome/app/resources/generated_resources_ja.xtb 2024-08-21 22:46:06.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/generated_resources_ja.xtb 2024-08-28 22:38:50.000000000 +0000 @@ -1813,6 +1813,7 @@ ブックマークやジャーニーなどのサイドパネル表示をお試しください 一致するフォントは見つかりませんでした。 通常のユーザーとして を起動してください。開発の目的でルートとして実行する必要がある場合は、--no-sandbox フラグを指定して再実行してください。 +インターネット接続を確認してから、もう一度お試しください。以前に生成された下のテーマから選択することは可能です。 画面のプライバシー をインストールしますか? 設定をご確認ください diff -Nru chromium-128.0.6613.84/chrome/app/resources/generated_resources_kn.xtb chromium-128.0.6613.113/chrome/app/resources/generated_resources_kn.xtb --- chromium-128.0.6613.84/chrome/app/resources/generated_resources_kn.xtb 2024-08-21 22:46:06.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/generated_resources_kn.xtb 2024-08-28 22:38:50.000000000 +0000 @@ -274,7 +274,7 @@ ತಟಸ್ಥದ ಎಚ್ಚರಿಸುವಿಕೆಗಳು ಲಾಗ್ ಅನ್ನು ಅಪ್‌ಲೋಡ್ ಮಾಡಿಲ್ಲ. ಸಾಲುಗಳ ನಡುವೆ ಹೆಚ್ಚಿನ ಅಂತರ -{NUM_FILES,plural, =1{ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಫೈಲ್ ಅನ್ನು ಪ್ರವೇಶಿಸಿ}one{ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ # ಫೈಲ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸಿ}other{ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ # ಫೈಲ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸಿ}} +{NUM_FILES,plural, =1{ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ ಫೈಲ್ ಅನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ}one{ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ # ಫೈಲ್‌ಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ}other{ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್‌ನಲ್ಲಿ ಸಂಗ್ರಹವಾಗಿರುವ # ಫೈಲ್‌ಗಳನ್ನು ಆ್ಯಕ್ಸೆಸ್ ಮಾಡಿ}} Microsoft ಅಪ್ಲಿಕೇಶನ್ ನೀತಿಗಳು ನಿಮ್ಮ ಅಗತ್ಯಗಳಿಗೆ ಸರಿಹೊಂದುವ ಥೀಮ್ ಆಯ್ಕೆಮಾಡಿ. ನಿಮ್ಮ ಥೀಮ್, ವಾಲ್‌ಪೇಪರ್‌, ಸ್ಕ್ರೀನ್ ಸೇವರ್ ಮತ್ತು ಇತ್ಯಾದಿಗಳನ್ನು ಬದಲಾಯಿಸಲು, ಡೆಸ್ಕ್‌ಟಾಪ್ ಮೇಲೆ ಬಲ-ಕ್ಲಿಕ್ ಮಾಡಿದರೆ ಸಾಕು. {0,plural, =1{ನೀವು # ಸೆಕೆಂಡಿನಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸೈನ್ ಔಟ್ ಆಗುತ್ತೀರಿ. diff -Nru chromium-128.0.6613.84/chrome/app/resources/generated_resources_ko.xtb chromium-128.0.6613.113/chrome/app/resources/generated_resources_ko.xtb --- chromium-128.0.6613.84/chrome/app/resources/generated_resources_ko.xtb 2024-08-21 22:46:06.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/generated_resources_ko.xtb 2024-08-28 22:38:50.000000000 +0000 @@ -9503,7 +9503,7 @@ 고정 돋보기 확대/축소 수준: 의 응답을 기다리는 중... 본인이 아닙니다. -카드 닉네임 +카드 별명 이 비밀번호를 이미 변경하셨나요? 지금 새로고침하거나, 비슷한 탭을 새로 연 후에 다시 시도해 주세요. 메뉴 열기 diff -Nru chromium-128.0.6613.84/chrome/app/resources/generated_resources_nl.xtb chromium-128.0.6613.113/chrome/app/resources/generated_resources_nl.xtb --- chromium-128.0.6613.84/chrome/app/resources/generated_resources_nl.xtb 2024-08-21 22:46:06.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/generated_resources_nl.xtb 2024-08-28 22:38:50.000000000 +0000 @@ -9483,7 +9483,7 @@ Heb je dit wachtwoord al gewijzigd? Je kunt nu vernieuwen of het later opnieuw proberen nadat je nieuwe vergelijkbare tabbladen hebt geopend Het menu openen -Opgeslagen betaalmethoden zie je hier +Opgeslagen betaalmethoden vind je hier deelt je scherm en audio. Dialoogvenster 'Nieuw wifi-netwerk' Gedeelde mappen zijn beschikbaar in Linux in . @@ -10778,7 +10778,7 @@ Mensen met toegang tot je internetverkeer kunnen zien welke websites je bezoekt Meer bekijken… Argumenten voor API-functie -Deze pas wordt alleen op dit apparaat opgeslagen +Deze kaart wordt alleen op dit apparaat opgeslagen Sneltoets voor selectie Je browser of apparaat wordt hier niet merkbaar langzamer van. Dit Chromebook Enterprise-apparaat wordt geleverd met de Chrome Enterprise Upgrade. Schrijf dit apparaat in met een Google-beheerdersaccount om gebruik te maken van alle zakelijke mogelijkheden. diff -Nru chromium-128.0.6613.84/chrome/app/resources/generated_resources_pt-BR.xtb chromium-128.0.6613.113/chrome/app/resources/generated_resources_pt-BR.xtb --- chromium-128.0.6613.84/chrome/app/resources/generated_resources_pt-BR.xtb 2024-08-21 22:46:07.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/generated_resources_pt-BR.xtb 2024-08-28 22:38:50.000000000 +0000 @@ -5277,7 +5277,7 @@ Abacate Salvar frame de vídeo como… Leia estes termos e controle seus dados -Nome no cartão de crédito +Nome impresso no cartão Ativar a Navegação segura Detalhes do DBus Receba notificações com sugestões sobre como melhorar os problemas de desempenho detectados. Saiba mais sobre os alertas de problemas de desempenho @@ -10003,7 +10003,7 @@ Mostrar botão "Página inicial" Veja definições, traduções ou conversões de unidades ao clicar com o botão direito do mouse no texto ou tocar nele e mantê-lo pressionado. Personalize os idiomas da tradução em Idiomas de sites. Pai/mãe, as próximas etapas precisam ser feitas por você. Devolva o para a criança depois de terminar a configuração da conta. -Fazer o download da imagem +Baixar imagem Gerencie suas extensões clicando em "Extensões" no menu "Mais ferramentas". Permitir novamente Fazer download agora diff -Nru chromium-128.0.6613.84/chrome/app/resources/generated_resources_sw.xtb chromium-128.0.6613.113/chrome/app/resources/generated_resources_sw.xtb --- chromium-128.0.6613.84/chrome/app/resources/generated_resources_sw.xtb 2024-08-21 22:46:07.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/generated_resources_sw.xtb 2024-08-28 22:38:50.000000000 +0000 @@ -3128,7 +3128,7 @@ Ili uweze kusawazisha manenosiri yako, thibitisha kwamba ni wewe Kionyeshi awali: Unganisha kwenye -Kutafuta chochote kwenye ukurasa huu ukitumia Lenzi ya Google +Tafuta chochote kwenye ukurasa huu ukitumia Lenzi ya Google Ondoa ufikiaji wa funguo zako za siri kwenye kifaa hiki Kitufe cha Kuweka Upya Ishara chaguomsingi ya zambarau diff -Nru chromium-128.0.6613.84/chrome/app/resources/generated_resources_te.xtb chromium-128.0.6613.113/chrome/app/resources/generated_resources_te.xtb --- chromium-128.0.6613.84/chrome/app/resources/generated_resources_te.xtb 2024-08-21 22:46:07.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/generated_resources_te.xtb 2024-08-28 22:38:50.000000000 +0000 @@ -391,7 +391,7 @@ సపోర్ట్ చేయబడిన లింక్‌లను తెరుస్తోంది ఈ వినియోగదారు ఖాతా, పరికరం నమోదు చేయబడిన డొమైన్‌కు చెందినది కాదు. మీరు వేరొక డొమైన్‌కు నమోదు చేయాలనుకుంటే మీరు ముందుగా పరికరాన్ని పునరుద్ధరించాలి. ‌ను బ్లాక్ చేయండి -కుక్కీలు మరియు ఇతర సైట్ డేటా +కుక్కీలు, ఇతర సైట్ డేటా ఎంచుకోబడింది లాంచర్ + కుడి వైపు బాణం ను అన్ఇన్‌స్టాల్ చేయడం సాధ్యపడలేదు. @@ -8926,7 +8926,7 @@ యాప్‌ను అన్‌ఇన్‌స్టాల్ చేయండి Lacros మీ పరికరానికి కాపీ చేయండి -డౌన్‌లోడ్ చేయి +డౌన్‌లోడ్ చేయండి కేటాయింపును జోడించండి సులభంగా యాక్సెస్ చేయడం కోసం మీరు Google Lensను పిన్ చేయవచ్చు అడ్మిన్ ను బ్లాక్ చేశారు. ఈ యాప్‌ను ఉపయోగించడానికి అడ్మిన్‌ను అనుమతి అడగండి. @@ -9185,7 +9185,7 @@ ఏదీ లేదు వినియోగదారు నిర్వహించేవి లో ప్రసారం చేయడాన్ని ఆపివేయండి -విధి +టాస్క్ Play Storeను తెరువు బుక్‌మార్క్ నమూనాను లోడ్ చేయడం సాధ్యం కాలేదు. ఇతరులు ఈ పరికరాన్ని ట్రాక్ చేయకుండా నిరోధించడానికి మీ హార్డ్‌వేర్ ID (BSSID)ని ర్యాండమైజ్ చేయండి. @@ -9554,7 +9554,7 @@ మీరు USB సెక్యూరిటీ కీలో కోసం పాస్-కీని క్రియేట్ చేయాలనుకుంటే, ఇప్పుడే ఇన్‌సర్ట్ చేసి, తాకండి ఫైల్ దిగుమతి చెయ్యని కొన్ని బహుళ ప్రమాణపత్రాలను కలిగి ఉంది: కొత్త అజ్ఞాత ట్యాబ్ -ఎప్పుడూ లేదు +ఎప్పుడూ వద్దు టచ్‌ప్యాడ్ యాక్సిలరేషన్ విండో కుడి వైపునకు తరలించబడింది ఇతర పరికరాల బ్లూటూత్, నెట్‌వర్క్ కనెక్షన్‌లలో ఈ పేరు కనిపిస్తుంది @@ -10234,7 +10234,7 @@ Ctrl లేదా Altను చేర్చండి మీ స్క్రీన్‌లోని అంశాలను చిన్నవిగా లేదా పెద్దవిగా చేయండి శైలిని పేస్ట్ చేసి, సరిపోల్చు -నిల్వను మేనేజ్ చేయండి +స్టోరేజ్‌ను మేనేజ్ చేయండి తొలగించి, సైన్ అవుట్ చేయండి అన్నింటినీ కొత్త ట్యాబ్ గ్రూప్‌లో తెరవండి పాస్‌వర్డ్ షేర్ చేయబడింది @@ -10310,7 +10310,7 @@ మీ MIDI పరికరాలను కంట్రోల్ చేసి, తిరిగి ప్రోగ్రామ్ చేయకుండా ఈ సైట్ బ్లాక్ చేయబడింది విండో పైకి తరలించబడింది Google Play నుండి యాప్‌లను ఉపయోగించడానికి, మీరు మొదట మీ యాప్‌లను పునరుద్ధరించాలి. ఆ యాప్‌లు కొంత డేటాను కోల్పోయి ఉండవచ్చు. -యూజర్‌పేరు +యూజర్‌నేమ్ నేడు చూశారు తక్కువ మెమరీ సేవింగ్స్ స్క్రీన్ రిజల్యూషన్ diff -Nru chromium-128.0.6613.84/chrome/app/resources/generated_resources_uk.xtb chromium-128.0.6613.113/chrome/app/resources/generated_resources_uk.xtb --- chromium-128.0.6613.84/chrome/app/resources/generated_resources_uk.xtb 2024-08-21 22:46:07.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/generated_resources_uk.xtb 2024-08-28 22:38:50.000000000 +0000 @@ -5024,7 +5024,7 @@ Ретельна перевірка підозрілих завантажень. Позначити як непрочитане Переглянути паролі -Завжди дозволяти хосту доступ до ваших камери та мікрофона +Завжди дозволяти хосту доступ до ваших камери й мікрофона Ця вкладка шукає пристрої з Bluetooth Не вдається відкрити цей додаток, оскільки у вас немає дозволу запускати ізольовані веб-додатки Заборонити сайтам створювати 3D-карту вашого оточення або відстежувати положення камери diff -Nru chromium-128.0.6613.84/chrome/app/resources/generated_resources_vi.xtb chromium-128.0.6613.113/chrome/app/resources/generated_resources_vi.xtb --- chromium-128.0.6613.84/chrome/app/resources/generated_resources_vi.xtb 2024-08-21 22:46:07.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/generated_resources_vi.xtb 2024-08-28 22:38:51.000000000 +0000 @@ -9261,7 +9261,7 @@ Điều chỉnh ranh giới cho màn hình của bạn Thêm công cụ tìm kiếm trên trang web Xem các chứng chỉ được nhập từ ChromeOS -Tùy chọn +Không bắt buộc Cho phép các ứng dụng, trang web và dịch vụ trên ChromeOS và Android có quyền truy cập thông tin vị trí sử dụng thông tin vị trí của thiết bị này. Chế độ Độ chính xác của vị trí cung cấp thông tin chính xác hơn về vị trí cho các ứng dụng và dịch vụ Android. Để thực hiện việc này, Google định kỳ xử lý thông tin về cảm biến thiết bị và tín hiệu không dây từ thiết bị này nhằm thu thập dữ liệu vị trí dựa trên tín hiệu không dây từ đám đông. Những thông tin này sẽ được sử dụng theo cách không xác định danh tính của bất kỳ cá nhân nào nhằm cải thiện độ chính xác của vị trí và các dịch vụ dựa trên vị trí. Ngoài ra, những thông tin này còn dùng để cải thiện, cung cấp và duy trì các dịch vụ của Google căn cứ trên lợi ích chính đáng của Google và bên thứ ba nhằm phục vụ nhu cầu của người dùng. Không dùng được tài khoản này Thêm địa chỉ diff -Nru chromium-128.0.6613.84/chrome/app/resources/generated_resources_zh-CN.xtb chromium-128.0.6613.113/chrome/app/resources/generated_resources_zh-CN.xtb --- chromium-128.0.6613.84/chrome/app/resources/generated_resources_zh-CN.xtb 2024-08-21 22:46:07.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/generated_resources_zh-CN.xtb 2024-08-28 22:38:51.000000000 +0000 @@ -592,7 +592,7 @@ 打印 最后一次软件更新 管理搜索引擎 -朗读模式 +阅读模式 启动 这将重置您的启动页、“打开新的标签页”页面、搜索引擎和固定标签页,同时还会停用所有扩展程序并清除临时数据(例如 Cookie)。但是,系统不会清除您的书签、历史记录和保存的密码。 首页是新标签页 @@ -2458,7 +2458,7 @@ 选择“我喜欢”,会提交您喜欢这些搜索结果的反馈。 请勿复制 浅色背景 -排定时间 +时间安排 收起... 您的管理员已禁止使用 Steam for Chromebook(Beta 版)。您的管理员需要开启以下政策: 书签和清单(&B) @@ -3318,7 +3318,7 @@ 分隔符 您的标签页分组现在会自动保存。 -付款方式 +支付方式 当此设置处于开启状态时,密码会保存到 中。当此设置处于关闭状态时,密码只会保存在此设备上。 使用增强的“拼写检查”功能 不允许以下网站了解您何时在主动使用设备 @@ -11372,7 +11372,7 @@ ,您好 关闭所有标签页 - 摄像头正在录像且麦克风正在录音 -付款方式 +支付方式 添加拼写检查语言 风光 Parallels Desktop: diff -Nru chromium-128.0.6613.84/chrome/app/resources/google_chrome_strings_ta.xtb chromium-128.0.6613.113/chrome/app/resources/google_chrome_strings_ta.xtb --- chromium-128.0.6613.84/chrome/app/resources/google_chrome_strings_ta.xtb 2024-08-21 22:46:07.000000000 +0000 +++ chromium-128.0.6613.113/chrome/app/resources/google_chrome_strings_ta.xtb 2024-08-28 22:38:51.000000000 +0000 @@ -265,7 +265,7 @@ இந்த நாட்டில் அணுகல் தடைசெய்யப்பட்டுள்ளதால் நிறுவ முடியவில்லை. நீங்கள் ஆக உள்நுழைந்துள்ளீர்கள். தற்போது உங்கள் புக்மார்க்குகள், வரலாறு மற்றும் பிற அமைப்புகளை நீங்கள் உள்நுழைந்துள்ள எல்லா சாதனங்களிலும் அணுகலாம். Chrome அறிவிப்பு அமைப்புகளுக்குச் செல் -உங்கள் உலாவல் அனுபவத்தை மேம்படுத்தவும், ஆதாரங்கள் கிடைக்கும்படி செய்யவும் இந்தப் பக்கங்களை Chrome முடக்கலாம். +உங்கள் உலாவல் அனுபவத்தை மேம்படுத்தவும், ரிசோர்ஸ்கள் கிடைக்கும்படி செய்யவும் இந்தப் பக்கங்களை Chrome முடக்கலாம். Chromeமுக்கு அணுகல் கிடைத்தவுடன், இணையதளங்கள் உங்களிடம் அணுகலைக் கோர முடியும். Chrome சமீபத்திய பதிப்பிற்குப் புதுப்பிக்கப்படவில்லை என்பதால், புதிய அம்சங்களையும் பாதுகாப்புத் திருத்தங்களையும் தவறவிடுகிறீர்கள். Chrome மறைநிலை @@ -360,7 +360,7 @@ இந்த உலாவியில் பணிக் கணக்கைச் சேர்த்தல் AI உதவியோடு மிகுந்த நம்பிக்கையுடன் எழுதுங்கள் Chrome இன்னும் சிறப்படைந்துள்ளது -இந்தப் பக்கங்கள் கூடுதல் வளங்களைப் பயன்படுத்துகின்றன. செயல்திறனை மேம்படுத்த, அவற்றை முடக்குவதற்கு Chromeமை அனுமதியுங்கள். +இந்தப் பக்கங்கள் கூடுதல் ரிசோர்ஸ்களைப் பயன்படுத்துகின்றன. செயல்திறனை மேம்படுத்த, அவற்றை முடக்குவதற்கு Chromeமை அனுமதியுங்கள். PDFகளை Chromeமில் திற Chrome தரவு பயன்படுத்தப்படாமல் இருந்தால் உங்கள் நிறுவனம் அதை நீக்கிவிடும். இதில் பதிவு, தன்னிரப்பி, பதிவிறக்கங்கள் ஆகியவை அடங்கலாம். - Google Chrome diff -Nru chromium-128.0.6613.84/chrome/browser/ash/app_mode/kiosk_controller_impl.cc chromium-128.0.6613.113/chrome/browser/ash/app_mode/kiosk_controller_impl.cc --- chromium-128.0.6613.84/chrome/browser/ash/app_mode/kiosk_controller_impl.cc 2024-08-21 22:46:07.000000000 +0000 +++ chromium-128.0.6613.113/chrome/browser/ash/app_mode/kiosk_controller_impl.cc 2024-08-28 22:38:51.000000000 +0000 @@ -303,11 +303,6 @@ !kiosk_app_id.empty()) { chrome_app_manager_.SetAppWasAutoLaunchedWithZeroDelay(kiosk_app_id); } - - if (auto* input_controller = - ui::OzonePlatform::GetInstance()->GetInputController()) { - input_controller->DisableKeyboardImposterCheck(); - } } void KioskControllerImpl::OnAppLaunched( @@ -318,6 +313,10 @@ } void KioskControllerImpl::OnLaunchComplete(KioskAppLaunchError::Error error) { + if (auto* input_controller = + ui::OzonePlatform::GetInstance()->GetInputController()) { + input_controller->DisableKeyboardImposterCheck(); + } // Delete the launcher so it doesn't end up with dangling references. DeleteLaunchControllerAsync(); } @@ -346,6 +345,10 @@ const std::optional& app_name) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (success) { + if (auto* input_controller = + ui::OzonePlatform::GetInstance()->GetInputController()) { + input_controller->DisableKeyboardImposterCheck(); + } InitializeKioskSystemSession(app, profile, app_name); } else { chrome::AttemptUserExit(); diff -Nru chromium-128.0.6613.84/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_zh-CN.xtb chromium-128.0.6613.113/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_zh-CN.xtb --- chromium-128.0.6613.84/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_zh-CN.xtb 2024-08-21 22:46:10.000000000 +0000 +++ chromium-128.0.6613.113/chrome/browser/ui/android/fast_checkout/internal/java/strings/translations/android_fast_checkout_strings_zh-CN.xtb 2024-08-28 22:38:54.000000000 +0000 @@ -20,5 +20,5 @@ 送货地址 想更快捷地结账? 自动填充我的信息 -付款方式 +支付方式 \ No newline at end of file diff -Nru chromium-128.0.6613.84/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb chromium-128.0.6613.113/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb --- chromium-128.0.6613.84/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb 2024-08-21 22:46:10.000000000 +0000 +++ chromium-128.0.6613.113/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb 2024-08-28 22:38:54.000000000 +0000 @@ -277,7 +277,7 @@ Палепшаны Бяспечны прагляд уключаны Выдаліць і выйсці Не ўдалося ўсталяваць праграму "". -Агульны аб'ём даных Chrome, у тым ліку закладкі, уліковыя запісы і захаваныя налады +Агульны аб’ём даных Chrome, у тым ліку закладкі, уліковыя запісы і захаваныя налады Палітыка прыватнасці Google Працягнуць Вы ўвайшлі як . . Кнопка адкрывае налады. @@ -854,7 +854,7 @@ Інфармацыя для разгляду Іншыя дзеянні могуць захоўвацца ва Уліковым запісе Google, у які вы ўвайшлі. Іх можна выдаліць у любы час. Няма ўкладак -Паведамленне пра аб'яднанне пароляў закрыта +Паведамленне пра аб’яднанне пароляў закрыта Захоўванне без шыфравання Укажыце, ці трэба перадзагружаць старонкі Увайдзіце на сайт і ў Chrome, каб карыстацца ўкладкамі і іншым змесцівам на ўсіх сваіх прыладах diff -Nru chromium-128.0.6613.84/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb chromium-128.0.6613.113/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb --- chromium-128.0.6613.84/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb 2024-08-21 22:46:10.000000000 +0000 +++ chromium-128.0.6613.113/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb 2024-08-28 22:38:55.000000000 +0000 @@ -1452,7 +1452,7 @@ Se utilizarán datos móviles Accede a todas tus pestañas No hay espacio suficiente en el dispositivo. -Opcionales +Opcional Tarjeta SD Añadir dirección pestaña eliminada diff -Nru chromium-128.0.6613.84/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb chromium-128.0.6613.113/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb --- chromium-128.0.6613.84/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb 2024-08-21 22:46:10.000000000 +0000 +++ chromium-128.0.6613.113/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb 2024-08-28 22:38:55.000000000 +0000 @@ -1492,7 +1492,7 @@ Lorem Ipsum 앱이 설치됨 자동 번역할 언어 -카드 닉네임 +카드 별명 메뉴 열기 데이터 유출로 인해 비밀번호가 노출된 경우 알립니다. 파일을 다운로드할 수 없습니다. 지원되지 않는 파일 형식입니다. diff -Nru chromium-128.0.6613.84/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb chromium-128.0.6613.113/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb --- chromium-128.0.6613.84/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb 2024-08-21 22:46:10.000000000 +0000 +++ chromium-128.0.6613.113/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb 2024-08-28 22:38:55.000000000 +0000 @@ -1006,7 +1006,7 @@ Бул маалыматты Chrome'дун параметрлеринен өчүрө аласыз тизмесине сакталды Белгисиз -Шилтеме менен бөлүшүү +Шилтемени бөлүшүү Chrome Dino PDF файлы колдонмосу менен ачылсынбы? тындырылды diff -Nru chromium-128.0.6613.84/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb chromium-128.0.6613.113/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb --- chromium-128.0.6613.84/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb 2024-08-21 22:46:10.000000000 +0000 +++ chromium-128.0.6613.113/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb 2024-08-28 22:38:55.000000000 +0000 @@ -792,7 +792,7 @@ Quer excluir o arquivo ? Saiba como o Chrome protege você () -Nome no cartão de crédito +Nome impresso no cartão Abrir a página inicial Dispositivos vinculados Página inferior de login. @@ -1040,7 +1040,7 @@ {ITEMS_COUNT,plural, =1{1 página na sua Lista de leitura}one{# página na sua Lista de leitura}other{# páginas na sua Lista de leitura}} Verificar senhas e O Chrome removeu essas permissões porque você não visitou o site recentemente -Fazer o download da página novamente? +Baixar página novamente? Continuar usando o Google Voltar a seguir Seus dispositivos @@ -1242,7 +1242,7 @@ {FILE_COUNT,plural, =1{Arquivos de áudio: 1 arquivo de áudio na lista}one{Arquivos de áudio: # arquivo de áudio na lista}other{Arquivos de áudio: # arquivos de áudio na lista}} Discover do Google (desativado) Excluir senha? -Fazer o download da imagem +Baixar imagem Página de filtro de apps Preenchimento automático de dados de formulário Nova guia anônima diff -Nru chromium-128.0.6613.84/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb chromium-128.0.6613.113/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb --- chromium-128.0.6613.84/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb 2024-08-21 22:46:10.000000000 +0000 +++ chromium-128.0.6613.113/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb 2024-08-28 22:38:55.000000000 +0000 @@ -1407,7 +1407,7 @@ అన్ని వెబ్‌సైట్‌లలో మీ Google ఖాతా నుండి సైన్ అవుట్ చేయడానికి, Chrome నుండి సైన్ అవుట్ చేయండి. అప్‌డేట్‌లు అందుబాటులో లేవు ఈ ప్రొవైడర్ గోప్యతా పాలసీని చూడండి -డౌన్‌లోడ్ చేయి +డౌన్‌లోడ్ చేయండి మీ Google ఖాతాలోని పాస్‌వర్డ్‌లకు Google ఆటోమేటిక్ ఎన్‌క్రిప్షన్‌ను ఉపయోగించండి ఈ ఆప్షన్ ప్రస్తుతం అందుబాటులో లేదు. సైట్‌కు కనెక్ట్ చేయడం సాధ్యపడలేదు @@ -1632,7 +1632,7 @@ ఇక్కడ చూడటానికి ఏమీ లేదు… ఇప్పటికీ పేజీ గణాంకాలకు సంబంధించి లోడింగ్ ఇండికేటర్ Chrome పాస్‌వర్డ్‌లు -యూజర్‌పేరు +యూజర్‌నేమ్ డౌన్‌లోడ్ స్టేటస్‌కు సంబంధించిన నోటిఫికేషన్‌ను చూడండి మీ డౌన్‌లోడ్‌లను ఇక్కడ కనుగొనవచ్చు మీరు ఇకపై నుండి నోటిఫికేషన్‌లను అందుకోలేరు. diff -Nru chromium-128.0.6613.84/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb chromium-128.0.6613.113/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb --- chromium-128.0.6613.84/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb 2024-08-21 22:46:10.000000000 +0000 +++ chromium-128.0.6613.113/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb 2024-08-28 22:38:55.000000000 +0000 @@ -1452,7 +1452,7 @@ Sử dụng dữ liệu di động Xem tất cả thẻ của bạn Không đủ dung lượng trên thiết bị. -Tùy chọn +Không bắt buộc Thẻ SD Thêm địa chỉ Đã xoá thẻ diff -Nru chromium-128.0.6613.84/chrome/browser/ui/ash/glanceables/glanceables_browsertest.cc chromium-128.0.6613.113/chrome/browser/ui/ash/glanceables/glanceables_browsertest.cc --- chromium-128.0.6613.84/chrome/browser/ui/ash/glanceables/glanceables_browsertest.cc 2024-08-21 22:46:10.000000000 +0000 +++ chromium-128.0.6613.113/chrome/browser/ui/ash/glanceables/glanceables_browsertest.cc 2024-08-28 22:38:55.000000000 +0000 @@ -915,4 +915,69 @@ EXPECT_EQ(error_view->GetButtonForTest()->GetText(), u"Dismiss"); } +IN_PROC_BROWSER_TEST_F(GlanceablesTasksBrowserTest, + SavelyRemoveTaskViewInEditState) { + // Click the date tray to show the glanceable bubbles. + ToggleDateTray(); + + EXPECT_TRUE(GetGlanceableTrayBubble()); + EXPECT_TRUE(GetTasksView()); + + // Check that task list items from the first list are shown. + EXPECT_EQ(GetCurrentTaskListItemTitles(), + std::vector( + {"Task List 1 Item 1 Title", "Task List 1 Item 2 Title"})); + + // Close the glanceables. + ToggleDateTray(); + base::RunLoop().RunUntilIdle(); + + // Turn on the pause_on_fetch to pause in between the cached tasks is shown + // and the tasks has started fetching. + auto* const client = fake_glanceables_tasks_client(); + client->set_paused_on_fetch(true); + + // Delete the whole task list. + client->DeleteTaskList(/*task_list_id=*/"TaskListID1"); + + // Open the glanceables again. + ToggleDateTray(); + base::RunLoop().RunUntilIdle(); + + // Check that the deleted task list is still shown. + EXPECT_EQ(GetCurrentTaskListItemTitles(), + std::vector( + {"Task List 1 Item 1 Title", "Task List 1 Item 2 Title"})); + + GetTasksView()->GetWidget()->LayoutRootViewIfNecessary(); + + // Before fetch, click on the cached task and see if the textfield shows up. + auto* first_task_view_label = + GetTaskItemView(/*item_index=*/0) + ->GetViewByID( + base::to_underlying(GlanceablesViewId::kTaskItemTitleLabel)); + GetEventGenerator()->MoveMouseTo( + first_task_view_label->GetBoundsInScreen().CenterPoint()); + GetEventGenerator()->ClickLeftButton(); + + auto* first_task_view_textfield = + GetTaskItemView(/*item_index=*/0) + ->GetViewByID( + base::to_underlying(GlanceablesViewId::kTaskItemTitleTextField)); + ASSERT_TRUE(first_task_view_textfield); + ASSERT_TRUE(first_task_view_textfield->GetVisible()); + + // Start fetching new data. + client->RunPendingGetTaskListsCallbacks(); + EXPECT_FALSE(GetTasksView()->GetCanProcessEventsWithinSubtree()); + client->RunPendingGetTasksCallbacks(); + EXPECT_TRUE(GetTasksView()->GetCanProcessEventsWithinSubtree()); + + // Check if the second list is shown after fetch and nothing crashed. + EXPECT_EQ(GetCurrentTaskListItemTitles(), + std::vector({"Task List 2 Item 1 Title", + "Task List 2 Item 2 Title", + "Task List 2 Item 3 Title"})); +} + } // namespace ash diff -Nru chromium-128.0.6613.84/chrome/browser/ui/views/location_bar/location_bar_view.cc chromium-128.0.6613.113/chrome/browser/ui/views/location_bar/location_bar_view.cc --- chromium-128.0.6613.84/chrome/browser/ui/views/location_bar/location_bar_view.cc 2024-08-21 22:46:11.000000000 +0000 +++ chromium-128.0.6613.113/chrome/browser/ui/views/location_bar/location_bar_view.cc 2024-08-28 22:38:55.000000000 +0000 @@ -317,8 +317,8 @@ omnibox_additional_text_view_->SetEnabledColorId(kColorOmniboxResultsUrl); } - selected_keyword_view_ = AddChildView(std::make_unique( - this, TemplateURLServiceFactory::GetForProfile(profile_), font_list)); + selected_keyword_view_ = AddChildView( + std::make_unique(this, profile_, font_list)); if (browser_ && apps::features::ShouldShowLinkCapturingUX()) { intent_chip_ = diff -Nru chromium-128.0.6613.84/chrome/browser/ui/views/location_bar/selected_keyword_view.cc chromium-128.0.6613.113/chrome/browser/ui/views/location_bar/selected_keyword_view.cc --- chromium-128.0.6613.84/chrome/browser/ui/views/location_bar/selected_keyword_view.cc 2024-08-21 22:46:11.000000000 +0000 +++ chromium-128.0.6613.113/chrome/browser/ui/views/location_bar/selected_keyword_view.cc 2024-08-28 22:38:55.000000000 +0000 @@ -5,6 +5,9 @@ #include "chrome/browser/ui/views/location_bar/selected_keyword_view.h" #include "base/check.h" +#include "chrome/browser/history_embeddings/history_embeddings_utils.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/search_engines/template_url_service_factory.h" #include "chrome/browser/ui/color/chrome_color_id.h" #include "chrome/browser/ui/layout_constants.h" #include "chrome/grit/generated_resources.h" @@ -32,7 +35,7 @@ // static SelectedKeywordView::KeywordLabelNames SelectedKeywordView::GetKeywordLabelNames(const std::u16string& keyword, - TemplateURLService* service) { + const TemplateURLService* service) { KeywordLabelNames names; if (service) { bool is_extension_keyword = false; @@ -54,10 +57,9 @@ SelectedKeywordView::SelectedKeywordView( IconLabelBubbleView::Delegate* delegate, - TemplateURLService* template_url_service, + Profile* profile, const gfx::FontList& font_list) - : IconLabelBubbleView(font_list, delegate), - template_url_service_(template_url_service) { + : IconLabelBubbleView(font_list, delegate), profile_(profile) { full_label_.SetFontList(font_list); full_label_.SetVisible(false); partial_label_.SetFontList(font_list); @@ -94,15 +96,16 @@ // Use the search icon for most keywords. Use special icons for '@gemini' and // @history'. const TemplateURL* template_url = - template_url_service_->GetTemplateURLForKeyword(keyword_); + TemplateURLServiceFactory::GetForProfile(profile_) + ->GetTemplateURLForKeyword(keyword_); auto* vector_icon = &vector_icons::kSearchIcon; if (template_url && template_url->starter_pack_id() == TemplateURLStarterPackData::kAskGoogle) { vector_icon = &omnibox::kSparkIcon; - } else if (base::FeatureList::IsEnabled( - history_embeddings::kHistoryEmbeddings) && - template_url && + } else if (history_embeddings::IsHistoryEmbeddingsEnabledForProfile( + profile_) && + history_embeddings::kOmniboxScoped.Get() && template_url && template_url->starter_pack_id() == TemplateURLStarterPackData::kHistory) { vector_icon = &omnibox::kSearchSparkIcon; @@ -143,13 +146,16 @@ return; keyword_ = keyword; OnPropertyChanged(&keyword_, views::kPropertyEffectsNone); + + const auto* template_url_service = + TemplateURLServiceFactory::GetForProfile(profile_); // TODO(pkasting): Arguably, much of the code below would be better as // property change handlers in file-scope subclasses of Label etc. - if (keyword.empty() || !template_url_service_) + if (keyword.empty() || !template_url_service) { return; + } - KeywordLabelNames names = - GetKeywordLabelNames(keyword, template_url_service_); + KeywordLabelNames names = GetKeywordLabelNames(keyword, template_url_service); full_label_.SetText(names.full_name); partial_label_.SetText(names.short_name); diff -Nru chromium-128.0.6613.84/chrome/browser/ui/views/location_bar/selected_keyword_view.h chromium-128.0.6613.113/chrome/browser/ui/views/location_bar/selected_keyword_view.h --- chromium-128.0.6613.84/chrome/browser/ui/views/location_bar/selected_keyword_view.h 2024-08-21 22:46:11.000000000 +0000 +++ chromium-128.0.6613.113/chrome/browser/ui/views/location_bar/selected_keyword_view.h 2024-08-28 22:38:55.000000000 +0000 @@ -13,6 +13,7 @@ #include "ui/base/metadata/metadata_header_macros.h" #include "ui/views/controls/label.h" +class Profile; class TemplateURLService; namespace gfx { @@ -33,11 +34,12 @@ // behavior, e.g. "Search google.com" or an equivalent translation, with // consideration for bidirectional text safety using |service|. Empty // names are returned if service is null. - static KeywordLabelNames GetKeywordLabelNames(const std::u16string& keyword, - TemplateURLService* service); + static KeywordLabelNames GetKeywordLabelNames( + const std::u16string& keyword, + const TemplateURLService* service); SelectedKeywordView(IconLabelBubbleView::Delegate* delegate, - TemplateURLService* template_url_service, + Profile* profile, const gfx::FontList& font_list); SelectedKeywordView(const SelectedKeywordView&) = delete; SelectedKeywordView& operator=(const SelectedKeywordView&) = delete; @@ -67,7 +69,8 @@ void SetLabelForCurrentWidth(); - raw_ptr template_url_service_; + // May be nullptr in tests. + const raw_ptr profile_; // The keyword we're showing. If empty, no keyword is selected. // NOTE: we don't cache the TemplateURL as it is possible for it to get diff -Nru chromium-128.0.6613.84/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc chromium-128.0.6613.113/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc --- chromium-128.0.6613.84/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc 2024-08-21 22:46:11.000000000 +0000 +++ chromium-128.0.6613.113/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.cc 2024-08-28 22:38:55.000000000 +0000 @@ -56,6 +56,11 @@ // kUniformRowHeight flag is enabled. static constexpr int kUniformRowHeightIconSize = 28; +// The gap between the left|right edge of the IPH background to the left|right +// edge of the text bounds. Does not apply to the left side of IPHs with icons, +// since the text will have to be further right to accommodate the icons. +static constexpr int kIphTextIndent = 14; + // The size (edge length or diameter) of the answer icon backgrounds (which may // be squares or circles). int GetAnswerImageSize() { @@ -179,12 +184,19 @@ int contents_width, int separator_width, int description_width, + int iph_link_width, int available_width, bool description_on_separate_line, bool allow_shrinking_contents, int* contents_max_width, - int* description_max_width) { + int* description_max_width, + int* iph_link_max_width) { available_width = std::max(available_width, 0); + + // The IPH link is top priority. + *iph_link_max_width = std::min(iph_link_width, available_width); + available_width = std::max(available_width - iph_link_width, 0); + *contents_max_width = std::min(contents_width, available_width); *description_max_width = std::min(description_width, available_width); @@ -462,7 +474,10 @@ gfx::Insets OmniboxMatchCellView::GetInsets() const { const int vertical_margin = 0; - const int right_margin = 7; + // IPH text bounds should be centered within the IPH background when there's + // no IPH icon. So make their `right_margin` equal to their text's x position. + const int right_margin = + is_iph_type_ ? OmniboxMatchCellView::kMarginLeft + kIphTextIndent : 7; return gfx::Insets::TLBR(vertical_margin, OmniboxMatchCellView::kMarginLeft, vertical_margin, right_margin); } @@ -477,25 +492,10 @@ const int row_height = child_area.height(); - // The entity, answer, and icon images are horizontally centered within their - // bounds. So their center-line will be at `image_x+kImageBoundsWidth/2`. This - // means their left x coordinate will depend on their actual sizes. Their - // widths depend on the state of `kSquareSuggestIcons`, its params, and - // `kUniformRowHeight`. This code guarantees when cr23_layout is true: - // a) Entities' left x coordinate is 16. - // b) Entities, answers, and icons continue to be center-aligned. - // c) Regardless of the state of those other features and their widths. - // This applies to both touch-UI and non-touch-UI. - // TODO(manukh): Once we have a clearer picture of what will launch, this can - // be simplified. - const int image_x = 16 + GetEntityImageSize() / 2 - kImageBoundsWidth / 2; + int image_x = GetImageIndent(); views::ImageView* const image_view = has_image_ ? answer_image_view_.get() : icon_view_.get(); - // The IPH row left inset is +kIPHLeftOffset from other suggestions, so the - // image bounds should be -kIPHLeftOffset to keep the icon aligned. - int bounds_offset = is_iph_type_ ? kIPHLeftOffset : 0; - image_view->SetBounds(image_x, y, kImageBoundsWidth - bounds_offset, - row_height); + image_view->SetBounds(image_x, y, kImageBoundsWidth, row_height); const int text_indent = GetTextIndent() + tail_suggest_common_prefix_width_; x += text_indent; @@ -518,10 +518,12 @@ int content_width = content_view_->GetPreferredSize().width(); int description_width = description_view_->GetPreferredSize().width(); const gfx::Size separator_size = separator_view_->GetPreferredSize(); - ComputeMatchMaxWidths(content_width, separator_size.width(), - description_width, text_width, - /*description_on_separate_line=*/false, - !is_search_type_, &content_width, &description_width); + int iph_link_width = iph_link_view_->GetPreferredSize().width(); + ComputeMatchMaxWidths( + content_width, separator_size.width(), description_width, + iph_link_width, /*available_width=*/text_width, + /*description_on_separate_line=*/false, !is_search_type_, + &content_width, &description_width, &iph_link_width); if (tail_suggest_ellipse_view_->GetVisible()) { const int tail_suggest_ellipse_width = tail_suggest_ellipse_view_->GetPreferredSize().width(); @@ -541,8 +543,7 @@ separator_view_->SetSize(gfx::Size()); description_view_->SetSize(gfx::Size()); } - iph_link_view_->SetBounds(x, y, iph_link_view_->GetPreferredSize().width(), - row_height); + iph_link_view_->SetBounds(x, y, iph_link_width, row_height); } } @@ -570,11 +571,57 @@ return gfx::Size(width, height); } +int OmniboxMatchCellView::GetImageIndent() const { + // Image indent ignores the `OmniboxMatchCellView::GetInsets()`. + + // This number is independent of other layout numbers; i.e., it's not meant to + // align with any other UI; it's just arbitrarily chosen by UX. Hence, it's + // not derived from other matches' `indent` below. + if (is_iph_type_) + return 2; + + // The entity, answer, and icon images are horizontally centered within their + // bounds. So their center-line will be at `image_x+kImageBoundsWidth/2`. This + // means their left x coordinate will depend on their actual sizes. Their + // widths depend on the state of `kSquareSuggestIcons`, its params, and + // `kUniformRowHeight`. This code guarantees when cr23_layout is true: + // a) Entities' left x coordinate is 16. + // b) Entities, answers, and icons continue to be center-aligned. + // c) Regardless of the state of those other features and their widths. + // This applies to both touch-UI and non-touch-UI. + int indent = 16 + GetEntityImageSize() / 2 - kImageBoundsWidth / 2; + + return indent; +} + int OmniboxMatchCellView::GetTextIndent() const { - // The IPH row left inset is +kIPHLeftOffset from other suggestions, so the - // text indent should be -kIPHLeftOffset to keep the text aligned. - int offset = is_iph_type_ ? kIPHLeftOffset : 0; - return 52 - offset; + // Text indent is added to the `OmniboxMatchCellView::GetInsets()`. It is not + // added to the image position & size. + + // Some IPH matches have no icons. They should be moved further left so the + // gap between the IPH background and the start of the IPH text isn't jarring. + // Non-IPH matches without icons (e.g. the 'no results found' tab match) don't + // want to apply this left shift because their text needs to align with the + // other matches' and the omnibox's texts. This number is independent of other + // layout numbers; i.e., it's not meant to align with other UI; it's just + // arbitrarily chosen by UX. Hence, it's not derived from other matches' + // `indent` below. + if (is_iph_type_ && icon_view_->GetPreferredSize() == gfx::Size{}) + return kIphTextIndent; + + // For normal matches, the gap between the left edge of this view and the + // left edge of its favicon or answer image. + int indent = 52; + + // The IPH row left inset is +`kIphOffset` from other suggestions, so the text + // indent should be -`kIphOffset` to keep the text aligned. IPH matches seem + // to have inner padding, so the gap between the left edge of this + // `OmniboxMatchCellView` and the IPH icon/text is actually larger than + // `indent`. + if (is_iph_type_) + indent -= kIphOffset; + + return indent; } void OmniboxMatchCellView::SetTailSuggestCommonPrefixWidth( diff -Nru chromium-128.0.6613.84/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.h chromium-128.0.6613.113/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.h --- chromium-128.0.6613.84/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.h 2024-08-21 22:46:11.000000000 +0000 +++ chromium-128.0.6613.113/chrome/browser/ui/views/omnibox/omnibox_match_cell_view.h 2024-08-28 22:38:55.000000000 +0000 @@ -23,10 +23,21 @@ public: // Constants used in layout. Exposed so other views can coordinate margins. + + // The gap between the popup's left edge (not the focus indicator's edge) and + // `OmniboxMatchCellView`. static constexpr int kMarginLeft = 4; + // Probably intended to be the gap between the popup's right edge (assuming no + // buttons) and the text cut off. But this isn't used by + // `OmniboxMatchCellView`. `OmniboxMatchCellView::GetInsets()` hardcodes 7; so + // 8 here is probably wrong. static constexpr int kMarginRight = 8; + // The width of icon, answer, and entity image bounds. These images are + // smaller than this bounds; they'll be centered within the bounds. static constexpr int kImageBoundsWidth = 40; - static constexpr int kIPHLeftOffset = 16; + // For IPH matches, `OmniboxMatchCellView` is inset from the left & right by + // `kIphOffset`. + static constexpr int kIphOffset = 16; // Computes the maximum width, in pixels, that can be allocated for the two // parts of an autocomplete result, i.e. the contents and the description. @@ -44,11 +55,13 @@ static void ComputeMatchMaxWidths(int contents_width, int separator_width, int description_width, + int iph_link_width, int available_width, bool description_on_separate_line, bool allow_shrinking_contents, int* contents_max_width, - int* description_max_width); + int* description_max_width, + int* iph_link_max_width); explicit OmniboxMatchCellView(OmniboxResultView* result_view); OmniboxMatchCellView(const OmniboxMatchCellView&) = delete; @@ -96,6 +109,16 @@ TWO_LINE_SUGGESTION, }; + // How far to indent the icon, entity, or answer image from the left side of + // this view. Images are positioned ignoring `GetInsets()`; i.e., this + // measures from the visual left edge of the popup. + int GetImageIndent() const; + + // How far to indent the text from the left side of this view. Texts are + // positioned considering `GetInsets()` but ignoring the width and positioning + // of images; i.e., this measures from the visual left edge of the popup + + // `kMarginLeft`. IPH matches are externally inset as well, so this will + // measure from the left edge of the IPH background + `kMarginLeft`. int GetTextIndent() const; void SetTailSuggestCommonPrefixWidth(const std::u16string& common_prefix); diff -Nru chromium-128.0.6613.84/chrome/browser/ui/views/omnibox/omnibox_match_cell_view_unittest.cc chromium-128.0.6613.113/chrome/browser/ui/views/omnibox/omnibox_match_cell_view_unittest.cc --- chromium-128.0.6613.84/chrome/browser/ui/views/omnibox/omnibox_match_cell_view_unittest.cc 2024-08-21 22:46:11.000000000 +0000 +++ chromium-128.0.6613.113/chrome/browser/ui/views/omnibox/omnibox_match_cell_view_unittest.cc 2024-08-28 22:38:55.000000000 +0000 @@ -7,125 +7,171 @@ #include "testing/gtest/include/gtest/gtest.h" TEST(OmniboxMatchCellViewTest, ComputeMatchMaxWidths) { - int contents_max_width, description_max_width; + int contents_max_width, description_max_width, iph_link_max_width; const int separator_width = 10; const int kMinimumContentsWidth = 300; - int contents_width, description_width, available_width; + int contents_width, description_width, iph_link_view_width, available_width; - // Both contents and description fit fine. + // Contents, description, and IPH link fit fine. contents_width = 100; description_width = 50; + iph_link_view_width = 30; available_width = 200; OmniboxMatchCellView::ComputeMatchMaxWidths( - contents_width, separator_width, description_width, available_width, - false, true, &contents_max_width, &description_max_width); - EXPECT_EQ(contents_width, contents_max_width); - EXPECT_EQ(description_width, description_max_width); + contents_width, separator_width, description_width, iph_link_view_width, + available_width, false, true, &contents_max_width, &description_max_width, + &iph_link_max_width); + EXPECT_EQ(contents_max_width, contents_width); + EXPECT_EQ(description_max_width, description_width); + EXPECT_EQ(iph_link_max_width, 30); + + // IPH link should be given priority. + contents_width = 100; + description_width = 50; + iph_link_view_width = 30; + available_width = 20; + OmniboxMatchCellView::ComputeMatchMaxWidths( + contents_width, separator_width, description_width, iph_link_view_width, + available_width, false, true, &contents_max_width, &description_max_width, + &iph_link_max_width); + EXPECT_EQ(contents_max_width, 0); + EXPECT_EQ(description_max_width, 0); + EXPECT_EQ(iph_link_max_width, 20); // Contents should be given as much space as it wants up to 300 pixels. contents_width = 100; description_width = 50; - available_width = 100; + iph_link_view_width = 30; + available_width = 130; OmniboxMatchCellView::ComputeMatchMaxWidths( - contents_width, separator_width, description_width, available_width, - false, true, &contents_max_width, &description_max_width); - EXPECT_EQ(contents_width, contents_max_width); - EXPECT_EQ(0, description_max_width); + contents_width, separator_width, description_width, iph_link_view_width, + available_width, false, true, &contents_max_width, &description_max_width, + &iph_link_max_width); + EXPECT_EQ(contents_max_width, contents_width); + EXPECT_EQ(description_max_width, 0); + EXPECT_EQ(iph_link_max_width, 30); // If contents and description are on separate lines, each can take the full // available width. contents_width = 300; description_width = 100; + iph_link_view_width = 0; available_width = 384; OmniboxMatchCellView::ComputeMatchMaxWidths( - contents_width, separator_width, description_width, available_width, true, - true, &contents_max_width, &description_max_width); - EXPECT_EQ(contents_width, contents_max_width); - EXPECT_EQ(description_width, description_max_width); + contents_width, separator_width, description_width, iph_link_view_width, + available_width, true, true, &contents_max_width, &description_max_width, + &iph_link_max_width); + EXPECT_EQ(contents_max_width, contents_width); + EXPECT_EQ(description_max_width, description_width); + EXPECT_EQ(iph_link_max_width, 0); // Both contents and description will be limited. contents_width = 310; description_width = 150; - available_width = 400; + iph_link_view_width = 30; + available_width = 430; OmniboxMatchCellView::ComputeMatchMaxWidths( - contents_width, separator_width, description_width, available_width, - false, true, &contents_max_width, &description_max_width); - EXPECT_EQ(kMinimumContentsWidth, contents_max_width); - EXPECT_EQ(available_width - kMinimumContentsWidth - separator_width, - description_max_width); + contents_width, separator_width, description_width, iph_link_view_width, + available_width, false, true, &contents_max_width, &description_max_width, + &iph_link_max_width); + EXPECT_EQ(contents_max_width, kMinimumContentsWidth); + EXPECT_EQ(description_max_width, available_width - kMinimumContentsWidth - + separator_width - iph_link_max_width); + EXPECT_EQ(iph_link_max_width, 30); - // Contents takes all available space. + // Contents takes all available space not taken by IPH link. contents_width = 400; description_width = 0; - available_width = 200; + iph_link_view_width = 30; + available_width = 230; OmniboxMatchCellView::ComputeMatchMaxWidths( - contents_width, separator_width, description_width, available_width, - false, true, &contents_max_width, &description_max_width); - EXPECT_EQ(available_width, contents_max_width); - EXPECT_EQ(0, description_max_width); + contents_width, separator_width, description_width, iph_link_view_width, + available_width, false, true, &contents_max_width, &description_max_width, + &iph_link_max_width); + EXPECT_EQ(contents_max_width, available_width - iph_link_max_width); + EXPECT_EQ(description_max_width, 0); + EXPECT_EQ(iph_link_max_width, 30); // Large contents will be truncated but small description won't if two line // suggestion. contents_width = 400; description_width = 100; + iph_link_view_width = 0; available_width = 200; OmniboxMatchCellView::ComputeMatchMaxWidths( - contents_width, separator_width, description_width, available_width, true, - true, &contents_max_width, &description_max_width); - EXPECT_EQ(available_width, contents_max_width); - EXPECT_EQ(description_width, description_max_width); + contents_width, separator_width, description_width, iph_link_view_width, + available_width, true, true, &contents_max_width, &description_max_width, + &iph_link_max_width); + EXPECT_EQ(contents_max_width, available_width); + EXPECT_EQ(description_max_width, description_width); + EXPECT_EQ(iph_link_max_width, 0); // Large description will be truncated but small contents won't if two line // suggestion. contents_width = 100; description_width = 400; + iph_link_view_width = 0; available_width = 200; OmniboxMatchCellView::ComputeMatchMaxWidths( - contents_width, separator_width, description_width, available_width, true, - true, &contents_max_width, &description_max_width); - EXPECT_EQ(contents_width, contents_max_width); - EXPECT_EQ(available_width, description_max_width); + contents_width, separator_width, description_width, iph_link_view_width, + available_width, true, true, &contents_max_width, &description_max_width, + &iph_link_max_width); + EXPECT_EQ(contents_max_width, contents_width); + EXPECT_EQ(description_max_width, available_width); + EXPECT_EQ(iph_link_max_width, 0); // Half and half. contents_width = 395; description_width = 395; + iph_link_view_width = 0; available_width = 700; OmniboxMatchCellView::ComputeMatchMaxWidths( - contents_width, separator_width, description_width, available_width, - false, true, &contents_max_width, &description_max_width); - EXPECT_EQ(345, contents_max_width); - EXPECT_EQ(345, description_max_width); + contents_width, separator_width, description_width, iph_link_view_width, + available_width, false, true, &contents_max_width, &description_max_width, + &iph_link_max_width); + EXPECT_EQ(contents_max_width, 345); + EXPECT_EQ(description_max_width, 345); + EXPECT_EQ(iph_link_max_width, 0); // When we disallow shrinking the contents, it should get as much space as // it wants. contents_width = 395; description_width = 395; + iph_link_view_width = 0; available_width = 700; OmniboxMatchCellView::ComputeMatchMaxWidths( - contents_width, separator_width, description_width, available_width, - false, false, &contents_max_width, &description_max_width); - EXPECT_EQ(contents_width, contents_max_width); - EXPECT_EQ((available_width - contents_width - separator_width), - description_max_width); + contents_width, separator_width, description_width, iph_link_view_width, + available_width, false, false, &contents_max_width, + &description_max_width, &iph_link_max_width); + EXPECT_EQ(contents_max_width, contents_width); + EXPECT_EQ(description_max_width, available_width - contents_width - + separator_width - iph_link_max_width); + EXPECT_EQ(iph_link_max_width, 0); // (available_width - separator_width) is odd, so contents gets the extra // pixel. contents_width = 395; description_width = 395; + iph_link_view_width = 0; available_width = 699; OmniboxMatchCellView::ComputeMatchMaxWidths( - contents_width, separator_width, description_width, available_width, - false, true, &contents_max_width, &description_max_width); - EXPECT_EQ(345, contents_max_width); - EXPECT_EQ(344, description_max_width); + contents_width, separator_width, description_width, iph_link_view_width, + available_width, false, true, &contents_max_width, &description_max_width, + &iph_link_max_width); + EXPECT_EQ(contents_max_width, 345); + EXPECT_EQ(description_max_width, 344); + EXPECT_EQ(iph_link_max_width, 0); // Not enough space to draw anything. contents_width = 1; description_width = 1; + iph_link_view_width = 0; available_width = 0; OmniboxMatchCellView::ComputeMatchMaxWidths( - contents_width, separator_width, description_width, available_width, - false, true, &contents_max_width, &description_max_width); - EXPECT_EQ(0, contents_max_width); - EXPECT_EQ(0, description_max_width); + contents_width, separator_width, description_width, iph_link_view_width, + available_width, false, true, &contents_max_width, &description_max_width, + &iph_link_max_width); + EXPECT_EQ(contents_max_width, 0); + EXPECT_EQ(description_max_width, 0); + EXPECT_EQ(iph_link_max_width, 0); } diff -Nru chromium-128.0.6613.84/chrome/browser/ui/views/omnibox/omnibox_result_view.cc chromium-128.0.6613.113/chrome/browser/ui/views/omnibox/omnibox_result_view.cc --- chromium-128.0.6613.84/chrome/browser/ui/views/omnibox/omnibox_result_view.cc 2024-08-21 22:46:11.000000000 +0000 +++ chromium-128.0.6613.113/chrome/browser/ui/views/omnibox/omnibox_result_view.cc 2024-08-28 22:38:55.000000000 +0000 @@ -216,7 +216,7 @@ gfx::Insets::TLBR(0, 0, 0, 16)); views::InstallCircleHighlightPathGenerator(thumbs_up_button_); thumbs_up_button_->SetTooltipText( - l10n_util::GetStringUTF16(IDS_OMNIBOX_REMOVE_SUGGESTION)); + l10n_util::GetStringUTF16(IDS_OMNIBOX_THUMBS_UP_SUGGESTION)); auto* const thumbs_up_focus_ring = views::FocusRing::Get(thumbs_up_button_); thumbs_up_focus_ring->SetHasFocusPredicate(base::BindRepeating( [](const OmniboxResultView* results, const View* view) { @@ -237,7 +237,7 @@ gfx::Insets::TLBR(0, 0, 0, 16)); views::InstallCircleHighlightPathGenerator(thumbs_down_button_); thumbs_down_button_->SetTooltipText( - l10n_util::GetStringUTF16(IDS_OMNIBOX_REMOVE_SUGGESTION)); + l10n_util::GetStringUTF16(IDS_OMNIBOX_THUMBS_DOWN_SUGGESTION)); auto* const thumbs_down_focus_ring = views::FocusRing::Get(thumbs_down_button_); thumbs_down_focus_ring->SetHasFocusPredicate(base::BindRepeating( @@ -258,8 +258,6 @@ remove_suggestion_button_->SetProperty(views::kMarginsKey, gfx::Insets::TLBR(0, 0, 0, 16)); views::InstallCircleHighlightPathGenerator(remove_suggestion_button_); - remove_suggestion_button_->SetTooltipText( - l10n_util::GetStringUTF16(IDS_OMNIBOX_REMOVE_SUGGESTION)); auto* const remove_focus_ring = views::FocusRing::Get(remove_suggestion_button_); remove_focus_ring->SetHasFocusPredicate(base::BindRepeating( @@ -322,6 +320,17 @@ suggestion_view_->OnMatchUpdate(this, match_); UpdateFeedbackButtonsVisibility(); UpdateRemoveSuggestionVisibility(); + if (match_.IsIPHSuggestion()) { + remove_suggestion_button_->SetTooltipText( + l10n_util::GetStringUTF16(IDS_OMNIBOX_CLOSE_IPH_SUGGESTION)); + remove_suggestion_button_->GetViewAccessibility().SetName( + l10n_util::GetStringUTF16(IDS_ACC_DISMISS_CHROME_TIP_BUTTON)); + } else { + remove_suggestion_button_->SetTooltipText( + l10n_util::GetStringUTF16(IDS_OMNIBOX_REMOVE_SUGGESTION)); + remove_suggestion_button_->GetViewAccessibility().SetName( + l10n_util::GetStringUTF16(IDS_ACC_REMOVE_SUGGESTION_BUTTON)); + } suggestion_view_->content()->SetTextWithStyling(match_.contents, match_.contents_class); diff -Nru chromium-128.0.6613.84/chrome/browser/ui/views/omnibox/omnibox_row_view.cc chromium-128.0.6613.113/chrome/browser/ui/views/omnibox/omnibox_row_view.cc --- chromium-128.0.6613.84/chrome/browser/ui/views/omnibox/omnibox_row_view.cc 2024-08-21 22:46:11.000000000 +0000 +++ chromium-128.0.6613.113/chrome/browser/ui/views/omnibox/omnibox_row_view.cc 2024-08-28 22:38:55.000000000 +0000 @@ -118,7 +118,7 @@ gfx::Insets OmniboxRowView::GetInsets() const { if (result_view_->GetThemeState() == OmniboxPartState::IPH) { - int LRInsets = OmniboxMatchCellView::kIPHLeftOffset; + int LRInsets = OmniboxMatchCellView::kIphOffset; return gfx::Insets::TLBR(8, LRInsets, 8, LRInsets); } diff -Nru chromium-128.0.6613.84/chrome/browser/ui/views/toolbar/toolbar_view.cc chromium-128.0.6613.113/chrome/browser/ui/views/toolbar/toolbar_view.cc --- chromium-128.0.6613.84/chrome/browser/ui/views/toolbar/toolbar_view.cc 2024-08-21 22:46:11.000000000 +0000 +++ chromium-128.0.6613.113/chrome/browser/ui/views/toolbar/toolbar_view.cc 2024-08-28 22:38:55.000000000 +0000 @@ -1148,7 +1148,7 @@ views::View* ToolbarView::GetAnchorView( std::optional type) { if (features::IsToolbarPinningEnabled()) { - if (type.has_value()) { + if (pinned_toolbar_actions_container_ && type.has_value()) { const std::optional action_id = GetPageActionIconView(type.value())->action_id(); if (action_id.has_value() && diff -Nru chromium-128.0.6613.84/chrome/browser/ui/webui/cr_components/history_embeddings/history_embeddings_handler.cc chromium-128.0.6613.113/chrome/browser/ui/webui/cr_components/history_embeddings/history_embeddings_handler.cc --- chromium-128.0.6613.84/chrome/browser/ui/webui/cr_components/history_embeddings/history_embeddings_handler.cc 2024-08-21 22:46:11.000000000 +0000 +++ chromium-128.0.6613.113/chrome/browser/ui/webui/cr_components/history_embeddings/history_embeddings_handler.cc 2024-08-28 22:38:55.000000000 +0000 @@ -72,20 +72,20 @@ void HistoryEmbeddingsHandler::OnReceivedSearchResult( history_embeddings::SearchResult native_search_result) { - last_result_ = native_search_result; + last_result_ = std::move(native_search_result); user_feedback_ = optimization_guide::proto::UserFeedback::USER_FEEDBACK_UNSPECIFIED; auto mojom_search_result = history_embeddings::mojom::SearchResult::New(); - mojom_search_result->query = native_search_result.query; + mojom_search_result->query = last_result_.query; bool has_answer = history_embeddings::kEnableAnswers.Get() && - !native_search_result.AnswerText().empty(); + !last_result_.AnswerText().empty(); if (has_answer) { - mojom_search_result->answer = native_search_result.AnswerText(); + mojom_search_result->answer = last_result_.AnswerText(); } - for (size_t i = 0; i < native_search_result.scored_url_rows.size(); i++) { + for (size_t i = 0; i < last_result_.scored_url_rows.size(); i++) { history_embeddings::ScoredUrlRow& scored_url_row = - native_search_result.scored_url_rows[i]; + last_result_.scored_url_rows[i]; auto item = history_embeddings::mojom::SearchResultItem::New(); item->title = base::UTF16ToUTF8(scored_url_row.row.title()); item->url = scored_url_row.row.url(); @@ -102,11 +102,11 @@ item->url_for_display = base::UTF16ToUTF8(url_formatter::FormatUrl( scored_url_row.row.url(), format_types, base::UnescapeRule::SPACES, nullptr, nullptr, nullptr)); - if (has_answer && i == native_search_result.AnswerIndex()) { + if (has_answer && i == last_result_.AnswerIndex()) { item->answer_data = history_embeddings::mojom::AnswerData::New(); item->answer_data->answer_text_directives.assign( - native_search_result.answerer_result.text_directives.begin(), - native_search_result.answerer_result.text_directives.end()); + last_result_.answerer_result.text_directives.begin(), + last_result_.answerer_result.text_directives.end()); } if (history_embeddings::kShowSourcePassages.Get()) { diff -Nru chromium-128.0.6613.84/chrome/browser/ui/webui/cr_components/history_embeddings/history_embeddings_handler_unittest.cc chromium-128.0.6613.113/chrome/browser/ui/webui/cr_components/history_embeddings/history_embeddings_handler_unittest.cc --- chromium-128.0.6613.84/chrome/browser/ui/webui/cr_components/history_embeddings/history_embeddings_handler_unittest.cc 2024-08-21 22:46:11.000000000 +0000 +++ chromium-128.0.6613.113/chrome/browser/ui/webui/cr_components/history_embeddings/history_embeddings_handler_unittest.cc 2024-08-28 22:38:55.000000000 +0000 @@ -200,7 +200,7 @@ base::test::TestFuture future; EXPECT_CALL(page_, SearchResultChanged) .WillOnce(base::test::InvokeFuture(future)); - handler_->OnReceivedSearchResult(embeddings_result); + handler_->OnReceivedSearchResult(std::move(embeddings_result)); auto mojo_result = future.Take(); EXPECT_EQ(mojo_result->query, "search query"); diff -Nru chromium-128.0.6613.84/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.cc chromium-128.0.6613.113/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.cc --- chromium-128.0.6613.84/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.cc 2024-08-21 22:46:11.000000000 +0000 +++ chromium-128.0.6613.113/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.cc 2024-08-28 22:38:55.000000000 +0000 @@ -17,6 +17,7 @@ #include "chrome/browser/accessibility/pdf_ocr_controller_factory.h" #include "chrome/browser/browser_features.h" #include "chrome/browser/language/language_model_manager_factory.h" +#include "chrome/browser/pdf/pdf_viewer_stream_manager.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/screen_ai/screen_ai_service_router.h" #include "chrome/browser/screen_ai/screen_ai_service_router_factory.h" @@ -40,6 +41,7 @@ #include "content/public/browser/scoped_accessibility_mode.h" #include "content/public/browser/web_contents_user_data.h" #include "content/public/browser/web_ui.h" +#include "pdf/pdf_features.h" #include "ui/accessibility/accessibility_features.h" #include "ui/accessibility/ax_action_data.h" #include "ui/accessibility/ax_enums.mojom-shared.h" @@ -692,39 +694,50 @@ void ReadAnythingUntrustedPageHandler::SetUpPdfObserver() { pdf_observer_.reset(); content::WebContents* main_contents = main_observer_->web_contents(); - // TODO(crbug.com/339864546): Make it compatible with OOPIF PDF Viewer. - std::vector inner_contents = - main_contents ? main_contents->GetInnerWebContents() - : std::vector(); - // Check if this is a pdf. - if (inner_contents.size() == 1 && - IsPdfExtensionOrigin( - inner_contents[0]->GetPrimaryMainFrame()->GetLastCommittedOrigin())) { - pdf_observer_ = std::make_unique( - weak_factory_.GetSafeRef(), inner_contents[0], kReadAnythingAXMode); - if (features::IsPdfOcrEnabled()) { - screen_ai::PdfOcrControllerFactory::GetForProfile(browser_->profile()) - ->Activate(); + // TODO(crbug.com/340272378): When removing this feature flag, delete + // `pdf_observer_` and integrate ReadAnythingWebContentsObserver with + // ReadAnythingUntrustedPageHandler. + if (!chrome_pdf::features::IsOopifPdfEnabled()) { + std::vector inner_contents = + main_contents ? main_contents->GetInnerWebContents() + : std::vector(); + // Check if this is a pdf. + if (inner_contents.size() == 1 && + IsPdfExtensionOrigin(inner_contents[0] + ->GetPrimaryMainFrame() + ->GetLastCommittedOrigin())) { + pdf_observer_ = std::make_unique( + weak_factory_.GetSafeRef(), inner_contents[0], kReadAnythingAXMode); } } + if (features::IsPdfOcrEnabled()) { + screen_ai::PdfOcrControllerFactory::GetForProfile(browser_->profile())->Activate(); + } } void ReadAnythingUntrustedPageHandler::OnActiveAXTreeIDChanged() { - bool is_pdf = !!pdf_observer_; if (!main_observer_ || !active_) { page_->OnActiveAXTreeIDChanged(ui::AXTreeIDUnknown(), ukm::kInvalidSourceId, - is_pdf); + /*is_pdf=*/false); return; } - content::WebContents* contents = - is_pdf ? pdf_observer_->web_contents() : main_observer_->web_contents(); + content::WebContents* contents = !!pdf_observer_ + ? pdf_observer_->web_contents() + : main_observer_->web_contents(); if (!contents) { page_->OnActiveAXTreeIDChanged(ui::AXTreeIDUnknown(), ukm::kInvalidSourceId, - is_pdf); + /*is_pdf=*/false); return; } + bool is_pdf; + if (chrome_pdf::features::IsOopifPdfEnabled()) { + is_pdf = !!pdf::PdfViewerStreamManager::FromWebContents(contents); + } else { + is_pdf = !!pdf_observer_; + } + // Observe the new contents so we can get the page language once it's // determined. if (ChromeTranslateClient* translate_client = @@ -764,7 +777,7 @@ content::RenderFrameHost* rfh = contents->GetPrimaryMainFrame(); if (!rfh) { - // THis case doesn't seem possible. + // This case doesn't seem possible. page_->OnActiveAXTreeIDChanged(ui::AXTreeIDUnknown(), ukm::kInvalidSourceId, /*is_pdf=*/false); return; diff -Nru chromium-128.0.6613.84/chrome/credential_provider/gaiacp/strings/gaia_resources_hr.xtb chromium-128.0.6613.113/chrome/credential_provider/gaiacp/strings/gaia_resources_hr.xtb --- chromium-128.0.6613.84/chrome/credential_provider/gaiacp/strings/gaia_resources_hr.xtb 2024-08-21 22:46:11.000000000 +0000 +++ chromium-128.0.6613.113/chrome/credential_provider/gaiacp/strings/gaia_resources_hr.xtb 2024-08-28 22:38:56.000000000 +0000 @@ -29,7 +29,7 @@ Unesite zaporku za Windows Može se prijaviti samo korisnik koji je zaključao ovaj uređaj Dodaj radni račun -Prijavite se svojim poslovnim računom +Prijavite se poslovnim računom Došlo je do pokušaja promjene zaporke za nevažećeg korisnika. Obratite se administratoru. Vaš je račun onemogućen zbog previše netočnih pokušaja unošenja zaporke. Obratite se administratoru radi omogućivanja računa. Administrator vam ne dopušta prijavu tim računom. Pokušajte s nekim drugim računom. diff -Nru chromium-128.0.6613.84/chromeos/CHROMEOS_LKGM chromium-128.0.6613.113/chromeos/CHROMEOS_LKGM --- chromium-128.0.6613.84/chromeos/CHROMEOS_LKGM 2024-08-21 22:46:13.000000000 +0000 +++ chromium-128.0.6613.113/chromeos/CHROMEOS_LKGM 2024-08-28 22:38:58.000000000 +0000 @@ -1 +1 @@ -15964.31.0 \ No newline at end of file +15964.38.0 \ No newline at end of file diff -Nru chromium-128.0.6613.84/chromeos/strings/chromeos_strings_ar.xtb chromium-128.0.6613.113/chromeos/strings/chromeos_strings_ar.xtb --- chromium-128.0.6613.84/chromeos/strings/chromeos_strings_ar.xtb 2024-08-21 22:46:14.000000000 +0000 +++ chromium-128.0.6613.113/chromeos/strings/chromeos_strings_ar.xtb 2024-08-28 22:38:58.000000000 +0000 @@ -241,7 +241,7 @@ اليوم صورة يتم عرض آخر طلبين. يمكنك استخدام هذين الطلبين فقط أثناء تصفُّح هذه الصفحة. -أداة اختيار الرموز التعبيرية +أداة اختيار رموز الإيموجي تم وضع الاختبار في قائمة الانتظار. : إعادة المحاولة ‏زر "إضافة اسم نقطة الوصول" (APN) غير مفعَّل الآن diff -Nru chromium-128.0.6613.84/chromeos/strings/chromeos_strings_be.xtb chromium-128.0.6613.113/chromeos/strings/chromeos_strings_be.xtb --- chromium-128.0.6613.84/chromeos/strings/chromeos_strings_be.xtb 2024-08-21 22:46:14.000000000 +0000 +++ chromium-128.0.6613.113/chromeos/strings/chromeos_strings_be.xtb 2024-08-28 22:38:58.000000000 +0000 @@ -1100,7 +1100,7 @@ Хуткасць разрадкі стакротка светла-фіялетавы -Падчас перазапуску не адключайце гэту знешнюю прыладу і не выключайце камп'ютар. Гэта акно можна згарнуць. Перазапуск зойме некалькі хвілін – у гэты час знешняя прылада можа не працаваць. +Падчас перазапуску не адключайце гэту знешнюю прыладу і не выключайце камп’ютар. Гэта акно можна згарнуць. Перазапуск зойме некалькі хвілін – у гэты час знешняя прылада можа не працаваць. У гэтым альбоме няма фота. Дадаць фота можна з сайта . Стварыць фон з дапамогай AI Паспрабаваць diff -Nru chromium-128.0.6613.84/chromeos/strings/chromeos_strings_de.xtb chromium-128.0.6613.113/chromeos/strings/chromeos_strings_de.xtb --- chromium-128.0.6613.84/chromeos/strings/chromeos_strings_de.xtb 2024-08-21 22:46:14.000000000 +0000 +++ chromium-128.0.6613.113/chromeos/strings/chromeos_strings_de.xtb 2024-08-28 22:38:58.000000000 +0000 @@ -149,7 +149,7 @@ Bei der Kommunikation mit dem Scanner ist ein Problem aufgetreten. Prüfe die Netzwerk- oder USB-Verbindung und versuche es noch einmal. Verwaltet von und See -Glühwürmchenwald +Glühwürm­chenwald Nameserver Bluetooth-Touchpad Bereich  diff -Nru chromium-128.0.6613.84/chromeos/strings/chromeos_strings_te.xtb chromium-128.0.6613.113/chromeos/strings/chromeos_strings_te.xtb --- chromium-128.0.6613.84/chromeos/strings/chromeos_strings_te.xtb 2024-08-21 22:46:14.000000000 +0000 +++ chromium-128.0.6613.113/chromeos/strings/chromeos_strings_te.xtb 2024-08-28 22:38:58.000000000 +0000 @@ -1237,7 +1237,7 @@ IPv6 అడ్రస్‌ ప్రకాశవంతమైన దిగువ -డౌన్‌లోడ్ చేయి +డౌన్‌లోడ్ చేయండి Android క్రియేట్ చేయండి సహాయక కంటెంట్ అందుబాటులో లేదు @@ -1419,7 +1419,7 @@ Android యాప్‌ల నుండి HTTP వెబ్‌సైట్‌లకు ఫైర్‌వాల్ ద్వారా కనెక్ట్ చేయడం సాధ్యపడదు కంబళి లాంటి బట్ట ట్రాఫిక్ కౌంటర్‌లు -యూజర్‌పేరు +యూజర్‌నేమ్ మరికొన్ని నిమిషాలు మాత్రమే… Gemini మోడల్‌కు ట్రాన్‌స్క్రిప్ట్‌లను ప్రాసెస్ చేయడానికి, అలాగే సారాంశాలను రూపొందించడానికి 2GB స్టోరేజ్ అవసరం APN వివరాలు diff -Nru chromium-128.0.6613.84/components/certificate_transparency/data/log_list.json chromium-128.0.6613.113/components/certificate_transparency/data/log_list.json --- chromium-128.0.6613.84/components/certificate_transparency/data/log_list.json 2024-08-21 22:46:14.000000000 +0000 +++ chromium-128.0.6613.113/components/certificate_transparency/data/log_list.json 2024-08-28 22:38:59.000000000 +0000 @@ -1,6 +1,6 @@ { - "version": "41.11", - "log_list_timestamp": "2024-08-20T12:55:39Z", + "version": "42.2", + "log_list_timestamp": "2024-08-26T12:56:32Z", "operators": [ { "name": "Google", @@ -618,6 +618,38 @@ "start_inclusive": "2025-06-20T00:00:00Z", "end_exclusive": "2026-01-20T00:00:00Z" } + }, + { + "description": "Let's Encrypt 'Oak2026h1'", + "log_id": "GYbUxyiqb/66A294Kk0BkarOLXIxD67OXXBBLSVMx9Q=", + "key": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEmdRhcCL6d5MNs8eAliJRvyV5sQFC6UF7iwzHsmVaifT64gJG1IrHzBAHESdFSJAjQN56TYky+9cK616MovH2SQ==", + "url": "https://oak.ct.letsencrypt.org/2026h1/", + "mmd": 86400, + "state": { + "qualified": { + "timestamp": "2024-08-21T00:00:00Z" + } + }, + "temporal_interval": { + "start_inclusive": "2025-12-20T00:00:00Z", + "end_exclusive": "2026-07-20T00:00:00Z" + } + }, + { + "description": "Let's Encrypt 'Oak2026h2'", + "log_id": "rKswcGzr7IQx9BPS9JFfER5CJEOx8qaMTzwrO6ceAsM=", + "key": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEanCds5bj7IU2lcNPnIvZfMnVkSmu69aH3AS8O/Y0D/bbCPdSqYjvuz9Z1tT29PxcqYxf+w1g5CwPFuwqsm3rFQ==", + "url": "https://oak.ct.letsencrypt.org/2026h2/", + "mmd": 86400, + "state": { + "qualified": { + "timestamp": "2024-08-21T00:00:00Z" + } + }, + "temporal_interval": { + "start_inclusive": "2026-06-20T00:00:00Z", + "end_exclusive": "2027-01-20T00:00:00Z" + } } ] }, diff -Nru chromium-128.0.6613.84/components/history_embeddings/BUILD.gn chromium-128.0.6613.113/components/history_embeddings/BUILD.gn --- chromium-128.0.6613.84/components/history_embeddings/BUILD.gn 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/history_embeddings/BUILD.gn 2024-08-28 22:38:59.000000000 +0000 @@ -48,6 +48,7 @@ "//services/passage_embeddings/public/mojom", "//services/service_manager", "//sql", + "//third_party/farmhash", "//third_party/zlib/google:compression_utils", "//url", ] diff -Nru chromium-128.0.6613.84/components/history_embeddings/DEPS chromium-128.0.6613.113/components/history_embeddings/DEPS --- chromium-128.0.6613.84/components/history_embeddings/DEPS 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/history_embeddings/DEPS 2024-08-28 22:38:59.000000000 +0000 @@ -12,6 +12,7 @@ "+services/passage_embeddings", "+sql", "+third_party/blink/public", + "+third_party/farmhash", "+third_party/zlib", "+url", ] diff -Nru chromium-128.0.6613.84/components/history_embeddings/answerer.cc chromium-128.0.6613.113/components/history_embeddings/answerer.cc --- chromium-128.0.6613.84/components/history_embeddings/answerer.cc 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/history_embeddings/answerer.cc 2024-08-28 22:38:59.000000000 +0000 @@ -4,25 +4,35 @@ #include "components/history_embeddings/answerer.h" +#include "components/optimization_guide/core/model_quality/model_quality_log_entry.h" + namespace history_embeddings { AnswererResult::AnswererResult() = default; -AnswererResult::AnswererResult(ComputeAnswerStatus status, - std::string query, - optimization_guide::proto::Answer answer, - std::string url, - std::vector text_directives) +AnswererResult::AnswererResult( + ComputeAnswerStatus status, + std::string query, + optimization_guide::proto::Answer answer, + std::unique_ptr log_entry, + std::string url, + std::vector text_directives) : status(status), query(std::move(query)), answer(std::move(answer)), + log_entry(std::move(log_entry)), url(std::move(url)), text_directives(std::move(text_directives)) {} AnswererResult::AnswererResult(ComputeAnswerStatus status, std::string query, optimization_guide::proto::Answer answer) : status(status), query(std::move(query)), answer(std::move(answer)) {} -AnswererResult::AnswererResult(const AnswererResult&) = default; -AnswererResult::~AnswererResult() = default; +AnswererResult::AnswererResult(AnswererResult&&) = default; +AnswererResult::~AnswererResult() { + if (log_entry) { + optimization_guide::ModelQualityLogEntry::Drop(std::move(log_entry)); + } +} +AnswererResult& AnswererResult::operator=(AnswererResult&&) = default; //////////////////////////////////////////////////////////////////////////////// diff -Nru chromium-128.0.6613.84/components/history_embeddings/answerer.h chromium-128.0.6613.113/components/history_embeddings/answerer.h --- chromium-128.0.6613.84/components/history_embeddings/answerer.h 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/history_embeddings/answerer.h 2024-08-28 22:38:59.000000000 +0000 @@ -9,6 +9,7 @@ #include #include "base/functional/callback.h" +#include "components/optimization_guide/core/model_quality/model_quality_log_entry.h" #include "components/optimization_guide/proto/features/history_answer.pb.h" namespace history_embeddings { @@ -35,20 +36,28 @@ // Holds an answer from the model and associations to source context. struct AnswererResult { AnswererResult(); - AnswererResult(ComputeAnswerStatus status, - std::string query, - optimization_guide::proto::Answer answer, - std::string url, - std::vector text_directives); + AnswererResult( + ComputeAnswerStatus status, + std::string query, + optimization_guide::proto::Answer answer, + std::unique_ptr log_entry, + std::string url, + std::vector text_directives); AnswererResult(ComputeAnswerStatus status, std::string query, optimization_guide::proto::Answer answer); - AnswererResult(const AnswererResult&); + AnswererResult(AnswererResult&&); ~AnswererResult(); + AnswererResult& operator=(AnswererResult&&); ComputeAnswerStatus status = ComputeAnswerStatus::UNSPECIFIED; std::string query; optimization_guide::proto::Answer answer; + // The partially populated v2 quality log entry. This will be dropped + // on destruction to avoid logging when logging is disabled. If logging + // is enabled, then it will be taken from here by + // HistoryEmbeddingsService::SendQualityLog and then logged via destruction. + std::unique_ptr log_entry; // URL source of the answer. std::string url; // Scroll-to-text directives constructed from cited passages. diff -Nru chromium-128.0.6613.84/components/history_embeddings/history_embeddings_features.cc chromium-128.0.6613.113/components/history_embeddings/history_embeddings_features.cc --- chromium-128.0.6613.84/components/history_embeddings/history_embeddings_features.cc 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/history_embeddings/history_embeddings_features.cc 2024-08-28 22:38:59.000000000 +0000 @@ -94,6 +94,9 @@ const base::FeatureParam kSendQualityLog(&kHistoryEmbeddings, "SendQualityLog", false); +const base::FeatureParam kSendQualityLogV2(&kHistoryEmbeddings, + "SendQualityLogV2", + false); const base::FeatureParam kEmbedderNumThreads(&kHistoryEmbeddings, "EmbeddingsNumThreads", @@ -132,6 +135,10 @@ "FilterTerms", ""); +const base::FeatureParam kFilterHashes(&kHistoryEmbeddings, + "FilterHashes", + ""); + bool IsHistoryEmbeddingsEnabled() { #if BUILDFLAG(IS_CHROMEOS) return chromeos::features::IsFeatureManagementHistoryEmbeddingEnabled() && diff -Nru chromium-128.0.6613.84/components/history_embeddings/history_embeddings_features.h chromium-128.0.6613.113/components/history_embeddings/history_embeddings_features.h --- chromium-128.0.6613.84/components/history_embeddings/history_embeddings_features.h 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/history_embeddings/history_embeddings_features.h 2024-08-28 22:38:59.000000000 +0000 @@ -78,6 +78,7 @@ // Whether quality logging data should be sent. extern const base::FeatureParam kSendQualityLog; +extern const base::FeatureParam kSendQualityLogV2; // The number of threads to use for embeddings generation. A value of -1 means // to use the default number of threads. @@ -117,6 +118,10 @@ // of words and phrases. extern const base::FeatureParam kFilterTerms; +// Comma-separated list of decimal integer hash values to decode as a set of +// uint32_t. These can match against either one or two word phrases. +extern const base::FeatureParam kFilterHashes; + // Whether the history embeddings feature is enabled. This only checks if the // feature flags are enabled and does not check the user's opt-in preference. // See chrome/browser/history_embeddings/history_embeddings_utils.h. diff -Nru chromium-128.0.6613.84/components/history_embeddings/history_embeddings_service.cc chromium-128.0.6613.113/components/history_embeddings/history_embeddings_service.cc --- chromium-128.0.6613.84/components/history_embeddings/history_embeddings_service.cc 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/history_embeddings/history_embeddings_service.cc 2024-08-28 22:38:59.000000000 +0000 @@ -12,6 +12,8 @@ #include "base/files/file_path.h" #include "base/functional/bind.h" #include "base/metrics/histogram_functions.h" +#include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/task/sequenced_task_runner.h" @@ -20,6 +22,7 @@ #include "base/time/time.h" #include "base/timer/elapsed_timer.h" #include "base/token.h" +#include "base/uuid.h" #include "components/history/core/browser/history_types.h" #include "components/history/core/browser/url_database.h" #include "components/history/core/browser/url_row.h" @@ -42,6 +45,7 @@ #include "mojo/public/cpp/bindings/remote.h" #include "services/service_manager/public/cpp/interface_provider.h" #include "third_party/blink/public/mojom/content_extraction/inner_text.mojom.h" +#include "third_party/farmhash/src/src/farmhash.h" #include "url/gurl.h" namespace history_embeddings { @@ -56,6 +60,10 @@ reason, ExtractionCancelled::ENUM_COUNT); } +uint32_t HashString(std::string_view str) { + return util::Fingerprint32(str); +} + void OnGotInnerText(mojo::Remote remote, base::TimeTicks start_time, base::OnceCallback)> callback, @@ -199,12 +207,23 @@ //////////////////////////////////////////////////////////////////////////////// SearchResult::SearchResult() = default; -SearchResult::SearchResult(const SearchResult&) = default; SearchResult::SearchResult(SearchResult&&) = default; SearchResult::~SearchResult() = default; -SearchResult& SearchResult::operator=(const SearchResult&) = default; SearchResult& SearchResult::operator=(SearchResult&&) = default; +SearchResult SearchResult::Clone() { + // Cannot copy `answerer_result`; it should not have substance. + CHECK(!answerer_result.log_entry); + + SearchResult clone; + clone.session_id = session_id; + clone.query = query; + clone.time_range_start = time_range_start; + clone.count = count; + clone.scored_url_rows = scored_url_rows; + return clone; +} + const std::string& SearchResult::AnswerText() const { return answerer_result.answer.text(); } @@ -254,8 +273,9 @@ history_service_->history_dir()); history_service_observation_.Observe(history_service_); - for (std::string& term_or_phrase : base::SplitString( - kFilterTerms.Get(), ",", base::WhitespaceHandling::TRIM_WHITESPACE, + std::string filter_terms_param = kFilterTerms.Get(); + for (std::string_view& term_or_phrase : base::SplitStringPiece( + filter_terms_param, ",", base::WhitespaceHandling::TRIM_WHITESPACE, base::SplitResult::SPLIT_WANT_NONEMPTY)) { if (term_or_phrase.find(' ') != std::string::npos) { filter_phrases_.push_back(base::ToLowerASCII(term_or_phrase)); @@ -263,6 +283,15 @@ filter_terms_.insert(base::ToLowerASCII(term_or_phrase)); } } + std::string filter_hashes_param = kFilterHashes.Get(); + for (std::string_view& hash_string : base::SplitStringPiece( + filter_hashes_param, ",", base::WhitespaceHandling::TRIM_WHITESPACE, + base::SplitResult::SPLIT_WANT_NONEMPTY)) { + uint32_t hash; + if (base::StringToUint(hash_string, &hash)) { + filter_hashes_.insert(hash); + } + } // Notify page content annotations service that we will need the content // visibility model during the session. @@ -386,7 +415,7 @@ result.count = count; if (QueryIsFiltered(query)) { result.count = 0; - callback.Run(result); + callback.Run(std::move(result)); return; } embedder_->ComputePassagesEmbeddings( @@ -433,7 +462,7 @@ } void HistoryEmbeddingsService::SendQualityLog( - const SearchResult& result, + SearchResult& result, optimization_guide::proto::UserFeedback user_feedback, std::set selections, size_t num_entered_characters, @@ -443,81 +472,105 @@ return; } - // Prepare log entry and record a histogram for whether it's prepared. - QualityLogEntry log_entry = PrepareQualityLogEntry(); - base::UmaHistogramBoolean("History.Embeddings.Quality.LogEntryPrepared", - !!log_entry); - if (!log_entry) { - return; - } + // V1 HistoryQueryLoggingData: + { + // Prepare log entry and record a histogram for whether it's prepared. + QualityLogEntry log_entry = PrepareQualityLogEntry(); + base::UmaHistogramBoolean("History.Embeddings.Quality.LogEntryPrepared", + !!log_entry); + if (!log_entry) { + return; + } - optimization_guide::proto::LogAiDataRequest* request = - log_entry->log_ai_data_request(); - if (!request) { - return; - } - optimization_guide::proto::HistoryQueryQuality* quality_proto = - optimization_guide::HistoryQueryFeatureTypeMap::GetLoggingData(*request) - ->mutable_quality(); - if (!quality_proto) { - return; - } + optimization_guide::proto::LogAiDataRequest* request = + log_entry->log_ai_data_request(); + if (!request) { + return; + } - // Fill the quality proto with data. - size_t num_days = - result.time_range_start.has_value() - ? (base::Time::Now() - result.time_range_start.value()).InDays() + 1 - : 0; - quality_proto->set_session_id(result.session_id); - quality_proto->set_user_feedback(user_feedback); - quality_proto->set_embedding_model_version( - embedder_metadata_.value().model_version); - quality_proto->set_query(result.query); - quality_proto->set_num_days(num_days); - quality_proto->set_num_entered_characters(num_entered_characters); - - // For now, only two UI surfaces are planned, but if more are implemented - // then we can take the `UiSurface` directly as a parameter. - quality_proto->set_ui_surface( - from_omnibox_history_scope - ? optimization_guide::proto::UiSurface:: - UI_SURFACE_OMNIBOX_HISTORY_SCOPE - : optimization_guide::proto::UiSurface::UI_SURFACE_HISTORY_PAGE); - - for (size_t row_index = 0; row_index < result.scored_url_rows.size(); - ++row_index) { - const ScoredUrlRow& scored_url_row = result.scored_url_rows[row_index]; - optimization_guide::proto::DocumentShown* document_shown = - quality_proto->add_top_documents_shown(); - document_shown->set_url(scored_url_row.row.url().spec()); - document_shown->set_was_clicked(selections.contains(row_index)); - - // Log the top passages that may be used as context for the Answerer. - for (size_t passage_index : scored_url_row.GetBestScoreIndices( - 0, kContextPassagesMinimumWordCount.Get())) { - optimization_guide::proto::PassageData* passage_data = - document_shown->add_passages(); - passage_data->set_text( - scored_url_row.passages_embeddings.url_passages.passages.passages( - passage_index)); - passage_data->set_score(scored_url_row.scores[passage_index]); - const std::vector& embedding = - scored_url_row.passages_embeddings.url_embeddings - .embeddings[passage_index] - .GetData(); - passage_data->mutable_embedding() - ->mutable_floats() - ->mutable_values() - ->Add(embedding.begin(), embedding.end()); + request->mutable_model_execution_info()->set_execution_id(base::StrCat({ + "history-search-embeddings:", + base::Uuid::GenerateRandomV4().AsLowercaseString(), + })); + + optimization_guide::proto::HistoryQueryQuality* query_quality = + optimization_guide::HistoryQueryFeatureTypeMap::GetLoggingData(*request) + ->mutable_quality(); + if (!query_quality) { + return; } - } - // The data is sent when `log_entry` destructs. There may eventually - // be an option to `ModelQualityLogEntry::Drop(std::move(log_entry))` - // in the event that log data should not be sent, but it isn't ready yet. - // See b/334993555 for details on that; it may be useful if in the - // future we decide to let the `log_entry` escape the service. For now, - // it doesn't, and logging is only done proactively by destructing here. + // Fill the quality proto with data. + size_t num_days = + result.time_range_start.has_value() + ? (base::Time::Now() - result.time_range_start.value()).InDays() + 1 + : 0; + query_quality->set_session_id(result.session_id); + query_quality->set_user_feedback(user_feedback); + query_quality->set_embedding_model_version( + embedder_metadata_.value().model_version); + query_quality->set_query(result.query); + query_quality->set_num_days(num_days); + query_quality->set_num_entered_characters(num_entered_characters); + + // For now, only two UI surfaces are planned, but if more are implemented + // then we can take the `UiSurface` directly as a parameter. + query_quality->set_ui_surface( + from_omnibox_history_scope + ? optimization_guide::proto::UiSurface:: + UI_SURFACE_OMNIBOX_HISTORY_SCOPE + : optimization_guide::proto::UiSurface::UI_SURFACE_HISTORY_PAGE); + + for (size_t row_index = 0; row_index < result.scored_url_rows.size(); + ++row_index) { + const ScoredUrlRow& scored_url_row = result.scored_url_rows[row_index]; + optimization_guide::proto::DocumentShown* document_shown = + query_quality->add_top_documents_shown(); + document_shown->set_url(scored_url_row.row.url().spec()); + document_shown->set_was_clicked(selections.contains(row_index)); + + // Log the top passages that may be used as context for the Answerer. + for (size_t passage_index : scored_url_row.GetBestScoreIndices( + 0, kContextPassagesMinimumWordCount.Get())) { + optimization_guide::proto::PassageData* passage_data = + document_shown->add_passages(); + passage_data->set_text( + scored_url_row.passages_embeddings.url_passages.passages.passages( + passage_index)); + passage_data->set_score(scored_url_row.scores[passage_index]); + const std::vector& embedding = + scored_url_row.passages_embeddings.url_embeddings + .embeddings[passage_index] + .GetData(); + passage_data->mutable_embedding() + ->mutable_floats() + ->mutable_values() + ->Add(embedding.begin(), embedding.end()); + } + } + + // The data is sent when `log_entry` destructs. + // `ModelQualityLogEntry::Drop(std::move(log_entry))` would be required to + // avoid logging if `log_entry` escapes the service, but it only exists + // within this method so we log proactively by destructing it here. + } + + // V2 HistoryAnswerLoggingData: + if (kSendQualityLogV2.Get()) { + // Take the entry out from the SearchResult so that it will log on + // destruction at the end of this block. + std::unique_ptr log_entry = + std::move(result.answerer_result.log_entry); + if (log_entry) { + optimization_guide::proto::HistoryAnswerQuality* answer_quality = + log_entry + ->quality_data(); + if (answer_quality) { + answer_quality->set_session_id(result.session_id); + answer_quality->set_url(result.answerer_result.url); + } + } + } } void HistoryEmbeddingsService::Shutdown() { @@ -903,7 +956,7 @@ void HistoryEmbeddingsService::OnPrimarySearchResultReady( SearchResultCallback callback, SearchResult result) { - callback.Run(result); + callback.Run(result.Clone()); if (answerer_) { Answerer::Context context(result.session_id); for (const ScoredUrlRow& scored_url_row : result.scored_url_rows) { @@ -1005,25 +1058,45 @@ return true; } std::string query = base::ToLowerASCII(raw_query); - if (std::any_of(filter_phrases_.begin(), filter_phrases_.end(), - [&](const std::string& phrase) { - return query.find(phrase) != std::string::npos; - })) { + if (std::ranges::any_of(filter_phrases_, [&](const std::string& phrase) { + return query.find(phrase) != std::string::npos; + })) { RecordQueryFiltered(QueryFiltered::FILTERED_PHRASE_MATCH); return true; } - std::vector query_terms = - base::SplitString(query, " ", base::WhitespaceHandling::TRIM_WHITESPACE, - base::SplitResult::SPLIT_WANT_NONEMPTY); - if (std::any_of(query_terms.begin(), query_terms.end(), - [&](const std::string& query_term) { - return filter_terms_.contains(std::string(base::TrimString( - query_term, ".?!,:;-()[]{}<>\"'/\\*&#~@^|%$`+=", - base::TrimPositions::TRIM_ALL))); - })) { + std::vector query_terms = base::SplitStringPiece( + query, " ", base::WhitespaceHandling::TRIM_WHITESPACE, + base::SplitResult::SPLIT_WANT_NONEMPTY); + for (std::string_view& query_term : query_terms) { + query_term = base::TrimString( + query_term, + ".?!,:;-()[]{}<>\"'/\\*&#~@^|%$`+=", base::TrimPositions::TRIM_ALL); + } + // Erase any query terms that were trimmed to empty so they don't disrupt + // the two term pairing logic below. + std::erase(query_terms, ""); + if (std::ranges::any_of(query_terms, [&](const std::string_view& query_term) { + uint32_t hash = HashString(query_term); + return filter_hashes_.contains(hash); + })) { + RecordQueryFiltered(QueryFiltered::FILTERED_ONE_WORD_HASH_MATCH); + return true; + } + if (std::ranges::any_of(query_terms, [&](const std::string_view& query_term) { + return filter_terms_.contains(std::string(query_term)); + })) { RecordQueryFiltered(QueryFiltered::FILTERED_TERM_MATCH); return true; } + for (size_t i = 1; i < query_terms.size(); i++) { + std::string two_terms = + base::StrCat({query_terms[i - 1], " ", query_terms[i]}); + uint32_t hash = HashString(two_terms); + if (filter_hashes_.contains(hash)) { + RecordQueryFiltered(QueryFiltered::FILTERED_TWO_WORD_HASH_MATCH); + return true; + } + } RecordQueryFiltered(QueryFiltered::NOT_FILTERED); return false; } diff -Nru chromium-128.0.6613.84/components/history_embeddings/history_embeddings_service.h chromium-128.0.6613.113/components/history_embeddings/history_embeddings_service.h --- chromium-128.0.6613.84/components/history_embeddings/history_embeddings_service.h 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/history_embeddings/history_embeddings_service.h 2024-08-28 22:38:59.000000000 +0000 @@ -102,12 +102,15 @@ struct SearchResult { SearchResult(); - SearchResult(const SearchResult&); SearchResult(SearchResult&&); ~SearchResult(); - SearchResult& operator=(const SearchResult&); SearchResult& operator=(SearchResult&&); + // Explicit copy only, since the `answerer_result` contains a log entry. + // This should only be called if `answerer_result` is not populated with + // a log entry yet, for example after initial search and before answering. + SearchResult Clone(); + // Gets the answer text from within the `answerer_result`. const std::string& AnswerText() const; @@ -186,7 +189,8 @@ base::WeakPtr AsWeakPtr(); // Submit quality logging data after user selects an item from search result. - void SendQualityLog(const SearchResult& result, + // Note, the `result` contains a log entry that will be consumed by this call. + void SendQualityLog(SearchResult& result, optimization_guide::proto::UserFeedback user_feedback, std::set selections, size_t num_entered_characters, @@ -382,6 +386,9 @@ // Multi-word phrases with spaces, checked by finding substring in query. std::vector filter_phrases_; + // Hashes for phrases of one or two words to be filtered. + std::unordered_set filter_hashes_; + // Callback called when `ProcessAndStorePassages` completes. Needed for tests // as the blink dependency doesn't have a 'wait for pending requests to // complete' mechanism. @@ -409,6 +416,8 @@ FILTERED_NOT_ASCII, FILTERED_PHRASE_MATCH, FILTERED_TERM_MATCH, + FILTERED_ONE_WORD_HASH_MATCH, + FILTERED_TWO_WORD_HASH_MATCH, // These enum values are logged in UMA. Do not reuse or skip any values. // The order doesn't need to be chronological, but keep identities stable. @@ -440,6 +449,9 @@ // embedding, etc. is cancelled before completion and storage. void RecordExtractionCancelled(ExtractionCancelled reason); +// Hash function used for query filtering. +uint32_t HashString(std::string_view str); + } // namespace history_embeddings #endif // COMPONENTS_HISTORY_EMBEDDINGS_HISTORY_EMBEDDINGS_SERVICE_H_ diff -Nru chromium-128.0.6613.84/components/history_embeddings/history_embeddings_service_unittest.cc chromium-128.0.6613.113/components/history_embeddings/history_embeddings_service_unittest.cc --- chromium-128.0.6613.84/components/history_embeddings/history_embeddings_service_unittest.cc 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/history_embeddings/history_embeddings_service_unittest.cc 2024-08-28 22:38:59.000000000 +0000 @@ -78,7 +78,8 @@ {"SearchPassageMinimumWordCount", "3"}, {"UseMlAnswerer", "false"}, {"EnableAnswers", "true"}, - {"FilterTerms", "term1,term2,Filter Phrase,TeRm3"}}}, + {"FilterTerms", "term1,term2,Filter Phrase,TeRm3"}, + {"FilterHashes", "3962775614,4220142007,430397466"}}}, #if BUILDFLAG(IS_CHROMEOS) {chromeos::features::kFeatureManagementHistoryEmbedding, {{}}} #endif // BUILDFLAG(IS_CHROMEOS) @@ -430,6 +431,12 @@ EXPECT_EQ(3u, CountWords("a bc def ")); } +TEST_F(HistoryEmbeddingsServiceTest, StaticHashVerificationTest) { + EXPECT_EQ(history_embeddings::HashString("special"), 3962775614u); + EXPECT_EQ(history_embeddings::HashString("something something"), 4220142007u); + EXPECT_EQ(history_embeddings::HashString("hello world"), 430397466u); +} + TEST_F(HistoryEmbeddingsServiceTest, FilterTerms) { AddTestHistoryPage("http://test1.com"); OnPassagesEmbeddingsComputed(UrlPassages(1, 1, base::Time::Now()), @@ -456,6 +463,11 @@ {"query with inexact te'rm3 in the middle", 0.99}, {"query with 'term3', surrounded by punctuation", 0.99}, {"query with non-ASCII ∅ character but no terms", 0.99}, + {"the word 'special' has its hash filtered", 0.99}, + {"the phrase 'something something' is also hash filtered", 0.99}, + {"this Hello, World! is also hash filtered", 0.99}, + {"Hello | World is also filtered due to trimmed empty removal", 0.99}, + {"hellow orld is not filtered since its hash differs", 0.99}, }); { base::test::TestFuture future; @@ -564,6 +576,55 @@ EXPECT_EQ(result.query, "query with non-ASCII ∅ character but no terms"); EXPECT_EQ(result.count, 0u); } + { + base::test::TestFuture future; + service_->Search("the word 'special' has its hash filtered", {}, 3, + future.GetRepeatingCallback()); + SearchResult result = future.Take(); + EXPECT_FALSE(result.session_id.empty()); + EXPECT_EQ(result.query, "the word 'special' has its hash filtered"); + EXPECT_EQ(result.count, 0u); + } + { + base::test::TestFuture future; + service_->Search("the phrase 'something something' is also hash filtered", + {}, 3, future.GetRepeatingCallback()); + SearchResult result = future.Take(); + EXPECT_FALSE(result.session_id.empty()); + EXPECT_EQ(result.query, + "the phrase 'something something' is also hash filtered"); + EXPECT_EQ(result.count, 0u); + } + { + base::test::TestFuture future; + service_->Search("this Hello, World! is also hash filtered", {}, 3, + future.GetRepeatingCallback()); + SearchResult result = future.Take(); + EXPECT_FALSE(result.session_id.empty()); + EXPECT_EQ(result.query, "this Hello, World! is also hash filtered"); + EXPECT_EQ(result.count, 0u); + } + { + base::test::TestFuture future; + service_->Search( + "Hello | World is also filtered due to trimmed empty removal", {}, 3, + future.GetRepeatingCallback()); + SearchResult result = future.Take(); + EXPECT_FALSE(result.session_id.empty()); + EXPECT_EQ(result.query, + "Hello | World is also filtered due to trimmed empty removal"); + EXPECT_EQ(result.count, 0u); + } + { + base::test::TestFuture future; + service_->Search("hellow orld is not filtered since its hash differs", {}, + 3, future.GetRepeatingCallback()); + SearchResult result = future.Take(); + EXPECT_FALSE(result.session_id.empty()); + EXPECT_EQ(result.query, + "hellow orld is not filtered since its hash differs"); + EXPECT_GT(result.count, 0u); + } } TEST_F(HistoryEmbeddingsServiceTest, AnswerMocked) { diff -Nru chromium-128.0.6613.84/components/history_embeddings/ml_answerer.cc chromium-128.0.6613.113/components/history_embeddings/ml_answerer.cc --- chromium-128.0.6613.84/components/history_embeddings/ml_answerer.cc 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/history_embeddings/ml_answerer.cc 2024-08-28 22:38:59.000000000 +0000 @@ -63,8 +63,8 @@ ~SessionManager() { // Run the existing callback if not called yet with canceled status. if (!callback_.is_null()) { - Finish(AnswererResult{ComputeAnswerStatus::EXECUTION_CANCELLED, query_, - Answer()}); + Finish(AnswererResult(ComputeAnswerStatus::EXECUTION_CANCELLED, query_, + Answer())); } } @@ -118,17 +118,15 @@ optimization_guide::OptimizationGuideModelStreamingExecutionResult result) { if (!result.response.has_value()) { - Finish(AnswererResult{ComputeAnswerStatus::EXECUTION_FAILURE, query_, - Answer()}); + Finish(AnswererResult(ComputeAnswerStatus::EXECUTION_FAILURE, query_, + Answer())); } else if (result.response->is_complete) { auto response = optimization_guide::ParsedAnyMetadata< optimization_guide::proto::HistoryAnswerResponse>( std::move(result.response).value().response); - Finish(AnswererResult{ComputeAnswerStatus::SUCCESS, - query_, - response->answer(), - urls_[session_index], - {}}); + Finish(AnswererResult(ComputeAnswerStatus::SUCCESS, query_, + response->answer(), std::move(result.log_entry), + urls_[session_index], {})); } } @@ -191,8 +189,8 @@ optimization_guide::ModelBasedCapabilityKey::kHistorySearch, /*config_params=*/std::nullopt); if (session == nullptr) { - session_manager_->Finish(AnswererResult{ - ComputeAnswerStatus::MODEL_UNAVAILABLE, query, Answer()}); + session_manager_->Finish(AnswererResult( + ComputeAnswerStatus::MODEL_UNAVAILABLE, query, Answer())); return; } diff -Nru chromium-128.0.6613.84/components/history_embeddings/sql_database.cc chromium-128.0.6613.113/components/history_embeddings/sql_database.cc --- chromium-128.0.6613.84/components/history_embeddings/sql_database.cc 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/history_embeddings/sql_database.cc 2024-08-28 22:38:59.000000000 +0000 @@ -4,6 +4,8 @@ #include "components/history_embeddings/sql_database.h" +#include + #include "base/check.h" #include "base/files/file_path.h" #include "base/metrics/histogram_functions.h" @@ -425,6 +427,20 @@ if (sql_database) { sql_database->iteration_statement_.reset(); } + base::UmaHistogramCounts1000( + "History.Embeddings.DatabaseIterationSkippedPassages", + skipped_passages); + base::UmaHistogramCounts1000( + "History.Embeddings.DatabaseIterationSkippedEmbeddings", + skipped_embeddings); + base::UmaHistogramCounts1000( + "History.Embeddings.DatabaseIterationSkippedMismatches", + skipped_mismatches); + base::UmaHistogramCounts1000( + "History.Embeddings.DatabaseIterationSkippedMissizedEmbeddings", + skipped_missized); + base::UmaHistogramCounts10000( + "History.Embeddings.DatabaseIterationYielded", yielded); } const UrlPassagesEmbeddings* Next() override { @@ -433,7 +449,8 @@ } sql::Statement* statement = sql_database->iteration_statement_.get(); CHECK(statement); - if (statement->Step()) { + // Don't expect perfect data; step until we find valid data. + while (statement->Step()) { data = UrlPassagesEmbeddings(/*url_id=*/statement->ColumnInt64(0), /*visit_id=*/statement->ColumnInt64(1), /*visit_time=*/statement->ColumnTime(2)); @@ -441,29 +458,58 @@ std::optional passages_value = PassagesBlobToProto(statement->ColumnBlob(3), *sql_database->encryptor_); - if (passages_value.has_value()) { - data.url_passages.passages = std::move(passages_value.value()); + if (!passages_value.has_value()) { + skipped_passages++; + continue; } + data.url_passages.passages = std::move(passages_value.value()); + // Embeddings base::span blob = statement->ColumnBlob(4); proto::EmbeddingsValue value; if (!value.ParseFromArray(blob.data(), blob.size())) { - return nullptr; + skipped_embeddings++; + continue; } for (const proto::EmbeddingVector& vector : value.vectors()) { data.url_embeddings.embeddings.emplace_back( std::vector(vector.floats().cbegin(), vector.floats().cend()), vector.passage_word_count()); } + const size_t expected_dimensions = + sql_database->GetEmbeddingDimensions(); + if (std::ranges::any_of(data.url_embeddings.embeddings, + [=](const Embedding& embedding) { + return embedding.Dimensions() != + expected_dimensions; + })) { + skipped_missized++; + continue; + } + // Confirm embeddings and passages are 1:1. + if (data.url_embeddings.embeddings.empty() || + data.url_embeddings.embeddings.size() != + static_cast( + data.url_passages.passages.passages_size())) { + skipped_mismatches++; + continue; + } + + yielded++; return &data; - } else { - return nullptr; } + return nullptr; } base::WeakPtr sql_database; UrlPassagesEmbeddings data; + // Keep stats on any data loading failures, and report histogram in dtor. + int skipped_passages = 0; + int skipped_embeddings = 0; + int skipped_mismatches = 0; + int skipped_missized = 0; + int yielded = 0; }; return std::make_unique(weak_ptr_factory_.GetWeakPtr(), diff -Nru chromium-128.0.6613.84/components/history_embeddings/sql_database_unittest.cc chromium-128.0.6613.113/components/history_embeddings/sql_database_unittest.cc --- chromium-128.0.6613.84/components/history_embeddings/sql_database_unittest.cc 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/history_embeddings/sql_database_unittest.cc 2024-08-28 22:38:59.000000000 +0000 @@ -9,6 +9,7 @@ #include "base/files/scoped_temp_dir.h" #include "base/run_loop.h" #include "base/test/bind.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/task_environment.h" #include "base/test/test_future.h" #include "components/history_embeddings/proto/history_embeddings.pb.h" @@ -53,6 +54,8 @@ url_data_1.url_passages.passages.add_passages("fake passage 2"); url_data_1.url_embeddings.embeddings.emplace_back( std::vector(kEmbeddingsSize, 1.0f)); + url_data_1.url_embeddings.embeddings.emplace_back( + std::vector(kEmbeddingsSize, 1.0f)); ASSERT_TRUE(sql_database->AddUrlData(url_data_1)); } @@ -62,6 +65,8 @@ url_data_2.url_passages.passages.add_passages("fake passage 4"); url_data_2.url_embeddings.embeddings.emplace_back( std::vector(kEmbeddingsSize, 1.0f)); + url_data_2.url_embeddings.embeddings.emplace_back( + std::vector(kEmbeddingsSize, 1.0f)); ASSERT_TRUE(sql_database->AddUrlData(url_data_2)); } @@ -435,4 +440,43 @@ EXPECT_FALSE(sql_database->GetUrlData(2).has_value()); } +TEST_F(HistoryEmbeddingsSqlDatabaseTest, IterationSkipsAndReportsMismatches) { + auto sql_database = std::make_unique(history_dir_.GetPath()); + sql_database->SetEmbedderMetadata({kEmbeddingsVersion, kEmbeddingsSize}, + GetEncryptorInstance()); + + // Write embeddings. + UrlPassagesEmbeddings url_datas[] = { + UrlPassagesEmbeddings(1, 1, base::Time::Now()), + UrlPassagesEmbeddings(2, 2, base::Time::Now()), + }; + url_datas[0].url_passages.passages.add_passages("data 0 passage 0"); + url_datas[0].url_embeddings.embeddings.push_back(FakeEmbedding()); + url_datas[1].url_passages.passages.add_passages("data 1 passage 0"); + url_datas[1].url_passages.passages.add_passages("data 1 passage 1"); + url_datas[1].url_embeddings.embeddings.push_back(FakeEmbedding()); + url_datas[1].url_embeddings.embeddings.push_back(FakeEmbedding()); + // Add one too many embeddings to trigger a mismatch. + url_datas[1].url_embeddings.embeddings.push_back(FakeEmbedding()); + EXPECT_TRUE(sql_database->AddUrlData(url_datas[0])); + EXPECT_TRUE(sql_database->AddUrlData(url_datas[1])); + + base::HistogramTester histogram_tester; + int observed = 0; + { + // Iterate through stored data once. + std::unique_ptr iterator = + sql_database->MakeUrlDataIterator({}); + EXPECT_TRUE(iterator); + while (iterator->Next()) { + observed++; + } + } + EXPECT_EQ(observed, 1); + histogram_tester.ExpectUniqueSample( + "History.Embeddings.DatabaseIterationSkippedMismatches", 1, 1); + histogram_tester.ExpectUniqueSample( + "History.Embeddings.DatabaseIterationYielded", 1, 1); +} + } // namespace history_embeddings diff -Nru chromium-128.0.6613.84/components/history_embeddings/vector_database.cc chromium-128.0.6613.113/components/history_embeddings/vector_database.cc --- chromium-128.0.6613.84/components/history_embeddings/vector_database.cc 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/history_embeddings/vector_database.cc 2024-08-28 22:38:59.000000000 +0000 @@ -80,6 +80,11 @@ float Embedding::ScoreWith(SearchInfo& search_info, const std::string& other_passage, const Embedding& other_embedding) const { + // This check is redundant since the database layers ensure embeddings + // always have a fixed consistent size, but code can change with time, + // and being sure directly before use may eventually catch a bug. + CHECK_EQ(data_.size(), other_embedding.data_.size()); + float score = 0.0f; // Skip non-ASCII strings to avoid scoring problems with the model. if (base::IsStringASCII(other_passage)) { diff -Nru chromium-128.0.6613.84/components/omnibox/browser/BUILD.gn chromium-128.0.6613.113/components/omnibox/browser/BUILD.gn --- chromium-128.0.6613.84/components/omnibox/browser/BUILD.gn 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/omnibox/browser/BUILD.gn 2024-08-28 22:39:00.000000000 +0000 @@ -759,6 +759,10 @@ "fake_on_device_tail_model_service.h", ] } + + if (!is_ios) { + deps += [ "//components/history_embeddings" ] + } } bundle_data("unit_tests_bundle_data") { diff -Nru chromium-128.0.6613.84/components/omnibox/browser/autocomplete_controller.cc chromium-128.0.6613.113/components/omnibox/browser/autocomplete_controller.cc --- chromium-128.0.6613.84/components/omnibox/browser/autocomplete_controller.cc 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/omnibox/browser/autocomplete_controller.cc 2024-08-28 22:39:00.000000000 +0000 @@ -63,7 +63,6 @@ #include "components/omnibox/browser/most_visited_sites_provider.h" #include "components/omnibox/browser/omnibox_feature_configs.h" #include "components/omnibox/browser/omnibox_field_trial.h" -#include "components/omnibox/browser/omnibox_prefs.h" #include "components/omnibox/browser/on_device_head_provider.h" #include "components/omnibox/browser/open_tab_provider.h" #include "components/omnibox/browser/page_classification_functions.h" @@ -1250,7 +1249,9 @@ } #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) if (provider_types & AutocompleteProvider::TYPE_FEATURED_SEARCH) { - providers_.push_back(new FeaturedSearchProvider(provider_client_.get())); + featured_search_provider_ = + new FeaturedSearchProvider(provider_client_.get()); + providers_.push_back(featured_search_provider_.get()); } #endif // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) } @@ -1451,8 +1452,17 @@ MaybeRemoveCompanyEntityImages(&internal_result_); MaybeCleanSuggestionsForKeywordMode(input_, &internal_result_); + // Notify providers which of their matches were shown. If we end up with more + // providers to notify, we should add `RegisterDisplayedMatches()` to the + // `AutocompleteProvider` interface and iterate all providers here. if (search_provider_) search_provider_->RegisterDisplayedAnswers(internal_result_); +#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) + // `featured_search_provider_` isn't interested in "invisible" autocomplete + // runs, e.g. when text is copied. + if (featured_search_provider_ && !input_.omit_asynchronous_matches()) + featured_search_provider_->RegisterDisplayedMatches(internal_result_); +#endif // Mark the rich autocompletion feature triggered if the top match, or // would-be-top-match if rich autocompletion is counterfactual enabled, is diff -Nru chromium-128.0.6613.84/components/omnibox/browser/autocomplete_controller.h chromium-128.0.6613.113/components/omnibox/browser/autocomplete_controller.h --- chromium-128.0.6613.84/components/omnibox/browser/autocomplete_controller.h 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/omnibox/browser/autocomplete_controller.h 2024-08-28 22:39:00.000000000 +0000 @@ -42,6 +42,7 @@ class ClipboardProvider; class DocumentProvider; +class FeaturedSearchProvider; class HistoryFuzzyProvider; class HistoryQuickProvider; class HistoryURLProvider; @@ -503,6 +504,10 @@ raw_ptr open_tab_provider_; +#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) + raw_ptr featured_search_provider_; +#endif + // A vector of scoring signals annotators for URL suggestions. // Unlike the other existing annotators (e.g., pedals and keywords), these // signal annotations should be done before the sort and cull pass. diff -Nru chromium-128.0.6613.84/components/omnibox/browser/fake_autocomplete_provider_client.cc chromium-128.0.6613.113/components/omnibox/browser/fake_autocomplete_provider_client.cc --- chromium-128.0.6613.84/components/omnibox/browser/fake_autocomplete_provider_client.cc 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/omnibox/browser/fake_autocomplete_provider_client.cc 2024-08-28 22:39:00.000000000 +0000 @@ -69,10 +69,12 @@ return history_clusters_service_; } +#if !BUILDFLAG(IS_IOS) history_embeddings::HistoryEmbeddingsService* FakeAutocompleteProviderClient::GetHistoryEmbeddingsService() { - return history_embeddings_service_; + return history_embeddings_service_.get(); } +#endif bookmarks::BookmarkModel* FakeAutocompleteProviderClient::GetBookmarkModel() { return bookmark_model_.get(); diff -Nru chromium-128.0.6613.84/components/omnibox/browser/fake_autocomplete_provider_client.h chromium-128.0.6613.113/components/omnibox/browser/fake_autocomplete_provider_client.h --- chromium-128.0.6613.84/components/omnibox/browser/fake_autocomplete_provider_client.h 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/omnibox/browser/fake_autocomplete_provider_client.h 2024-08-28 22:39:00.000000000 +0000 @@ -26,6 +26,10 @@ #include "components/omnibox/browser/fake_on_device_tail_model_service.h" #endif // BUILDFLAG(BUILD_WITH_TFLITE_LIB) +#if !BUILDFLAG(IS_IOS) +#include "components/history_embeddings/history_embeddings_service.h" +#endif // IS_IOS + namespace bookmarks { class BookmarkModel; } // namespace bookmarks @@ -67,8 +71,10 @@ history::HistoryService* GetHistoryService() override; history_clusters::HistoryClustersService* GetHistoryClustersService() override; +#if !BUILDFLAG(IS_IOS) history_embeddings::HistoryEmbeddingsService* GetHistoryEmbeddingsService() override; +#endif bookmarks::BookmarkModel* GetBookmarkModel() override; InMemoryURLIndex* GetInMemoryURLIndex() override; scoped_refptr GetShortcutsBackend() override; @@ -97,10 +103,12 @@ history_clusters_service_ = service; } +#if !BUILDFLAG(IS_IOS) void set_history_embeddings_service( - history_embeddings::HistoryEmbeddingsService* service) { - history_embeddings_service_ = service; + std::unique_ptr service) { + history_embeddings_service_ = std::move(service); } +#endif // There should be no reason to set this unless the tested provider actually // uses the AutocompleteProviderClient's InMemoryURLIndex, like the @@ -130,8 +138,10 @@ std::unique_ptr history_service_; raw_ptr history_clusters_service_ = nullptr; - raw_ptr - history_embeddings_service_ = nullptr; +#if !BUILDFLAG(IS_IOS) + std::unique_ptr + history_embeddings_service_; +#endif scoped_refptr shortcuts_backend_; std::unique_ptr tile_service_; FakeTabMatcher fake_tab_matcher_; diff -Nru chromium-128.0.6613.84/components/omnibox/browser/featured_search_provider.cc chromium-128.0.6613.113/components/omnibox/browser/featured_search_provider.cc --- chromium-128.0.6613.84/components/omnibox/browser/featured_search_provider.cc 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/omnibox/browser/featured_search_provider.cc 2024-08-28 22:39:00.000000000 +0000 @@ -8,6 +8,7 @@ #include #include +#include #include #include @@ -22,6 +23,7 @@ #include "components/omnibox/browser/autocomplete_match_classification.h" #include "components/omnibox/browser/autocomplete_match_type.h" #include "components/omnibox/browser/autocomplete_provider_client.h" +#include "components/omnibox/browser/autocomplete_result.h" #include "components/omnibox/browser/in_memory_url_index_types.h" #include "components/omnibox/browser/keyword_provider.h" #include "components/omnibox/browser/omnibox_field_trial.h" @@ -43,22 +45,41 @@ constexpr bool kIsDesktop = !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS); -std::string GetShowIPHPrefNameFor(IphType iph_type) { +std::string GetIphDismissedPrefNameFor(IphType iph_type) { switch (iph_type) { case IphType::kNone: NOTREACHED(); case IphType::kGemini: - return omnibox::kShowGeminiIPH; + return omnibox::kDismissedGeminiIph; case IphType::kFeaturedEnterpriseSearch: - return omnibox::kShowFeaturedEnterpriseSiteSearchIPHPrefName; + return omnibox::kDismissedFeaturedEnterpriseSiteSearchIphPrefName; case IphType::kHistoryEmbeddingsSettingsPromo: - return omnibox::kShowHistoryEmbeddingsSettingsPromo; + return omnibox::kDismissedHistoryEmbeddingsSettingsPromo; case IphType::kHistoryEmbeddingsDisclaimer: NOTREACHED(); // This is a non-dismissible disclaimer. case IphType::kHistoryScopePromo: - return omnibox::kShowHistoryScopePromo; + return omnibox::kDismissedHistoryScopePromo; case IphType::kHistoryEmbeddingsScopePromo: - return omnibox::kShowHistoryEmbeddingsScopePromo; + return omnibox::kDismissedHistoryEmbeddingsScopePromo; + } +} + +std::string GetIphShownCountPrefNameFor(IphType iph_type) { + switch (iph_type) { + case IphType::kNone: + NOTREACHED(); + case IphType::kGemini: + return omnibox::kShownCountGeminiIph; + case IphType::kFeaturedEnterpriseSearch: + return omnibox::kShownCountFeaturedEnterpriseSiteSearchIph; + case IphType::kHistoryEmbeddingsSettingsPromo: + return omnibox::kShownCountHistoryEmbeddingsSettingsPromo; + case IphType::kHistoryEmbeddingsDisclaimer: + NOTREACHED(); // This disclaimer has no show count limit. + case IphType::kHistoryScopePromo: + return omnibox::kShownCountHistoryScopePromo; + case IphType::kHistoryEmbeddingsScopePromo: + return omnibox::kShownCountHistoryEmbeddingsScopePromo; } } @@ -103,7 +124,7 @@ bool minimal_changes) { matches_.clear(); if (input.IsZeroSuggest()) - iph_shown_this_session_ = false; + iph_shown_in_omnibox_session_ = false; AutocompleteInput keyword_input = input; const TemplateURL* keyword_turl = @@ -127,7 +148,7 @@ } else if (ShouldShowGeminiIPHMatch(input)) { AddIPHMatch(IphType::kGemini, l10n_util::GetStringUTF16(IDS_OMNIBOX_GEMINI_IPH), u"@gemini", - u"", {}); + u"", {}, true); } else if (ShouldShowHistoryScopePromoIphMatch(input)) { AddHistoryScopePromoIphMatch(); } else if (ShouldShowHistoryEmbeddingsScopePromoIphMatch(input)) { @@ -145,12 +166,12 @@ void FeaturedSearchProvider::DeleteMatch(const AutocompleteMatch& match) { // Only `NULL_RESULT_MESSAGE` types from this provider are deletable. CHECK(match.deletable); - CHECK(match.type == AutocompleteMatchType::NULL_RESULT_MESSAGE); + CHECK_EQ(match.type, AutocompleteMatchType::NULL_RESULT_MESSAGE); // Set the pref so this provider doesn't continue to offer the suggestion. PrefService* prefs = client_->GetPrefs(); - CHECK(match.iph_type != IphType::kNone); - prefs->SetBoolean(GetShowIPHPrefNameFor(match.iph_type), false); + CHECK_NE(match.iph_type, IphType::kNone); + prefs->SetBoolean(GetIphDismissedPrefNameFor(match.iph_type), true); // Delete `match` from `matches_`. std::erase_if(matches_, [&match](const auto& i) { @@ -266,17 +287,18 @@ const std::u16string& iph_contents, const std::u16string& matched_term, const std::u16string& iph_link_text, - const GURL& iph_link_url) { + const GURL& iph_link_url, + bool deletable) { // IPH suggestions are grouped after all other suggestions. But they still // need to score within top N suggestions to be shown. constexpr int kRelevanceScore = 5000; - AutocompleteMatch match(this, kRelevanceScore, /*deletable=*/false, + AutocompleteMatch match(this, kRelevanceScore, /*deletable=*/deletable, AutocompleteMatchType::NULL_RESULT_MESSAGE); // Use this suggestion's contents field to display a message to the user that // cannot be acted upon. match.contents = iph_contents; - match.deletable = true; + CHECK_NE(iph_type, IphType::kNone); match.iph_type = iph_type; match.iph_link_text = iph_link_text; match.iph_link_url = iph_link_url; @@ -294,9 +316,28 @@ ACMatchClassification::DIM); matches_.push_back(match); - if (!iph_shown_this_session_) { - iph_shown_count_++; - iph_shown_this_session_ = true; +} + +void FeaturedSearchProvider::RegisterDisplayedMatches( + const AutocompleteResult& result) { + auto iph_match = std::ranges::find_if(result, [](const auto& match) { + return match.iph_type != IphType::kNone; + }); + IphType iph_type = + iph_match == result.end() ? IphType::kNone : iph_match->iph_type; + + // `kHistoryEmbeddingsDisclaimer` has no shown limit. + if (!iph_shown_in_omnibox_session_ && iph_type != IphType::kNone && + iph_type != IphType::kHistoryEmbeddingsDisclaimer) { + PrefService* prefs = client_->GetPrefs(); + // `ShouldShowIPH()` shouldn't allow adding IPH matches if there is no + // `prefs`. + CHECK(prefs); + prefs->SetInteger( + GetIphShownCountPrefNameFor(iph_type), + prefs->GetInteger(GetIphShownCountPrefNameFor(iph_type)) + 1); + iph_shown_in_browser_session_count_++; + iph_shown_in_omnibox_session_ = true; } } @@ -370,14 +411,23 @@ bool FeaturedSearchProvider::ShouldShowIPH(IphType iph_type) const { PrefService* prefs = client_->GetPrefs(); - size_t iph_shown_limit = - iph_type == IphType::kGemini || - iph_type == IphType::kFeaturedEnterpriseSearch - ? OmniboxFieldTrial::kStarterPackIPHPerSessionLimit.Get() - : 3; - return prefs && prefs->GetBoolean(GetShowIPHPrefNameFor(iph_type)) && - ((iph_shown_limit == INT_MAX) || - (iph_shown_count_ < iph_shown_limit) || iph_shown_this_session_); + // Check the IPH hasn't been dismissed. + if (!prefs || prefs->GetBoolean(GetIphDismissedPrefNameFor(iph_type))) + return false; + + // The limit only applies once per session. E.g., when the user types + // '@history a', the `kHistoryEmbeddingsSettingsPromo` IPH might be shown. + // When they then type '@history abcdefg', the IPH should continue to be + // shown, and not disappear at '@history abcd', and only count as 1 shown. + if (iph_shown_in_omnibox_session_) + return true; + + // Check the IPH hasn't reached its show limit. Check too many IPHs haven't + // been shown this session; don't want to show 3 of type 1, then 3 of type 2 + // immediately after. + size_t iph_shown_count = + prefs->GetInteger(GetIphShownCountPrefNameFor(iph_type)); + return iph_shown_count < 3 && iph_shown_in_browser_session_count_ < 3; } void FeaturedSearchProvider::AddFeaturedEnterpriseSearchIPHMatch() { @@ -392,7 +442,7 @@ l10n_util::GetStringFUTF16( IDS_OMNIBOX_FEATURED_ENTERPRISE_SITE_SEARCH_IPH, base::UTF8ToUTF16(base::JoinString(sites, ", "))), - u"", u"", {}); + u"", u"", {}, true); } bool FeaturedSearchProvider::ShouldShowHistoryEmbeddingsSettingsPromoIphMatch() @@ -417,9 +467,9 @@ u" "; std::u16string link_text = l10n_util::GetStringUTF16( IDS_OMNIBOX_HISTORY_EMBEDDINGS_SETTINGS_PROMO_IPH_LINK_TEXT); - GURL link_url = GURL("chrome://settings/ai"); + GURL link_url = GURL("chrome://settings/historySearch"); AddIPHMatch(IphType::kHistoryEmbeddingsSettingsPromo, text, u"", link_text, - link_url); + link_url, true); } bool FeaturedSearchProvider::ShouldShowHistoryEmbeddingsDisclaimerIphMatch() @@ -437,9 +487,9 @@ u" "; std::u16string link_text = l10n_util::GetStringUTF16( IDS_OMNIBOX_HISTORY_EMBEDDINGS_DISCLAIMER_IPH_LINK_TEXT); - GURL link_url = GURL("chrome://settings/ai"); + GURL link_url = GURL("chrome://settings/historySearch"); AddIPHMatch(IphType::kHistoryEmbeddingsDisclaimer, text, u"", link_text, - link_url); + link_url, false); } bool FeaturedSearchProvider::ShouldShowHistoryScopePromoIphMatch( @@ -457,7 +507,7 @@ void FeaturedSearchProvider::AddHistoryScopePromoIphMatch() { std::u16string text = l10n_util::GetStringUTF16(IDS_OMNIBOX_HISTORY_SCOPE_PROMO_IPH); - AddIPHMatch(IphType::kHistoryScopePromo, text, u"@history", u"", {}); + AddIPHMatch(IphType::kHistoryScopePromo, text, u"@history", u"", {}, true); } bool FeaturedSearchProvider::ShouldShowHistoryEmbeddingsScopePromoIphMatch( @@ -472,6 +522,6 @@ void FeaturedSearchProvider::AddHistoryEmbeddingsScopePromoIphMatch() { std::u16string text = l10n_util::GetStringUTF16(IDS_OMNIBOX_HISTORY_EMBEDDINGS_SCOPE_PROMO_IPH); - AddIPHMatch(IphType::kHistoryEmbeddingsScopePromo, text, u"@history", u"", - {}); + AddIPHMatch(IphType::kHistoryEmbeddingsScopePromo, text, u"@history", u"", {}, + true); } diff -Nru chromium-128.0.6613.84/components/omnibox/browser/featured_search_provider.h chromium-128.0.6613.113/components/omnibox/browser/featured_search_provider.h --- chromium-128.0.6613.84/components/omnibox/browser/featured_search_provider.h 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/omnibox/browser/featured_search_provider.h 2024-08-28 22:39:00.000000000 +0000 @@ -17,6 +17,7 @@ class AutocompleteInput; class AutocompleteProviderClient; class TemplateURLService; +class AutocompleteResult; // This is the provider for built-in URLs, such as about:settings and // chrome://version, as well as the built-in Starter Pack search engines. @@ -30,6 +31,10 @@ void Start(const AutocompleteInput& input, bool minimal_changes) override; void DeleteMatch(const AutocompleteMatch& match) override; + // Called by `AutocompleteController` after ranking has settled. Increments + // IPH shown counts. + void RegisterDisplayedMatches(const AutocompleteResult& result); + private: ~FeaturedSearchProvider() override; @@ -53,7 +58,8 @@ const std::u16string& iph_contents, const std::u16string& matched_term, const std::u16string& iph_link_text, - const GURL& iph_link_url); + const GURL& iph_link_url, + bool deletable); void AddFeaturedEnterpriseSearchMatch(const TemplateURL& template_url, const AutocompleteInput& input); @@ -94,12 +100,16 @@ raw_ptr client_; raw_ptr template_url_service_; - // The number of times the IPH row has been shown so far in this session. - size_t iph_shown_count_{0}; + // The number of times the IPH row has been shown so far in this browser + // session. Shared by all IPH types. Reset when, e.g., the user opens a new + // browser window. + size_t iph_shown_in_browser_session_count_{0}; // Whether an IPH match was shown during the current omnibox session. Used to - // avoid incrementing `iph_shown_count_` more than once per session. - bool iph_shown_this_session_ = false; + // avoid incrementing `iph_shown_in_browser_session_count_` more than once per + // omnibox session. Reset when, e.g., the user refocuses the omnibox. + // omnibox. + bool iph_shown_in_omnibox_session_ = false; }; #endif // COMPONENTS_OMNIBOX_BROWSER_FEATURED_SEARCH_PROVIDER_H_ diff -Nru chromium-128.0.6613.84/components/omnibox/browser/featured_search_provider_unittest.cc chromium-128.0.6613.113/components/omnibox/browser/featured_search_provider_unittest.cc --- chromium-128.0.6613.84/components/omnibox/browser/featured_search_provider_unittest.cc 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/omnibox/browser/featured_search_provider_unittest.cc 2024-08-28 22:39:00.000000000 +0000 @@ -19,6 +19,7 @@ #include "components/omnibox/browser/autocomplete_input.h" #include "components/omnibox/browser/autocomplete_match.h" #include "components/omnibox/browser/autocomplete_match_type.h" +#include "components/omnibox/browser/autocomplete_result.h" #include "components/omnibox/browser/fake_autocomplete_provider_client.h" #include "components/omnibox/browser/omnibox_prefs.h" #include "components/omnibox/browser/test_scheme_classifier.h" @@ -128,6 +129,19 @@ } } + void RunAndVerifyIphTypes(const AutocompleteInput& input, + const std::vector expected_iph_types) { + provider_->Start(input, false); + EXPECT_TRUE(provider_->done()); + ACMatches matches = provider_->matches(); + if (matches.size() == expected_iph_types.size()) { + for (size_t j = 0; j < expected_iph_types.size(); ++j) + EXPECT_EQ(matches[j].iph_type, expected_iph_types[j]); + } else { + EXPECT_EQ(matches.size(), expected_iph_types.size()); + } + } + // Populate the TemplateURLService with starter pack entries. void AddStarterPackEntriesToTemplateUrlService() { std::vector> turls = @@ -377,7 +391,7 @@ // Run the provider, there should be one match corresponding to IPH for // Starter Pack. - EXPECT_TRUE(prefs->GetBoolean(omnibox::kShowGeminiIPH)); + EXPECT_FALSE(prefs->GetBoolean(omnibox::kDismissedGeminiIph)); provider_->Start(input, false); ACMatches matches = provider_->matches(); EXPECT_EQ(matches.size(), 1u); @@ -389,7 +403,7 @@ provider_->DeleteMatch(matches[0]); matches = provider_->matches(); EXPECT_EQ(matches.size(), 0u); - EXPECT_FALSE(prefs->GetBoolean(omnibox::kShowGeminiIPH)); + EXPECT_TRUE(prefs->GetBoolean(omnibox::kDismissedGeminiIph)); // Run the provider again, IPH match should not be provided. provider_->Start(input, false); @@ -458,8 +472,8 @@ // Run the provider, there should be one match corresponding to IPH for // featured Enterprise search. PrefService* prefs = client_->GetPrefs(); - EXPECT_TRUE( - prefs->GetBoolean(omnibox::kShowFeaturedEnterpriseSiteSearchIPHPrefName)); + EXPECT_FALSE(prefs->GetBoolean( + omnibox::kDismissedFeaturedEnterpriseSiteSearchIphPrefName)); provider_->Start(input, false); ACMatches matches = provider_->matches(); EXPECT_EQ(matches.size(), 1u); @@ -471,8 +485,8 @@ provider_->DeleteMatch(matches[0]); matches = provider_->matches(); EXPECT_EQ(matches.size(), 0u); - EXPECT_FALSE( - prefs->GetBoolean(omnibox::kShowFeaturedEnterpriseSiteSearchIPHPrefName)); + EXPECT_TRUE(prefs->GetBoolean( + omnibox::kDismissedFeaturedEnterpriseSiteSearchIphPrefName)); // Run the provider again, IPH match should not be provided. provider_->Start(input, false); @@ -505,9 +519,9 @@ // Run the provider, there should be one match corresponding to IPH for // featured Enterprise search. PrefService* prefs = client_->GetPrefs(); - EXPECT_TRUE( - prefs->GetBoolean(omnibox::kShowFeaturedEnterpriseSiteSearchIPHPrefName)); - EXPECT_TRUE(prefs->GetBoolean(omnibox::kShowGeminiIPH)); + EXPECT_FALSE(prefs->GetBoolean( + omnibox::kDismissedFeaturedEnterpriseSiteSearchIphPrefName)); + EXPECT_FALSE(prefs->GetBoolean(omnibox::kDismissedGeminiIph)); provider_->Start(input, false); ACMatches matches = provider_->matches(); EXPECT_EQ(matches.size(), 1u); @@ -519,13 +533,13 @@ provider_->DeleteMatch(matches[0]); matches = provider_->matches(); EXPECT_EQ(matches.size(), 0u); - EXPECT_FALSE( - prefs->GetBoolean(omnibox::kShowFeaturedEnterpriseSiteSearchIPHPrefName)); - EXPECT_TRUE(prefs->GetBoolean(omnibox::kShowGeminiIPH)); + EXPECT_TRUE(prefs->GetBoolean( + omnibox::kDismissedFeaturedEnterpriseSiteSearchIphPrefName)); + EXPECT_FALSE(prefs->GetBoolean(omnibox::kDismissedGeminiIph)); // Run the provider again, there should be one match corresponding to IPH for // Starter Pack. - EXPECT_TRUE(prefs->GetBoolean(omnibox::kShowGeminiIPH)); + EXPECT_FALSE(prefs->GetBoolean(omnibox::kDismissedGeminiIph)); provider_->Start(input, false); matches = provider_->matches(); EXPECT_EQ(matches.size(), 1u); @@ -537,9 +551,9 @@ provider_->DeleteMatch(matches[0]); matches = provider_->matches(); EXPECT_EQ(matches.size(), 0u); - EXPECT_FALSE( - prefs->GetBoolean(omnibox::kShowFeaturedEnterpriseSiteSearchIPHPrefName)); - EXPECT_FALSE(prefs->GetBoolean(omnibox::kShowGeminiIPH)); + EXPECT_TRUE(prefs->GetBoolean( + omnibox::kDismissedFeaturedEnterpriseSiteSearchIphPrefName)); + EXPECT_TRUE(prefs->GetBoolean(omnibox::kDismissedGeminiIph)); // Run the provider again, IPH match should not be provided. provider_->Start(input, false); @@ -615,7 +629,8 @@ RunAndVerifyIph(non_zero_input, {}); } - // chrome://settings/ai promo shown when not opted-in and in @history scope. + // chrome://settings/historySearch promo shown when not opted-in and in + // @history scope. mock_setting(true, false); { SCOPED_TRACE(""); @@ -624,7 +639,8 @@ {{IphType::kHistoryEmbeddingsSettingsPromo, // Should end with whitespace since there's a link following it. u"For a more powerful way to search your browsing history, turn on ", - u"History search, powered by AI", GURL("chrome://settings/ai")}}); + u"History search, powered by AI", + GURL("chrome://settings/historySearch")}}); } // Not shown for unscoped inputs. Zero input will show the '@history' promo // tested above, so just test `non_zero_input` here. @@ -650,7 +666,7 @@ u"Your searches, best matches, and their page contents are sent to " u"Google and may be seen by human reviewers to improve this feature. " u"This is an experimental feature and won't always get it right. ", - u"Learn more", GURL("chrome://settings/ai")}}); + u"Learn more", GURL("chrome://settings/historySearch")}}); } // Not shown for unscoped inputs. Zero input will show the '@history' AI promo // tested above, so just test `non_zero_input` here. @@ -678,3 +694,62 @@ RunAndVerifyIph(scope_input, {}); } } + +TEST_F(FeaturedSearchProviderTest, IphShownLimit) { + base::test::ScopedFeatureList features; + features.InitWithFeaturesAndParameters( + {{omnibox::kStarterPackIPH, {}}, + {history_embeddings::kHistoryEmbeddings, + {{history_embeddings::kOmniboxScoped.name, "true"}}}}, + {}); + AddStarterPackEntriesToTemplateUrlService(); + AutocompleteInput input; + input.set_focus_type(metrics::INTERACTION_FOCUS); + + auto test = [&](const AutocompleteInput& input, + const std::vector expected_iph_types) { + RunAndVerifyIphTypes(input, expected_iph_types); + // Notify the provider which matches were shown. + AutocompleteResult result; + result.AppendMatches(provider_->matches()); + provider_->RegisterDisplayedMatches(result); + }; + + // Show up to 3 IPHs per session. + { + SCOPED_TRACE(""); + test(input, {IphType::kGemini}); + } + { + SCOPED_TRACE(""); + test(input, {IphType::kGemini}); + } + { + SCOPED_TRACE(""); + test(input, {IphType::kGemini}); + } + { + SCOPED_TRACE(""); + test(input, {}); + } + + // Start a new session, should see an IPH 3 more times. But not the same IPH + // as before, since it already consumed its limit. + provider_ = new FeaturedSearchProvider(client_.get()); + { + SCOPED_TRACE(""); + test(input, {IphType::kHistoryScopePromo}); + } + { + SCOPED_TRACE(""); + test(input, {IphType::kHistoryScopePromo}); + } + { + SCOPED_TRACE(""); + test(input, {IphType::kHistoryScopePromo}); + } + { + SCOPED_TRACE(""); + test(input, {}); + } +} diff -Nru chromium-128.0.6613.84/components/omnibox/browser/history_embeddings_provider.cc chromium-128.0.6613.113/components/omnibox/browser/history_embeddings_provider.cc --- chromium-128.0.6613.84/components/omnibox/browser/history_embeddings_provider.cc 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/omnibox/browser/history_embeddings_provider.cc 2024-08-28 22:39:00.000000000 +0000 @@ -5,10 +5,8 @@ #include "history_embeddings_provider.h" #include -#include #include "base/check.h" -#include "base/feature_list.h" #include "base/functional/bind.h" #include "base/strings/utf_string_conversions.h" #include "components/history_embeddings/history_embeddings_features.h" @@ -19,7 +17,6 @@ #include "components/omnibox/browser/autocomplete_provider.h" #include "components/omnibox/browser/autocomplete_provider_client.h" #include "components/omnibox/browser/keyword_provider.h" -#include "components/search_engines/template_url.h" namespace { constexpr int kMaxScore = 1000; @@ -28,9 +25,7 @@ HistoryEmbeddingsProvider::HistoryEmbeddingsProvider( AutocompleteProviderClient* client, AutocompleteProviderListener* listener) - : AutocompleteProvider(AutocompleteProvider::TYPE_HISTORY_EMBEDDINGS), - client_(client) { - CHECK(client_); + : HistoryProvider(AutocompleteProvider::TYPE_HISTORY_EMBEDDINGS, client) { AddListener(listener); } @@ -41,7 +36,7 @@ done_ = true; matches_.clear(); - if (!client_->IsHistoryEmbeddingsEnabled()) { + if (!client()->IsHistoryEmbeddingsEnabled()) { return; } @@ -49,7 +44,7 @@ // engine. const auto [adjusted_input, starter_pack_engine] = KeywordProvider::AdjustInputForStarterPackEngines( - input, client_->GetTemplateURLService()); + input, client()->GetTemplateURLService()); starter_pack_engine_ = starter_pack_engine; int num_terms = @@ -58,7 +53,7 @@ return; history_embeddings::HistoryEmbeddingsService* service = - client_->GetHistoryEmbeddingsService(); + client()->GetHistoryEmbeddingsService(); CHECK(service); last_search_input_ = adjusted_input.text(); done_ = false; @@ -75,11 +70,6 @@ // should call it here. } -void HistoryEmbeddingsProvider::DeleteMatch(const AutocompleteMatch& match) { - // TODO(b/333770460): Should delete the entry in the history & embeddings DBs. - // Should also set `match.deletable = true`. -} - void HistoryEmbeddingsProvider::OnReceivedSearchResult( std::u16string input_text, history_embeddings::SearchResult result) { @@ -98,7 +88,8 @@ for (const history_embeddings::ScoredUrlRow& scored_url_row : result.scored_url_rows) { AutocompleteMatch match(this, scored_url_row.scored_url.score * kMaxScore, - false, AutocompleteMatchType::HISTORY_EMBEDDINGS); + client()->AllowDeletingBrowserHistory(), + AutocompleteMatchType::HISTORY_EMBEDDINGS); match.destination_url = scored_url_row.row.url(); match.description = diff -Nru chromium-128.0.6613.84/components/omnibox/browser/history_embeddings_provider.h chromium-128.0.6613.113/components/omnibox/browser/history_embeddings_provider.h --- chromium-128.0.6613.84/components/omnibox/browser/history_embeddings_provider.h 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/omnibox/browser/history_embeddings_provider.h 2024-08-28 22:39:00.000000000 +0000 @@ -9,22 +9,20 @@ #include "base/memory/raw_ptr.h" #include "components/history_embeddings/history_embeddings_service.h" -#include "components/omnibox/browser/autocomplete_provider.h" +#include "components/omnibox/browser/history_provider.h" class AutocompleteProviderClient; class TemplateURL; class AutocompleteInput; -struct AutocompleteMatch; -class HistoryEmbeddingsProvider : public AutocompleteProvider { +class HistoryEmbeddingsProvider : public HistoryProvider { public: - explicit HistoryEmbeddingsProvider(AutocompleteProviderClient* client, - AutocompleteProviderListener* listener); + HistoryEmbeddingsProvider(AutocompleteProviderClient* client, + AutocompleteProviderListener* listener); // AutocompleteProvider: void Start(const AutocompleteInput& input, bool minimal_changes) override; void Stop(bool clear_cached_results, bool due_to_user_inactivity) override; - void DeleteMatch(const AutocompleteMatch& match) override; private: friend class FakeHistoryEmbeddingsProvider; @@ -39,10 +37,6 @@ // called asyncly after `Start()`, so it's never null when accessed. raw_ptr starter_pack_engine_; - // Never null. Owned by `AutocompleteController`, which also owns this - // provider, ensuring `client_` outlives this. - raw_ptr client_; - // The last search input sent to `HistoryEmbeddingsService::Search()`. std::u16string last_search_input_; diff -Nru chromium-128.0.6613.84/components/omnibox/browser/history_embeddings_provider_unittest.cc chromium-128.0.6613.113/components/omnibox/browser/history_embeddings_provider_unittest.cc --- chromium-128.0.6613.84/components/omnibox/browser/history_embeddings_provider_unittest.cc 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/omnibox/browser/history_embeddings_provider_unittest.cc 2024-08-28 22:39:00.000000000 +0000 @@ -90,15 +90,16 @@ testing::Test::SetUp(); CHECK(history_dir_.CreateUniqueTempDir()); - history_service_ = - history::CreateHistoryService(history_dir_.GetPath(), true); - history_embeddings_service_ = std::make_unique< - testing::NiceMock>( - history_service_.get()); - client_ = std::make_unique(); - client_->set_history_embeddings_service(history_embeddings_service_.get()); - + client_->set_history_service( + history::CreateHistoryService(history_dir_.GetPath(), true)); + client_->set_history_embeddings_service( + std::make_unique>( + client_->GetHistoryService())); + history_embeddings_service_ = static_cast< + testing::NiceMock*>( + client_->GetHistoryEmbeddingsService()); history_embeddings_provider_ = new FakeHistoryEmbeddingsProvider(client_.get(), this); @@ -128,11 +129,9 @@ base::ScopedTempDir history_dir_; base::test::TaskEnvironment task_environment_; - std::unique_ptr history_service_; - std::unique_ptr< - testing::NiceMock> - history_embeddings_service_; std::unique_ptr client_; + raw_ptr> + history_embeddings_service_; scoped_refptr history_embeddings_provider_; // Callbacks created when `Search()` is called. Running a callback with // `string` will simulate `Search()` responding with 1 result with title @@ -312,8 +311,12 @@ } TEST_F(HistoryEmbeddingsProviderTest, DeleteMatch) { - history_embeddings_provider_->DeleteMatch({}); - // `DeleteMatch()` is not implemented yet. Just expect it to not crash. + AutocompleteMatch match(history_embeddings_provider_.get(), 1000, true, + AutocompleteMatchType::HISTORY_EMBEDDINGS); + match.destination_url = GURL{"https://en.wikipedia.org/wiki/Matenadaran"}; + history_embeddings_provider_->matches_.push_back(match); + history_embeddings_provider_->DeleteMatch(match); + EXPECT_TRUE(history_embeddings_provider_->matches_.empty()); } TEST_F(HistoryEmbeddingsProviderTest, @@ -324,13 +327,14 @@ }; history_embeddings_provider_->done_ = false; history_embeddings_provider_->last_search_input_ = u"query"; - history_embeddings_provider_->OnReceivedSearchResult(u"query", result); + history_embeddings_provider_->OnReceivedSearchResult(u"query", + std::move(result)); ASSERT_EQ(history_embeddings_provider_->matches_.size(), 1u); EXPECT_EQ(history_embeddings_provider_->matches_[0].provider.get(), history_embeddings_provider_.get()); EXPECT_EQ(history_embeddings_provider_->matches_[0].relevance, 500); - EXPECT_EQ(history_embeddings_provider_->matches_[0].deletable, false); + EXPECT_EQ(history_embeddings_provider_->matches_[0].deletable, true); EXPECT_EQ(history_embeddings_provider_->matches_[0].type, AutocompleteMatchType::HISTORY_EMBEDDINGS); EXPECT_EQ(history_embeddings_provider_->matches_[0].destination_url.spec(), @@ -361,13 +365,14 @@ }; history_embeddings_provider_->done_ = false; history_embeddings_provider_->last_search_input_ = u"query"; - history_embeddings_provider_->OnReceivedSearchResult(u"query", result); + history_embeddings_provider_->OnReceivedSearchResult(u"query", + std::move(result)); ASSERT_EQ(history_embeddings_provider_->matches_.size(), 1u); EXPECT_EQ(history_embeddings_provider_->matches_[0].provider.get(), history_embeddings_provider_.get()); EXPECT_EQ(history_embeddings_provider_->matches_[0].relevance, 500); - EXPECT_EQ(history_embeddings_provider_->matches_[0].deletable, false); + EXPECT_EQ(history_embeddings_provider_->matches_[0].deletable, true); EXPECT_EQ(history_embeddings_provider_->matches_[0].type, AutocompleteMatchType::HISTORY_EMBEDDINGS); EXPECT_EQ(history_embeddings_provider_->matches_[0].destination_url.spec(), diff -Nru chromium-128.0.6613.84/components/omnibox/browser/omnibox_field_trial.cc chromium-128.0.6613.113/components/omnibox/browser/omnibox_field_trial.cc --- chromium-128.0.6613.84/components/omnibox/browser/omnibox_field_trial.cc 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/omnibox/browser/omnibox_field_trial.cc 2024-08-28 22:39:00.000000000 +0000 @@ -1130,11 +1130,6 @@ return base::FeatureList::IsEnabled(omnibox::kStarterPackExpansion); } -const base::FeatureParam kStarterPackIPHPerSessionLimit( - &omnibox::kStarterPackIPH, - "StarterPackIPHPerSessionLimit", - 3); - bool IsStarterPackIPHEnabled() { return base::FeatureList::IsEnabled(omnibox::kStarterPackIPH); } diff -Nru chromium-128.0.6613.84/components/omnibox/browser/omnibox_field_trial.h chromium-128.0.6613.113/components/omnibox/browser/omnibox_field_trial.h --- chromium-128.0.6613.84/components/omnibox/browser/omnibox_field_trial.h 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/omnibox/browser/omnibox_field_trial.h 2024-08-28 22:39:00.000000000 +0000 @@ -765,10 +765,6 @@ // Whether the expansion pack for the site search starter pack is enabled. bool IsStarterPackExpansionEnabled(); -// The max number of times, per session, the IPH row can be shown. Set to -// INT_MAX for unlimited. -extern const base::FeatureParam kStarterPackIPHPerSessionLimit; - // When true, enables an informational IPH message at the bottom of the Omnibox // directing users to certain starter pack engines. bool IsStarterPackIPHEnabled(); diff -Nru chromium-128.0.6613.84/components/omnibox/browser/omnibox_prefs.cc chromium-128.0.6613.113/components/omnibox/browser/omnibox_prefs.cc --- chromium-128.0.6613.84/components/omnibox/browser/omnibox_prefs.cc 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/omnibox/browser/omnibox_prefs.cc 2024-08-28 22:39:00.000000000 +0000 @@ -52,14 +52,21 @@ registry->RegisterBooleanPref( kShowGoogleLensShortcut, true, user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); - registry->RegisterBooleanPref(omnibox::kShowGeminiIPH, true); + + registry->RegisterBooleanPref(omnibox::kDismissedGeminiIph, false); + registry->RegisterBooleanPref( + omnibox::kDismissedFeaturedEnterpriseSiteSearchIphPrefName, false); registry->RegisterBooleanPref( - omnibox::kShowFeaturedEnterpriseSiteSearchIPHPrefName, true); - registry->RegisterBooleanPref(omnibox::kShowHistoryEmbeddingsSettingsPromo, - true); - registry->RegisterBooleanPref(omnibox::kShowHistoryScopePromo, true); - registry->RegisterBooleanPref(omnibox::kShowHistoryEmbeddingsScopePromo, - true); + omnibox::kDismissedHistoryEmbeddingsSettingsPromo, false); + registry->RegisterBooleanPref(omnibox::kDismissedHistoryScopePromo, false); + registry->RegisterBooleanPref(omnibox::kDismissedHistoryEmbeddingsScopePromo, + false); + + registry->RegisterIntegerPref(kShownCountGeminiIph, 0); + registry->RegisterIntegerPref(kShownCountFeaturedEnterpriseSiteSearchIph, 0); + registry->RegisterIntegerPref(kShownCountHistoryEmbeddingsSettingsPromo, 0); + registry->RegisterIntegerPref(kShownCountHistoryScopePromo, 0); + registry->RegisterIntegerPref(kShownCountHistoryEmbeddingsScopePromo, 0); } SuggestionGroupVisibility GetUserPreferenceForSuggestionGroupVisibility( diff -Nru chromium-128.0.6613.84/components/omnibox/browser/omnibox_prefs.h chromium-128.0.6613.113/components/omnibox/browser/omnibox_prefs.h --- chromium-128.0.6613.84/components/omnibox/browser/omnibox_prefs.h 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/omnibox/browser/omnibox_prefs.h 2024-08-28 22:39:00.000000000 +0000 @@ -94,19 +94,30 @@ inline constexpr char kZeroSuggestCachedResultsWithURL[] = "zerosuggest.cachedresults_with_url"; -// Booleans that specify whether to show the various IPH suggestion at the -// bottom of the Omnibox. These is true until a user deletes (presses the X -// button on) the suggestion. -inline constexpr char kShowGeminiIPH[] = "omnibox.show_gemini_iph"; -inline constexpr char kShowFeaturedEnterpriseSiteSearchIPHPrefName[] = - "omnibox.show_featured_enterprise_search_iph"; -inline constexpr char kShowHistoryEmbeddingsSettingsPromo[] = - "omnibox.show_history_embeddings_settings_promo"; -inline constexpr char kShowHistoryScopePromo[] = - "omnibox.show_history_scope_promo"; -inline constexpr char kShowHistoryEmbeddingsScopePromo[] = - "omnibox.show_history_embeddings_scope_promo"; +// Booleans that specify whether various IPH suggestions have been dismissed. +inline constexpr char kDismissedGeminiIph[] = "omnibox.dismissed_gemini_iph"; +inline constexpr char kDismissedFeaturedEnterpriseSiteSearchIphPrefName[] = + "omnibox.dismissed_featured_enterprise_search_iph"; +inline constexpr char kDismissedHistoryEmbeddingsSettingsPromo[] = + "omnibox.dismissed_history_embeddings_settings_promo"; +inline constexpr char kDismissedHistoryScopePromo[] = + "omnibox.dismissed_history_scope_promo"; +inline constexpr char kDismissedHistoryEmbeddingsScopePromo[] = + "omnibox.dismissed_history_embeddings_scope_promo"; +// How many times the various IPH suggestions were shown. +inline constexpr char kShownCountGeminiIph[] = "omnibox.shown_count_gemini_iph"; +inline constexpr char kShownCountFeaturedEnterpriseSiteSearchIph[] = + "omnibox.shown_count_featured_enterprise_search_iph"; +inline constexpr char kShownCountHistoryEmbeddingsSettingsPromo[] = + "omnibox.shown_count_history_embeddings_settings_promo"; +inline constexpr char kShownCountHistoryScopePromo[] = + "omnibox.shown_count_history_scope_promo"; +inline constexpr char kShownCountHistoryEmbeddingsScopePromo[] = + "omnibox.shown_count_history_embeddings_scope_promo"; + +// Many of the prefs defined above are registered locally where they're used. +// New prefs should be added here and ordered the same as they're defined above. void RegisterProfilePrefs(PrefRegistrySimple* registry); // Returns the stored visibility preference for |suggestion_group_id|. diff -Nru chromium-128.0.6613.84/components/omnibox_strings.grdp chromium-128.0.6613.113/components/omnibox_strings.grdp --- chromium-128.0.6613.84/components/omnibox_strings.grdp 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/omnibox_strings.grdp 2024-08-28 22:39:00.000000000 +0000 @@ -292,6 +292,9 @@ Dismiss Chrome Tip button, press Enter to dismiss, $1Type @gemini to Chat with Gemini + + Dismiss Chrome Tip button, press Enter to dismiss + diff -Nru chromium-128.0.6613.84/components/omnibox_strings_grdp/IDS_ACC_DISMISS_CHROME_TIP_BUTTON.png.sha1 chromium-128.0.6613.113/components/omnibox_strings_grdp/IDS_ACC_DISMISS_CHROME_TIP_BUTTON.png.sha1 --- chromium-128.0.6613.84/components/omnibox_strings_grdp/IDS_ACC_DISMISS_CHROME_TIP_BUTTON.png.sha1 1970-01-01 00:00:00.000000000 +0000 +++ chromium-128.0.6613.113/components/omnibox_strings_grdp/IDS_ACC_DISMISS_CHROME_TIP_BUTTON.png.sha1 2024-08-28 22:39:00.000000000 +0000 @@ -0,0 +1 @@ +5b15a0a0cb4da1e69e40acab623024a878f33aa7 \ No newline at end of file diff -Nru chromium-128.0.6613.84/components/os_crypt/sync/BUILD.gn chromium-128.0.6613.113/components/os_crypt/sync/BUILD.gn --- chromium-128.0.6613.84/components/os_crypt/sync/BUILD.gn 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/os_crypt/sync/BUILD.gn 2024-08-28 22:39:00.000000000 +0000 @@ -65,7 +65,7 @@ "os_crypt_linux.cc", ] - if (use_glib) { + if (use_glib && use_dbus) { sources += [ "key_storage_libsecret.cc", "key_storage_libsecret.h", diff -Nru chromium-128.0.6613.84/components/os_crypt/sync/libsecret_util_linux.cc chromium-128.0.6613.113/components/os_crypt/sync/libsecret_util_linux.cc --- chromium-128.0.6613.84/components/os_crypt/sync/libsecret_util_linux.cc 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/os_crypt/sync/libsecret_util_linux.cc 2024-08-28 22:39:00.000000000 +0000 @@ -9,6 +9,10 @@ #include "base/check_op.h" #include "base/logging.h" #include "base/strings/string_number_conversions.h" +#include "dbus/bus.h" +#include "dbus/message.h" +#include "dbus/object_path.h" +#include "dbus/object_proxy.h" // // LibsecretLoader @@ -23,6 +27,82 @@ "dummy entry to guarantee that this keyring was properly unlocked. More " "details at http://crbug.com/660005."; +// gnome-keyring-daemon has a bug that causes libsecret to deadlock on startup. +// This function checks for the deadlock condition. See [1] for a more detailed +// explanation of the issue. +// [1] https://chromium-review.googlesource.com/c/chromium/src/+/5787619 +bool CanUseLibsecret() { + constexpr char kSecretsName[] = "org.freedesktop.secrets"; + constexpr char kSecretsPath[] = "/org/freedesktop/secrets"; + constexpr char kSecretServiceInterface[] = "org.freedesktop.Secret.Service"; + constexpr char kSecretCollectionInterface[] = + "org.freedesktop.Secret.Collection"; + constexpr char kReadAliasMethod[] = "ReadAlias"; + + dbus::Bus::Options bus_options; + bus_options.bus_type = dbus::Bus::SESSION; + bus_options.connection_type = dbus::Bus::PRIVATE; + auto bus = base::MakeRefCounted(bus_options); + + dbus::ObjectProxy* bus_proxy = + bus->GetObjectProxy(DBUS_SERVICE_DBUS, dbus::ObjectPath(DBUS_PATH_DBUS)); + dbus::MethodCall name_has_owner_call(DBUS_INTERFACE_DBUS, "NameHasOwner"); + dbus::MessageWriter name_has_owner_writer(&name_has_owner_call); + name_has_owner_writer.AppendString(kSecretsName); + auto name_has_owner_response = bus_proxy->CallMethodAndBlock( + &name_has_owner_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT); + + if (!name_has_owner_response.has_value()) { + // gnome-keyring-daemon is not running. + return true; + } + dbus::MessageReader name_has_owner_reader( + name_has_owner_response.value().get()); + bool owned = false; + if (!name_has_owner_reader.PopBool(&owned) || !owned) { + // gnome-keyring-daemon is not running. + return true; + } + + auto* secrets_proxy = + bus->GetObjectProxy(kSecretsName, dbus::ObjectPath(kSecretsPath)); + dbus::MethodCall read_alias_call(kSecretServiceInterface, kReadAliasMethod); + dbus::MessageWriter read_alias_writer(&read_alias_call); + read_alias_writer.AppendString("default"); + auto read_alias_response = secrets_proxy->CallMethodAndBlock( + &read_alias_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT); + if (!read_alias_response.has_value()) { + // libsecret will create the default keyring. + return true; + } + dbus::MessageReader read_alias_reader(read_alias_response->get()); + dbus::ObjectPath default_object_path; + if (!read_alias_reader.PopObjectPath(&default_object_path) || + default_object_path == dbus::ObjectPath("/")) { + // libsecret will create the default keyring. + return true; + } + + auto* default_proxy = bus->GetObjectProxy(kSecretsName, default_object_path); + dbus::MethodCall get_property_call(DBUS_INTERFACE_PROPERTIES, "Get"); + dbus::MessageWriter get_property_writer(&get_property_call); + get_property_writer.AppendString(kSecretCollectionInterface); + get_property_writer.AppendString("Label"); + auto get_property_response = default_proxy->CallMethodAndBlock( + &get_property_call, dbus::ObjectProxy::TIMEOUT_USE_DEFAULT); + + // If the default keyring doesn't have an object path, then libsecret will + // deadlock trying to create it and prevent startup. + const bool can_use_libsecret = get_property_response.has_value(); + if (!can_use_libsecret) { + LOG(ERROR) << "Not using libsecret to avoid deadlock. Please restart " + "gnome-keyring-daemon or reboot. The next time you launch, " + "any keys stored in the plaintext backend will be migrated " + "to the libsecret backend."; + } + return can_use_libsecret; +} + } // namespace decltype( @@ -91,7 +171,7 @@ // static bool LibsecretLoader::EnsureLibsecretLoaded() { - return LoadLibsecret() && LibsecretIsAvailable(); + return CanUseLibsecret() && LoadLibsecret() && LibsecretIsAvailable(); } // static diff -Nru chromium-128.0.6613.84/components/performance_manager/features.cc chromium-128.0.6613.113/components/performance_manager/features.cc --- chromium-128.0.6613.84/components/performance_manager/features.cc 2024-08-21 22:46:15.000000000 +0000 +++ chromium-128.0.6613.113/components/performance_manager/features.cc 2024-08-28 22:39:00.000000000 +0000 @@ -17,7 +17,12 @@ BASE_FEATURE(kRunOnMainThreadSync, "RunPerformanceManagerOnMainThreadSync", - base::FEATURE_ENABLED_BY_DEFAULT); +#if BUILDFLAG(IS_CHROMEOS) + base::FEATURE_DISABLED_BY_DEFAULT +#else + base::FEATURE_ENABLED_BY_DEFAULT +#endif +); #if !BUILDFLAG(IS_ANDROID) BASE_FEATURE(kBackgroundTabLoadingFromPerformanceManager, diff -Nru chromium-128.0.6613.84/components/remote_cocoa/app_shim/native_widget_mac_nswindow.mm chromium-128.0.6613.113/components/remote_cocoa/app_shim/native_widget_mac_nswindow.mm --- chromium-128.0.6613.84/components/remote_cocoa/app_shim/native_widget_mac_nswindow.mm 2024-08-21 22:46:16.000000000 +0000 +++ chromium-128.0.6613.113/components/remote_cocoa/app_shim/native_widget_mac_nswindow.mm 2024-08-28 22:39:00.000000000 +0000 @@ -168,43 +168,8 @@ } @end -@implementation NativeWidgetMacNSWindowBorderlessFrame { - @private - base::debug::StackTrace _initStackTrace; - NSUInteger _initStyleMask; -} +@implementation NativeWidgetMacNSWindowBorderlessFrame -// TODO(crbug.com/348713769): remove after debug. -- (instancetype)initWithFrame:(NSRect)frame - styleMask:(NSUInteger)styleMask - owner:(id)owner { - _initStackTrace = base::debug::StackTrace(); - _initStyleMask = styleMask; - return [super initWithFrame:frame styleMask:styleMask owner:owner]; -} -- (void)_surrenderToolbarViewForFullScreenWindow { - static crash_reporter::CrashKeyString<1024> initStackTraceKey( - "NativeWidgetMacNSWindowBorderlessFrame_initStackTrace"); - static crash_reporter::CrashKeyString<11> initStyleMaskKey( - "NativeWidgetMacNSWindowBorderlessFrame_initStyleMask"); - static crash_reporter::CrashKeyString<11> currentStyleMaskKey( - "NativeWidgetMacNSWindowBorderlessFrame_currentStyleMask"); - static crash_reporter::CrashKeyString<11> collectionBehaviorKey( - "NativeWidgetMacNSWindowBorderlessFrame_collectionBehavior"); - static crash_reporter::CrashKeyString<1024> windowDebugDescriptionKey( - "NativeWidgetMacNSWindowBorderlessFrame_windowDebugDescription"); - static crash_reporter::CrashKeyString<5> initHasParentWindowKey( - "NativeWidgetMacNSWindowBorderlessFrame_hasParentWindow"); - crash_reporter::SetCrashKeyStringToStackTrace(&initStackTraceKey, - _initStackTrace); - initStyleMaskKey.Set(base::NumberToString(_initStyleMask)); - currentStyleMaskKey.Set(base::NumberToString(self.window.styleMask)); - collectionBehaviorKey.Set( - base::NumberToString(self.window.collectionBehavior)); - windowDebugDescriptionKey.Set(self.window.debugDescription.UTF8String); - initHasParentWindowKey.Set(self.window.parentWindow ? "true" : "false"); - NOTREACHED(); -} - (void)mouseDown:(NSEvent*)event { [self cr_mouseDownOnFrameView:event]; [super mouseDown:event]; diff -Nru chromium-128.0.6613.84/components/soda/soda_installer.cc chromium-128.0.6613.113/components/soda/soda_installer.cc --- chromium-128.0.6613.84/components/soda/soda_installer.cc 2024-08-21 22:46:16.000000000 +0000 +++ chromium-128.0.6613.113/components/soda/soda_installer.cc 2024-08-28 22:39:01.000000000 +0000 @@ -5,6 +5,7 @@ #include "components/soda/soda_installer.h" #include +#include #include "base/containers/contains.h" #include "base/feature_list.h" @@ -132,6 +133,11 @@ base::Time::Now() + base::Days(kSodaCleanUpDelayInDays)); } +std::string SodaInstaller::GetLanguageDlcNameForLocale( + const std::string& locale) const { + return std::string(); +} + bool SodaInstaller::IsSodaInstalled(LanguageCode language_code) const { return (soda_binary_installed_ && IsLanguageInstalled(language_code)); } diff -Nru chromium-128.0.6613.84/components/soda/soda_installer.h chromium-128.0.6613.113/components/soda/soda_installer.h --- chromium-128.0.6613.84/components/soda/soda_installer.h 2024-08-21 22:46:16.000000000 +0000 +++ chromium-128.0.6613.113/components/soda/soda_installer.h 2024-08-28 22:39:01.000000000 +0000 @@ -6,6 +6,7 @@ #define COMPONENTS_SODA_SODA_INSTALLER_H_ #include +#include #include "base/component_export.h" #include "base/containers/flat_map.h" @@ -99,6 +100,11 @@ // (in BCP-47 format). virtual std::vector GetAvailableLanguages() const = 0; + // Get the name of language DLC for a certain locale. This is currently only + // being used in `SodaInstallerImplChromeOS`. + virtual std::string GetLanguageDlcNameForLocale( + const std::string& locale) const; + // Returns whether or not SODA and the given language pack are installed on // this device. Will return a stale value until InstallSoda() and // InstallLanguage() have run and asynchronously returned an answer. diff -Nru chromium-128.0.6613.84/components/soda/soda_installer_impl_chromeos.cc chromium-128.0.6613.113/components/soda/soda_installer_impl_chromeos.cc --- chromium-128.0.6613.84/components/soda/soda_installer_impl_chromeos.cc 2024-08-21 22:46:16.000000000 +0000 +++ chromium-128.0.6613.113/components/soda/soda_installer_impl_chromeos.cc 2024-08-28 22:39:01.000000000 +0000 @@ -309,6 +309,17 @@ return languages; } +std::string SodaInstallerImplChromeOS::GetLanguageDlcNameForLocale( + const std::string& locale) const { + const auto& language_info = available_languages_.find(locale); + if (language_info == available_languages_.end()) { + LOG(DFATAL) << "Asked for unavailable language " << locale; + return std::string(); + } + + return language_info->second.dlc_name; +} + void SodaInstallerImplChromeOS::UninstallSoda(PrefService* global_prefs) { soda_binary_installed_ = false; SetSodaBinaryPath(base::FilePath()); diff -Nru chromium-128.0.6613.84/components/soda/soda_installer_impl_chromeos.h chromium-128.0.6613.113/components/soda/soda_installer_impl_chromeos.h --- chromium-128.0.6613.84/components/soda/soda_installer_impl_chromeos.h 2024-08-21 22:46:16.000000000 +0000 +++ chromium-128.0.6613.113/components/soda/soda_installer_impl_chromeos.h 2024-08-28 22:39:01.000000000 +0000 @@ -42,6 +42,8 @@ void UninstallLanguage(const std::string& language, PrefService* global_prefs) override; std::vector GetAvailableLanguages() const override; + std::string GetLanguageDlcNameForLocale( + const std::string& locale) const override; private: // SodaInstaller: diff -Nru chromium-128.0.6613.84/components/strings/components_strings_be.xtb chromium-128.0.6613.113/components/strings/components_strings_be.xtb --- chromium-128.0.6613.84/components/strings/components_strings_be.xtb 2024-08-21 22:46:16.000000000 +0000 +++ chromium-128.0.6613.113/components/strings/components_strings_be.xtb 2024-08-28 22:39:01.000000000 +0000 @@ -543,7 +543,7 @@ Мультымедыйныя даныя Калі напісанне правільнае, паспрабуйце запусціць дыягностыку падключэнняў. JIS B3 -Сайт запытвае дазволу захоўваць вялікі аб'ём даных на лакальным камп'ютары +Сайт запытвае дазволу захоўваць вялікі аб’ём даных на лакальным камп’ютары Лёгкая папера Бясплатнае і ўмоўна-бясплатнае праграмнае забеспячэнне {COUNT,plural, =1{і яшчэ 1}one{і яшчэ #}few{і яшчэ #}many{і яшчэ #}other{і яшчэ #}} @@ -1009,7 +1009,7 @@ Машыннае навучанне і штучны інтэлект Ідэнтыфікатар карыстальніка ўліковага запісу задання Жароўні для барбекю і рашоткі грыль - звычайна выкарыстоўвае шыфраванне для абароны вашай інфармацыі. Пры спробе Chrome падключыцца да , вэб-сайт адправіў незнаёмыя і няправільныя ўліковыя даныя. Гэта можа адбывацца, калі зламыснік спрабуе выдаць сябе за , або экран уваходу ў сетцы Wi-Fi перарваў падключэнне. Ваша інфармацыя ўсё роўна абаронена, паколькі Chrome перарваў падключэнне да абмену данымі. + звычайна выкарыстоўвае шыфраванне для абароны вашай інфармацыі. Пры спробе Chrome падключыцца да вэб-сайт адправіў незвычайныя і няправільныя ўліковыя даныя. Такое адбываецца, калі зламыснік спрабуе выдаць сябе за або экран уваходу ў сетку Wi-Fi перарывае падключэнне. Ваша інфармацыя ўсё роўна абаронена, паколькі Chrome перарваў падключэнне да абмену данымі. Час збою: Маляванне Закрыйце іншыя праграмы. @@ -3403,7 +3403,7 @@ Пацвердзіце сваю асобу, каб запоўніць плацежную інфармацыю ў Chromium. Дадаць кантактную інфармацыю Даступна для прагляду ў пазасеткавым рэжыме -Няправільны суб'ект палітыкі +Няправільны суб’ект палітыкі Ежа для гурманаў Светла-аранжавы Гэты сайт заблакіраваны @@ -4284,7 +4284,7 @@ . Каб зрабіць Chrome стандартным браўзерам сістэмы ў наладах iOS, націсніце Tab, затым Увод Рух і выкарыстанне камер () Латок 1 - звычайна выкарыстоўвае шыфраванне для абароны вашай інфармацыі. Пры спробе Chromium падключыцца да , вэб-сайт адправіў незнаёмыя і няправільныя ўліковыя даныя. Гэта можа адбывацца, калі зламыснік спрабуе выдаць сябе за , або экран уваходу ў сетцы Wi-Fi перарваў падключэнне. Ваша інфармацыя ўсё роўна абаронена, паколькі Chromium перарваў падключэнне да абмену данымі. + звычайна выкарыстоўвае шыфраванне для абароны вашай інфармацыі. Пры спробе Chromium падключыцца да вэб-сайт адправіў незвычайныя і няправільныя ўліковыя даныя. Такое адбываецца, калі зламыснік спрабуе выдаць сябе за або экран уваходу ў сетку Wi-Fi перарывае падключэнне. Ваша інфармацыя ўсё роўна абаронена, паколькі Chromium перарваў падключэнне да абмену данымі. Браўзерам кіруе . Згодна з палітыкай, зададзенай адміністратарам, не можа выкарыстоўвацца для абагульвання экрана, калі на ім паказваецца прыватнае змесціва. Пацвярджаюцца даныя карткі... diff -Nru chromium-128.0.6613.84/components/strings/components_strings_el.xtb chromium-128.0.6613.113/components/strings/components_strings_el.xtb --- chromium-128.0.6613.84/components/strings/components_strings_el.xtb 2024-08-21 22:46:16.000000000 +0000 +++ chromium-128.0.6613.113/components/strings/components_strings_el.xtb 2024-08-28 22:39:01.000000000 +0000 @@ -3487,7 +3487,7 @@ Εξοπλισμός χειμερινών σπορ Κατάργηση κουμπιού Πρόταση, πατήστε Enter για κατάργηση αυτής της πρότασης. Κινητά Τηλέφωνα -Κάντε γρήγορες πληρωμές σε ιστότοπους και εφαρμογές σε διαφορετικές συσκευές χρησιμοποιώντας κάρτες που έχετε αποθηκεύσει στο Google. +Κάντε γρήγορες πληρωμές σε ιστότοπους και εφαρμογές σε διαφορετικές συσκευές χρησιμοποιώντας κάρτες που έχετε αποθηκεύσει στην Google. Άγνωστη μεταβλητή στη διαχειριζόμενη διαμόρφωση της εφαρμογής . Πλευρά 2 μετατόπιση εικόνας στον άξονα Y Γρήγορη δημιουργία νέου συμβάντος στο Ημερολόγιο Google diff -Nru chromium-128.0.6613.84/components/strings/components_strings_en-GB.xtb chromium-128.0.6613.113/components/strings/components_strings_en-GB.xtb --- chromium-128.0.6613.84/components/strings/components_strings_en-GB.xtb 2024-08-21 22:46:16.000000000 +0000 +++ chromium-128.0.6613.113/components/strings/components_strings_en-GB.xtb 2024-08-28 22:39:01.000000000 +0000 @@ -1436,7 +1436,7 @@ Most sites should work as expected Learn more Turn on Bluetooth -When turned off, you may be asked occasionally to verify for security purposes +When turned off, you may occasionally be asked to verify for security purposes Allow resizing? Error at : Networking Equipment @@ -2357,7 +2357,7 @@ This page can’t be found Bad policy timestamp Never show -Manually verify every time that you pay using autofill +Verify manually every time that you pay using autofill Invalid {CONTACT,plural, =0{}=1{ and more}other{ and more}} Finding devices… @@ -3423,7 +3423,7 @@ Form is not secure Provide reason for copying (required) Provide reason for transferring (required) -No Thanks +No, thanks Forward Envelope Italian School Supplies and Classroom Equipment @@ -3624,7 +3624,7 @@ No, thanks Status Close tip -To pay faster next time, save your card, and security code to your device +To pay faster next time, save your card and encrypted security code to your device Mir Remove form suggestion from Chrome? Share clipboard? diff -Nru chromium-128.0.6613.84/components/strings/components_strings_es.xtb chromium-128.0.6613.113/components/strings/components_strings_es.xtb --- chromium-128.0.6613.84/components/strings/components_strings_es.xtb 2024-08-21 22:46:16.000000000 +0000 +++ chromium-128.0.6613.113/components/strings/components_strings_es.xtb 2024-08-28 22:39:01.000000000 +0000 @@ -3599,7 +3599,7 @@ Rollo principal Puede que el cortafuegos o el software antivirus hayan bloqueado la conexión. Controlar y reprogramar MIDI -Opcionales +Opcional Obsoleta ¿Permitir cámara? El certificado del servidor no coincide con la URL. diff -Nru chromium-128.0.6613.84/components/strings/components_strings_fr.xtb chromium-128.0.6613.113/components/strings/components_strings_fr.xtb --- chromium-128.0.6613.84/components/strings/components_strings_fr.xtb 2024-08-21 22:46:16.000000000 +0000 +++ chromium-128.0.6613.113/components/strings/components_strings_fr.xtb 2024-08-28 22:39:01.000000000 +0000 @@ -3557,7 +3557,7 @@ Métal Bouton "Supprimer les données de navigation" à activer pour supprimer votre historique de navigation et les cookies, vider le cache et plus dans les paramètres Chrome {0,plural, =1{ a été bloqué en raison des règles}one{ fichier a été bloqué en raison des règles}other{ fichiers ont été bloqués en raison des règles}} -Saisir automatiquement les informations correspondant aux modes de paiement enregistrés +Les informations correspondant aux modes de paiement enregistrés sont automatiquement renseignées Délai de nouvelle tentative Oufuku Hagaki (carte postale) Ordre des pages reçu @@ -3671,7 +3671,7 @@ DOM Distiller Le code CVC de cette carte sera chiffré et enregistré sur votre appareil pour accélérer le paiement Date d'expiration : -Affichez les récompenses et avantages disponibles de vos cartes lors du paiement En savoir plus sur les avantages des cartes +Affichez les récompenses et avantages disponibles de vos cartes lors du paiement. En savoir plus sur les avantages des cartes Le certificat du serveur n'est pas encore valide. Enveloppe Chou 4 Bonbons et sucreries diff -Nru chromium-128.0.6613.84/components/strings/components_strings_it.xtb chromium-128.0.6613.113/components/strings/components_strings_it.xtb --- chromium-128.0.6613.84/components/strings/components_strings_it.xtb 2024-08-21 22:46:16.000000000 +0000 +++ chromium-128.0.6613.113/components/strings/components_strings_it.xtb 2024-08-28 22:39:01.000000000 +0000 @@ -2025,7 +2025,7 @@ I prezzi tipici si basano sui negozi disponibili sul web negli ultimi 90 giorni. , premi Tab e poi Invio per creare rapidamente un nuovo foglio Google fotocamera e microfono -Elimina tessera +Elimina carta Carta per imagesetter Attiva gli avvisi BBQ e grigliate diff -Nru chromium-128.0.6613.84/components/strings/components_strings_ja.xtb chromium-128.0.6613.113/components/strings/components_strings_ja.xtb --- chromium-128.0.6613.84/components/strings/components_strings_ja.xtb 2024-08-21 22:46:16.000000000 +0000 +++ chromium-128.0.6613.113/components/strings/components_strings_ja.xtb 2024-08-28 22:39:01.000000000 +0000 @@ -1061,7 +1061,7 @@ ウェブサイトとの共有 デフォルトの検索エンジンとサイト内検索を管理します では HSTS が使用されているため、現在アクセスできません。通常、ネットワーク エラーやネットワークへの攻撃は一時的なものです。しばらくするとページにアクセスできるようになります。 -Chrome でお支払い情報を入力できるよう、本人確認を行ってください。 +Chrome がお支払い情報を入力できるよう、本人確認を行ってください。 ファイルサイズ: ハッチバック 給紙トレイのメディアを確認してください diff -Nru chromium-128.0.6613.84/components/strings/components_strings_ko.xtb chromium-128.0.6613.113/components/strings/components_strings_ko.xtb --- chromium-128.0.6613.84/components/strings/components_strings_ko.xtb 2024-08-21 22:46:16.000000000 +0000 +++ chromium-128.0.6613.113/components/strings/components_strings_ko.xtb 2024-08-28 22:39:01.000000000 +0000 @@ -2850,7 +2850,7 @@ 봉투 You 4 일부 공격자는 사이트의 URL을 알아채기 어려울 정도로 약간만 변경하여 다른 사이트를 모방합니다. 피트니스 용품 및 관련 액세서리 -카드 명의 +카드 소유자 이름 Z 폴드 하프 여러 부분의 양식 일치하는 결제 사용자 인증 정보 시트가 없는 보안 결제 사용자 인증 정보 닫힘 diff -Nru chromium-128.0.6613.84/components/strings/components_strings_nl.xtb chromium-128.0.6613.113/components/strings/components_strings_nl.xtb --- chromium-128.0.6613.84/components/strings/components_strings_nl.xtb 2024-08-21 22:46:16.000000000 +0000 +++ chromium-128.0.6613.113/components/strings/components_strings_nl.xtb 2024-08-28 22:39:01.000000000 +0000 @@ -632,7 +632,7 @@ Economisch nieuws Betaling annuleren Muziekinstrumenten -Pas toevoegen +Kaart toevoegen Vandaag Verbinding is niet beveiligd Applicaties @@ -995,7 +995,7 @@ A1 Geldig tot . je schermvergrendeling te gebruiken om wachtwoorden in te vullen -Pas opslaan? +Kaart opslaan? 4-luik gesloten luikvouw Je zoekmachine in Chrome 4e rol @@ -3664,7 +3664,7 @@ DOM Distiller De CVC van deze kaart wordt versleuteld en opgeslagen op je apparaat zodat je sneller kunt betalen Verloopt op -Toon bij het afrekenen welke beloningen en voordelen beschikbaar zijn voor je kaarten Meer informatie over kaartvoordelen +Toon bij het afrekenen welke beloningen en voordelen beschikbaar zijn voor je kaarten. Meer informatie over kaartvoordelen Het servercertificaat is nog niet geldig. Envelop Chou 4 Snoep en zoetigheden @@ -4166,7 +4166,7 @@ Antiek en verzamelobjecten Pas de vormgeving van je browser aan Sta cookies van derden tijdelijk toe. Dit betekent dat je minder browserbeveiliging hebt, maar dat sitefuncties waarschijnlijk wel werken zoals verwacht. -Geef een geldig kaartnummer op +Voer een geldig kaartnummer in Vissen kan niet worden ingesteld op Kan geen vertrouwelijke content opnemen diff -Nru chromium-128.0.6613.84/components/strings/components_strings_pt-BR.xtb chromium-128.0.6613.113/components/strings/components_strings_pt-BR.xtb --- chromium-128.0.6613.84/components/strings/components_strings_pt-BR.xtb 2024-08-21 22:46:16.000000000 +0000 +++ chromium-128.0.6613.113/components/strings/components_strings_pt-BR.xtb 2024-08-28 22:39:01.000000000 +0000 @@ -3624,7 +3624,7 @@ Agora não Status Fechar dica -Para agilizar o pagamento na próxima vez, salve o cartão e o código de segurança criptografado no seu dispositivo +Para agilizar os próximos pagamentos, salve o cartão e o código de segurança criptografado no dispositivo Mir Remover sugestão de formulário do Chrome? Compartilhar área de transferência? diff -Nru chromium-128.0.6613.84/components/strings/components_strings_te.xtb chromium-128.0.6613.113/components/strings/components_strings_te.xtb --- chromium-128.0.6613.84/components/strings/components_strings_te.xtb 2024-08-21 22:46:16.000000000 +0000 +++ chromium-128.0.6613.113/components/strings/components_strings_te.xtb 2024-08-28 22:39:01.000000000 +0000 @@ -3439,7 +3439,7 @@ పిల్లులు మీరు ఉపయోగిస్తున్న Wi-Fiకు మీరును సందర్శించడం అవసరం. ఈ పాలసీని "ఒప్పు", 'తప్పనిసరి'కి సెట్ చేయడం సాధ్యం కాదు, కాబట్టి దీన్ని 'సిఫార్సు చేయబడింది'కి మార్చాము. -డౌన్‌లోడ్ చేయి +డౌన్‌లోడ్ చేయండి కఠినమైన దారుల్లో వెళ్లగల వాహనాలు ఎన్వలప్ C10 వెబ్ అడ్రస్‌కు వెబ్‌పేజీ కనుగొనబడలేదు: @@ -3687,7 +3687,7 @@ ఎగువ భాగంలో కుట్టిన అంచు స్వయంగా అడగండి మొబైల్ బుక్‌మార్క్‌లు -ఎప్పుడూ లేదు +ఎప్పుడూ వద్దు ప్లాట్‌ఫామ్ మెషీన్ ఉద్యోగ ఖాతా రకం మ్యూచువల్ ఫండ్‌లు @@ -3978,7 +3978,7 @@ ప్రతిస్పందించడానికి చాలా ఎక్కువ సమయం పట్టింది. పుట్టినరోజులు & నామకరణ రోజులు Chrome పాస్‌వర్డ్‌లు -యూజర్‌పేరు +యూజర్‌నేమ్ కంప్యూటర్ హార్డ్‌వేర్ ఆదేశ పంక్తి శోధన చిహ్నం diff -Nru chromium-128.0.6613.84/components/strings/components_strings_vi.xtb chromium-128.0.6613.113/components/strings/components_strings_vi.xtb --- chromium-128.0.6613.84/components/strings/components_strings_vi.xtb 2024-08-21 22:46:16.000000000 +0000 +++ chromium-128.0.6613.113/components/strings/components_strings_vi.xtb 2024-08-28 22:39:01.000000000 +0000 @@ -3599,7 +3599,7 @@ Cuộn chính Tường lửa hoặc phần mềm diệt vi-rút có thể đã chặn kết nối. Lập trình lại và điều khiển thiết bị MIDI -Tùy chọn +Không bắt buộc Không dùng nữa Cho phép dùng máy ảnh? Chứng chỉ của máy chủ không phù hợp với URL. diff -Nru chromium-128.0.6613.84/components/strings/components_strings_zh-CN.xtb chromium-128.0.6613.113/components/strings/components_strings_zh-CN.xtb --- chromium-128.0.6613.84/components/strings/components_strings_zh-CN.xtb 2024-08-21 22:46:16.000000000 +0000 +++ chromium-128.0.6613.113/components/strings/components_strings_zh-CN.xtb 2024-08-28 22:39:01.000000000 +0000 @@ -1061,7 +1061,7 @@ 与网站分享 管理您的默认搜索引擎和网站搜索 您目前无法访问 ,因为此网站使用了 HSTS。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复正常。 -验证您的身份,以便 Chrome 能填充您的付款信息。 +您需要验证身份,Chrome 才能填充您的付款信息。 文件大小: 掀背车 检查进纸匣媒体 @@ -1266,7 +1266,7 @@ 验证您的购买交易 当前优先级顺序 贵组织不允许您查看此网站 -付款方式 +支付方式 递送地址 文件修改 网址格式“”中指定了路径。此键不支持路径。请移除该路径,然后重试。例如 *://example.com/ => *://example.com @@ -4380,7 +4380,7 @@ 更实用的广告 离线 医药与生物技术 -付款方式 +支付方式 <p>如果您的计算机或移动设备的日期与时间不准确,您就会看到这条错误消息。</p> <p>要修正该错误,请打开您设备的时钟,并确保日期与时间正确无误。</p> 您已向 授予使用期限 diff -Nru chromium-128.0.6613.84/components/viz/service/display/resolved_frame_data.cc chromium-128.0.6613.113/components/viz/service/display/resolved_frame_data.cc --- chromium-128.0.6613.84/components/viz/service/display/resolved_frame_data.cc 2024-08-21 22:46:17.000000000 +0000 +++ chromium-128.0.6613.113/components/viz/service/display/resolved_frame_data.cc 2024-08-28 22:39:02.000000000 +0000 @@ -367,7 +367,8 @@ } const CompositorFrameMetadata& ResolvedFrameData::GetMetadata() const { - CHECK(valid_); + // TODO(crbug.com/354664676): Add back CHECK(valid_) once this is only called + // for valid frames. return surface_->GetActiveFrameMetadata(); } diff -Nru chromium-128.0.6613.84/content/browser/service_worker/embedded_worker_instance.cc chromium-128.0.6613.113/content/browser/service_worker/embedded_worker_instance.cc --- chromium-128.0.6613.84/content/browser/service_worker/embedded_worker_instance.cc 2024-08-21 22:46:18.000000000 +0000 +++ chromium-128.0.6613.113/content/browser/service_worker/embedded_worker_instance.cc 2024-08-28 22:39:03.000000000 +0000 @@ -1138,7 +1138,16 @@ owner_version_->cross_origin_embedder_policy(); const network::DocumentIsolationPolicy* dip = owner_version_->document_isolation_policy(); - CHECK(coep && dip); + // Prior to PlzServiceWorker launch, the COEP and/or DIP headers might not be + // known initially. The in-flight CacheStorage requests are kept until the + // main script has loaded the headers and the COEP one is known. + // Now that PlzServiceWorker is fully launched, this _should_ no longer be + // necessary, but crbug.com/352690275 suggests otherwise. + // TODO(crbug.com/352690275): Replace with CHECK once behavior causing missing + // headers is better understood. + if (!coep || !dip) { + return; + } for (auto& request : pending_cache_storage_requests_) { mojo::PendingRemote diff -Nru chromium-128.0.6613.84/content/browser/webid/digital_credentials/digital_identity_request_impl.cc chromium-128.0.6613.113/content/browser/webid/digital_credentials/digital_identity_request_impl.cc --- chromium-128.0.6613.84/content/browser/webid/digital_credentials/digital_identity_request_impl.cc 2024-08-21 22:46:18.000000000 +0000 +++ chromium-128.0.6613.113/content/browser/webid/digital_credentials/digital_identity_request_impl.cc 2024-08-28 22:39:03.000000000 +0000 @@ -33,6 +33,9 @@ namespace content { namespace { +constexpr char kOpenid4vpProtocol[] = "openid4vp"; +constexpr char kPreviewProtocol[] = "preview"; + constexpr char kMdlDocumentType[] = "org.iso.18013.5.1.mDL"; constexpr char kOpenid4vpPathRegex[] = @@ -78,13 +81,9 @@ std::end(kDataElementsCanBypassInterstitial); } -// Returns whether an interstitial should be shown based on the assertions being -// requested. -bool CanRequestCredentialBypassInterstitial(const base::Value& request) { - if (!request.is_dict()) { - return false; - } - +bool CanRequestCredentialBypassInterstitialForOpenid4vpProtocol( + const base::Value& request) { + CHECK(request.is_dict()); const base::Value::Dict& request_dict = request.GetDict(); const base::Value::Dict* presentation_dict = request_dict.FindDict("presentation_definition"); @@ -133,6 +132,66 @@ CanMdocDataElementBypassInterstitial(mdoc_data_element); } +bool CanRequestCredentialBypassInterstitialForPreviewProtocol( + const base::Value& request) { + CHECK(request.is_dict()); + const base::Value::Dict& request_dict = request.GetDict(); + const base::Value::Dict* selector_dict = request_dict.FindDict("selector"); + if (!selector_dict) { + return false; + } + + const std::string* doctype = selector_dict->FindString("doctype"); + if (!doctype || *doctype != kMdlDocumentType) { + return false; + } + + const base::Value::List* fields_list = selector_dict->FindList("fields"); + if (!fields_list || fields_list->size() != 1u) { + return false; + } + + const base::Value::Dict* field_dict = fields_list->front().GetIfDict(); + if (!field_dict) { + return false; + } + const std::string* mdoc_data_element = field_dict->FindString("name"); + return mdoc_data_element && + CanMdocDataElementBypassInterstitial(*mdoc_data_element); +} + +// Returns whether an interstitial should be shown based on the assertions being +// requested. +bool CanRequestCredentialBypassInterstitial(Protocol protocol, + const base::Value& request) { + if (!request.is_dict()) { + return false; + } + + switch (protocol) { + case Protocol::kUnknown: + return false; + case Protocol::kOpenid4vp: + return CanRequestCredentialBypassInterstitialForOpenid4vpProtocol( + request); + case Protocol::kPreview: + return CanRequestCredentialBypassInterstitialForPreviewProtocol(request); + } +} + +Protocol GetProtocol(const std::optional& protocol_name) { + if (!protocol_name.has_value()) { + return Protocol::kUnknown; + } + if (*protocol_name == kOpenid4vpProtocol) { + return Protocol::kOpenid4vp; + } + if (*protocol_name == kPreviewProtocol) { + return Protocol::kPreview; + } + return Protocol::kUnknown; +} + } // anonymous namespace DigitalIdentityRequestImpl::RenderFrameHostLifecycleObserver:: @@ -184,6 +243,7 @@ DigitalIdentityRequestImpl::ComputeInterstitialType( const url::Origin& rp_origin, const DigitalIdentityProvider* provider, + Protocol protocol, const data_decoder::DataDecoder::ValueOrError& request) { std::string dialog_param_value = base::GetFieldTrialParamValueByFeature( features::kWebIdentityDigitalCredentials, kDigitalIdentityDialogParam); @@ -204,7 +264,7 @@ } return (request.has_value() && - CanRequestCredentialBypassInterstitial(*request)) + CanRequestCredentialBypassInterstitial(protocol, *request)) ? std::nullopt : std::optional(InterstitialType::kLowRisk); } @@ -304,8 +364,10 @@ base::BindOnce(&DigitalIdentityRequestImpl::Abort, weak_ptr_factory_.GetWeakPtr()))); + Protocol protocol = GetProtocol(digital_credential_provider->protocol); std::optional request_json_string = digital_credential_provider->request; + std::string request_to_send = BuildRequest(std::move(digital_credential_provider)); @@ -317,7 +379,7 @@ data_decoder::DataDecoder::ParseJsonIsolated( *request_json_string, base::BindOnce(&DigitalIdentityRequestImpl::OnRequestJsonParsed, - weak_ptr_factory_.GetWeakPtr(), + weak_ptr_factory_.GetWeakPtr(), protocol, std::move(request_to_send))); } @@ -332,6 +394,7 @@ } void DigitalIdentityRequestImpl::OnRequestJsonParsed( + Protocol protocol, std::string request_to_send, data_decoder::DataDecoder::ValueOrError parsed_result) { if (base::CommandLine::ForCurrentProcess()->HasSwitch( @@ -360,7 +423,7 @@ std::optional interstitial_type = ComputeInterstitialType( render_frame_host().GetMainFrame()->GetLastCommittedOrigin(), - provider_.get(), parsed_result); + provider_.get(), protocol, parsed_result); if (!interstitial_type) { OnInterstitialDone(request_to_send, RequestStatusForMetrics::kSuccess); diff -Nru chromium-128.0.6613.84/content/browser/webid/digital_credentials/digital_identity_request_impl.h chromium-128.0.6613.113/content/browser/webid/digital_credentials/digital_identity_request_impl.h --- chromium-128.0.6613.84/content/browser/webid/digital_credentials/digital_identity_request_impl.h 2024-08-21 22:46:18.000000000 +0000 +++ chromium-128.0.6613.113/content/browser/webid/digital_credentials/digital_identity_request_impl.h 2024-08-28 22:39:03.000000000 +0000 @@ -24,6 +24,8 @@ class DigitalIdentityProvider; class RenderFrameHost; +enum class Protocol { kUnknown, kOpenid4vp, kPreview }; + // DigitalIdentityRequestImpl handles mojo connections from the renderer to // fulfill digital identity requests. // @@ -43,6 +45,7 @@ static std::optional ComputeInterstitialType( const url::Origin& rp_origin, const DigitalIdentityProvider* provider, + Protocol protocol, const data_decoder::DataDecoder::ValueOrError& request); DigitalIdentityRequestImpl(const DigitalIdentityRequestImpl&) = delete; @@ -89,6 +92,7 @@ // Called when the request JSON has been parsed. void OnRequestJsonParsed( + Protocol protocol, std::string request_to_send, data_decoder::DataDecoder::ValueOrError parsed_result); diff -Nru chromium-128.0.6613.84/content/browser/webid/digital_credentials/digital_identity_request_impl_unittest.cc chromium-128.0.6613.113/content/browser/webid/digital_credentials/digital_identity_request_impl_unittest.cc --- chromium-128.0.6613.84/content/browser/webid/digital_credentials/digital_identity_request_impl_unittest.cc 2024-08-21 22:46:18.000000000 +0000 +++ chromium-128.0.6613.113/content/browser/webid/digital_credentials/digital_identity_request_impl_unittest.cc 2024-08-28 22:39:03.000000000 +0000 @@ -78,6 +78,28 @@ return ParseJsonAndCheck(kJson); } +base::Value GenerateOnlyAgePreviewRequest() { + constexpr char kJson[] = R"({ + "selector": { + "format": [ + "mdoc" + ], + "doctype": "org.iso.18013.5.1.mDL", + "fields": [ + { + "namespace": "org.iso.18013.5.1", + "name": "age_over_21", + "intentToRetain": false + } + ] + }, + "nonce": "vvm3Q1VN1tXybccprmZhbZFIjBGSB4VNMuqQfD4Uiko=", + "readerPublicKey": "BMK9ink7wCHIKXxxWQy-S6TLN4jo1ab7NBlC-lSvqqMUmgMSadLa9PYYDocWitOmafZqWmZc5lQvdCZQx5mTNvs=" + })"; + + return ParseJsonAndCheck(kJson); +} + // Does depth-first traversal of nested dicts rooted at `root`. Returns first // matching base::Value with key `find_key`. base::Value* FindValueWithKey(base::Value& root, const std::string& find_key) { @@ -124,6 +146,7 @@ } } +// Used to modify an Openid4VpRequest on the fly. bool SetPathItem(base::Value& to_modify, const std::string& path_item) { base::Value* paths = FindValueWithKey(to_modify, "path"); if (HasNoListElements(paths)) { @@ -134,11 +157,23 @@ return true; } -std::optional ComputeInterstitialType(base::Value request) { +// Used to modify a Preview on the fly. +bool SetFieldNameValue(base::Value& to_modify, + const std::string& field_name_value) { + base::Value* fields = FindValueWithKey(to_modify, "fields"); + if (HasNoListElements(fields)) { + return false; + } + fields->GetList().front().GetDict().Set("name", field_name_value); + return true; +} + +std::optional ComputeInterstitialType(Protocol protocol, + base::Value request) { auto provider = std::make_unique( /*are_origins_low_risk=*/false); return DigitalIdentityRequestImpl::ComputeInterstitialType( - url::Origin(), provider.get(), std::move(request)); + url::Origin(), provider.get(), protocol, std::move(request)); } } // anonymous namespace @@ -154,28 +189,35 @@ base::test::ScopedFeatureList scoped_feature_list_; }; -TEST_F(DigitalIdentityRequestImplTest, ComputeInterstitialType_OnlyAgeOver) { +TEST_F(DigitalIdentityRequestImplTest, + Openid4VpProtocol_ComputeInterstitialType_OnlyAgeOver) { EXPECT_EQ(std::nullopt, - ComputeInterstitialType(GenerateOnlyAgeOpenid4VpRequest())); + ComputeInterstitialType(Protocol::kOpenid4vp, + GenerateOnlyAgeOpenid4VpRequest())); } -TEST_F(DigitalIdentityRequestImplTest, ComputeInterstitialType_OnlyAgeInYears) { +TEST_F(DigitalIdentityRequestImplTest, + Openid4VpProtocol_ComputeInterstitialType_OnlyAgeInYears) { base::Value request = GenerateOnlyAgeOpenid4VpRequest(); ASSERT_TRUE(SetPathItem(request, "$['org.iso.18013.5.1']['age_in_years']")); - EXPECT_EQ(std::nullopt, ComputeInterstitialType(std::move(request))); + EXPECT_EQ(std::nullopt, + ComputeInterstitialType(Protocol::kOpenid4vp, std::move(request))); } TEST_F(DigitalIdentityRequestImplTest, - ComputeIntersitialType_OnlyAgeBirthYear) { + Openid4VpProtocol_ComputeIntersitialType_OnlyAgeBirthYear) { base::Value request = GenerateOnlyAgeOpenid4VpRequest(); ASSERT_TRUE(SetPathItem(request, "$['org.iso.18013.5.1']['age_birth_year']")); - EXPECT_EQ(std::nullopt, ComputeInterstitialType(std::move(request))); + EXPECT_EQ(std::nullopt, + ComputeInterstitialType(Protocol::kOpenid4vp, std::move(request))); } -TEST_F(DigitalIdentityRequestImplTest, ComputeIntersitialType_OnlyBirthDate) { +TEST_F(DigitalIdentityRequestImplTest, + Openid4VpProtocol_ComputeIntersitialType_OnlyBirthDate) { base::Value request = GenerateOnlyAgeOpenid4VpRequest(); ASSERT_TRUE(SetPathItem(request, "$['org.iso.18013.5.1']['birth_date']")); - EXPECT_EQ(std::nullopt, ComputeInterstitialType(std::move(request))); + EXPECT_EQ(std::nullopt, + ComputeInterstitialType(Protocol::kOpenid4vp, std::move(request))); } base::Value GenerateNonAgeOpenid4VpRequest() { @@ -185,32 +227,35 @@ } TEST_F(DigitalIdentityRequestImplTest, - ComputeIntersitialType_OnlyNonAgeDataElement) { + Openid4VpProtocol_ComputeIntersitialType_OnlyNonAgeDataElement) { EXPECT_EQ(InterstitialType::kLowRisk, - ComputeInterstitialType(GenerateNonAgeOpenid4VpRequest())); + ComputeInterstitialType(Protocol::kOpenid4vp, + GenerateNonAgeOpenid4VpRequest())); } TEST_F(DigitalIdentityRequestImplTest, - LowRiskOriginTakesPrecedenceOverRequestType) { + Openid4VpProtocol_LowRiskOriginTakesPrecedenceOverRequestType) { auto provider = std::make_unique( /*are_origins_low_risk=*/true); - EXPECT_EQ(std::nullopt, DigitalIdentityRequestImpl::ComputeInterstitialType( - url::Origin(), provider.get(), - GenerateNonAgeOpenid4VpRequest())); + EXPECT_EQ(std::nullopt, + DigitalIdentityRequestImpl::ComputeInterstitialType( + url::Origin(), provider.get(), Protocol::kOpenid4vp, + GenerateNonAgeOpenid4VpRequest())); } -TEST_F(DigitalIdentityRequestImplTest, ComputeInterstitialType_EmptyPathList) { +TEST_F(DigitalIdentityRequestImplTest, + Openid4VpProtocol_ComputeInterstitialType_EmptyPathList) { base::Value request = GenerateOnlyAgeOpenid4VpRequest(); base::Value* paths = FindValueWithKey(request, "path"); ASSERT_TRUE(IsNonEmptyList(paths)); paths->GetList().resize(0); EXPECT_EQ(InterstitialType::kLowRisk, - ComputeInterstitialType(std::move(request))); + ComputeInterstitialType(Protocol::kOpenid4vp, std::move(request))); } TEST_F(DigitalIdentityRequestImplTest, - ComputeInterstitialType_RequestMultiplePaths) { + Openid4VpProtocol_ComputeInterstitialType_RequestMultiplePaths) { base::Value request = GenerateOnlyAgeOpenid4VpRequest(); base::Value* paths = FindValueWithKey(request, "path"); ASSERT_TRUE(IsNonEmptyList(paths)); @@ -219,32 +264,33 @@ path_list.Append(path_list.front().Clone()); EXPECT_EQ(InterstitialType::kLowRisk, - ComputeInterstitialType(std::move(request))); + ComputeInterstitialType(Protocol::kOpenid4vp, std::move(request))); } -TEST_F(DigitalIdentityRequestImplTest, ComputeInterstitialType_NoPath) { +TEST_F(DigitalIdentityRequestImplTest, + Openid4VpProtocol_ComputeInterstitialType_NoPath) { base::Value request = GenerateOnlyAgeOpenid4VpRequest(); base::Value* fields = FindValueWithKey(request, "fields"); ASSERT_TRUE(IsNonEmptyList(fields)); RemoveDictKey(fields->GetList().front().GetDict(), "path"); EXPECT_EQ(InterstitialType::kLowRisk, - ComputeInterstitialType(std::move(request))); + ComputeInterstitialType(Protocol::kOpenid4vp, std::move(request))); } TEST_F(DigitalIdentityRequestImplTest, - ComputeInterstitialType_EmptyFieldsList) { + Openid4VpProtocol_ComputeInterstitialType_EmptyFieldsList) { base::Value request = GenerateOnlyAgeOpenid4VpRequest(); base::Value* fields = FindValueWithKey(request, "fields"); ASSERT_TRUE(IsNonEmptyList(fields)); fields->GetList().resize(0); EXPECT_EQ(InterstitialType::kLowRisk, - ComputeInterstitialType(std::move(request))); + ComputeInterstitialType(Protocol::kOpenid4vp, std::move(request))); } TEST_F(DigitalIdentityRequestImplTest, - ComputeInterstitialType_RequestMultipleAgeAssertions) { + Openid4VpProtocol_ComputeInterstitialType_RequestMultipleAgeAssertions) { base::Value request = GenerateOnlyAgeOpenid4VpRequest(); base::Value* fields = FindValueWithKey(request, "fields"); ASSERT_TRUE(IsNonEmptyList(fields)); @@ -257,11 +303,11 @@ fields->GetList().Append(std::move(new_field)); EXPECT_EQ(InterstitialType::kLowRisk, - ComputeInterstitialType(std::move(request))); + ComputeInterstitialType(Protocol::kOpenid4vp, std::move(request))); } TEST_F(DigitalIdentityRequestImplTest, - ComputeInterstitialType_RequestMultipleFields) { + Openid4VpProtocol_ComputeInterstitialType_RequestMultipleFields) { base::Value request = GenerateOnlyAgeOpenid4VpRequest(); base::Value* fields = FindValueWithKey(request, "fields"); ASSERT_TRUE(IsNonEmptyList(fields)); @@ -274,10 +320,11 @@ fields->GetList().Append(std::move(new_field)); EXPECT_EQ(InterstitialType::kLowRisk, - ComputeInterstitialType(std::move(request))); + ComputeInterstitialType(Protocol::kOpenid4vp, std::move(request))); } -TEST_F(DigitalIdentityRequestImplTest, ComputeInterstitialType_NoConstraints) { +TEST_F(DigitalIdentityRequestImplTest, + Openid4VpProtocol_ComputeInterstitialType_NoConstraints) { base::Value request = GenerateOnlyAgeOpenid4VpRequest(); base::Value* input_descriptors = FindValueWithKey(request, "input_descriptors"); @@ -285,11 +332,11 @@ RemoveDictKey(input_descriptors->GetList().front().GetDict(), "constraints"); EXPECT_EQ(InterstitialType::kLowRisk, - ComputeInterstitialType(std::move(request))); + ComputeInterstitialType(Protocol::kOpenid4vp, std::move(request))); } TEST_F(DigitalIdentityRequestImplTest, - ComputeInterstitialType_EmptyInputDescriptorList) { + Openid4VpProtocol_ComputeInterstitialType_EmptyInputDescriptorList) { base::Value request = GenerateOnlyAgeOpenid4VpRequest(); base::Value* input_descriptors = FindValueWithKey(request, "input_descriptors"); @@ -297,11 +344,11 @@ input_descriptors->GetList().resize(0); EXPECT_EQ(InterstitialType::kLowRisk, - ComputeInterstitialType(std::move(request))); + ComputeInterstitialType(Protocol::kOpenid4vp, std::move(request))); } TEST_F(DigitalIdentityRequestImplTest, - ComputeInterstitialType_RequestMultipleDocuments) { + Openid4VpProtocol_ComputeInterstitialType_RequestMultipleDocuments) { base::Value request = GenerateOnlyAgeOpenid4VpRequest(); base::Value* input_descriptors = FindValueWithKey(request, "input_descriptors"); @@ -311,11 +358,11 @@ input_descriptor_list.Append(input_descriptor_list.front().Clone()); EXPECT_EQ(InterstitialType::kLowRisk, - ComputeInterstitialType(std::move(request))); + ComputeInterstitialType(Protocol::kOpenid4vp, std::move(request))); } TEST_F(DigitalIdentityRequestImplTest, - ComputeInterstitialType_NonMdlInputDescriptorId) { + Openid4VpProtocol_ComputeInterstitialType_NonMdlInputDescriptorId) { base::Value request = GenerateOnlyAgeOpenid4VpRequest(); base::Value* input_descriptors = FindValueWithKey(request, "input_descriptors"); @@ -326,16 +373,55 @@ input_descriptor_list.front().GetDict().Set("id", "not_mdl"); EXPECT_EQ(InterstitialType::kLowRisk, - ComputeInterstitialType(std::move(request))); + ComputeInterstitialType(Protocol::kOpenid4vp, std::move(request))); } TEST_F(DigitalIdentityRequestImplTest, - ComputeInterstitialType_NoPresentationDefinition) { + Openid4VpProtocol_ComputeInterstitialType_NoPresentationDefinition) { base::Value request = GenerateOnlyAgeOpenid4VpRequest(); RemoveDictKey(request.GetDict(), "presentation_definition"); EXPECT_EQ(InterstitialType::kLowRisk, - ComputeInterstitialType(std::move(request))); + ComputeInterstitialType(Protocol::kOpenid4vp, std::move(request))); +} + +TEST_F(DigitalIdentityRequestImplTest, + PreviewProtocol_ComputeInterstitialType_OnlyAgeOver) { + EXPECT_EQ(std::nullopt, + ComputeInterstitialType(Protocol::kPreview, + GenerateOnlyAgePreviewRequest())); +} + +TEST_F(DigitalIdentityRequestImplTest, + PreviewProtocol_ComputeInterstitialType_OnlyAgeInYears) { + base::Value request = GenerateOnlyAgePreviewRequest(); + ASSERT_TRUE(SetFieldNameValue(request, "age_in_years")); + EXPECT_EQ(std::nullopt, + ComputeInterstitialType(Protocol::kPreview, std::move(request))); +} + +TEST_F(DigitalIdentityRequestImplTest, + PreviewProtocol_ComputeIntersitialType_OnlyAgeBirthYear) { + base::Value request = GenerateOnlyAgePreviewRequest(); + ASSERT_TRUE(SetFieldNameValue(request, "age_birth_year")); + EXPECT_EQ(std::nullopt, + ComputeInterstitialType(Protocol::kPreview, std::move(request))); +} + +TEST_F(DigitalIdentityRequestImplTest, + PreviewProtocol_ComputeIntersitialType_OnlyBirthDate) { + base::Value request = GenerateOnlyAgePreviewRequest(); + ASSERT_TRUE(SetFieldNameValue(request, "birth_date")); + EXPECT_EQ(std::nullopt, + ComputeInterstitialType(Protocol::kPreview, std::move(request))); +} + +TEST_F(DigitalIdentityRequestImplTest, + PreviewProtocol_ComputeIntersitialType_GivenName) { + base::Value request = GenerateOnlyAgePreviewRequest(); + ASSERT_TRUE(SetFieldNameValue(request, "given_name")); + EXPECT_EQ(InterstitialType::kLowRisk, + ComputeInterstitialType(Protocol::kPreview, std::move(request))); } } // namespace content diff -Nru chromium-128.0.6613.84/debian/changelog chromium-128.0.6613.113/debian/changelog --- chromium-128.0.6613.84/debian/changelog 2024-08-22 18:06:28.000000000 +0000 +++ chromium-128.0.6613.113/debian/changelog 2024-08-29 05:10:43.000000000 +0000 @@ -1,3 +1,28 @@ +chromium (128.0.6613.113-1~deb12u1) bookworm-security; urgency=high + + [ Andres Salomon ] + * New upstream security release. + - CVE-2024-7969: Type Confusion in V8. + Reported by CFF of Topsec Alpha Team. + - CVE-2024-8193: Heap buffer overflow in Skia. + Reported by Renan Rios (@hyhy_100). + - CVE-2024-8194: Type Confusion in V8. Reported by Seunghyun Lee (@0x10n). + - CVE-2024-8198: Heap buffer overflow in Skia. + Reported by Renan Rios (@hyhy_100). + * d/control: + - Bump rustc-web build-dep up to >= 1.74. + * d/patches: + - bookworm/rust-downgrade-osstr-users.patch: drop, now that we have a + newer rust in bookworm. + - bookworm/crabbyav1f.patch: drop, no longer needed w/ new rust. + - bookworm/rust-no-thin-lto.patch: drop, we can now enable thinlto w/ + new rust. + - fixes/clang-rust-target.patch: add, needed for thinlto in rust. + - ppc64le/fixes/fix-different-data-layouts.patch: add, needed for + mismatch between newer rust and older clang. + + -- Andres Salomon Thu, 29 Aug 2024 01:10:43 -0400 + chromium (128.0.6613.84-1~deb12u1) bookworm-security; urgency=high [ Andres Salomon ] diff -Nru chromium-128.0.6613.84/debian/control chromium-128.0.6613.113/debian/control --- chromium-128.0.6613.84/debian/control 2024-07-30 02:54:02.000000000 +0000 +++ chromium-128.0.6613.113/debian/control 2024-08-28 05:08:39.000000000 +0000 @@ -19,7 +19,7 @@ libclang-rt-16-dev, libc++-16-dev, libc++abi-16-dev, - rustc-web, + rustc-web (>= 1.74), bindgen, python3, pkg-config, diff -Nru chromium-128.0.6613.84/debian/patches/bookworm/crabbyav1f.patch chromium-128.0.6613.113/debian/patches/bookworm/crabbyav1f.patch --- chromium-128.0.6613.84/debian/patches/bookworm/crabbyav1f.patch 2024-08-22 18:06:28.000000000 +0000 +++ chromium-128.0.6613.113/debian/patches/bookworm/crabbyav1f.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -author: Andres Salomon - -error[E0658]: use of unstable library feature 'int_roundings' - --> ../../third_party/crabbyavif/src/src/decoder/track.rs:83:65 - | -83 | let repetition_count: u64 = self.track_duration.div_ceil(self.segment_duration) - 1; - | ^^^^^^^^ - | - = note: see issue #88581 for more information - = help: add `#![feature(int_roundings)]` to the crate attributes to enable - - -This patch can go away when bookworm gets a newer rustc. - - ---- a/third_party/crabbyavif/src/src/lib.rs -+++ b/third_party/crabbyavif/src/src/lib.rs -@@ -13,6 +13,7 @@ - // limitations under the License. - - #![deny(unsafe_op_in_unsafe_fn)] -+#![feature(int_roundings)] - - pub mod decoder; - pub mod image; diff -Nru chromium-128.0.6613.84/debian/patches/bookworm/rust-downgrade-osstr-users.patch chromium-128.0.6613.113/debian/patches/bookworm/rust-downgrade-osstr-users.patch --- chromium-128.0.6613.84/debian/patches/bookworm/rust-downgrade-osstr-users.patch 2024-07-30 02:54:02.000000000 +0000 +++ chromium-128.0.6613.113/debian/patches/bookworm/rust-downgrade-osstr-users.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,156 +0,0 @@ -essentially downgrade the clap_lex crate - - -error[E0599]: no method named `as_encoded_bytes` found for reference `&OsStr` in the current scope - --> ../../third_party/rust/chromium_crates_io/vendor/clap_lex-0.7.0/src/ext.rs:186:26 - | -186 | let bytes = self.as_encoded_bytes(); - | ^^^^^^^^^^^^^^^^ method not found in `&OsStr` - -[...] -error[E0599]: no function or associated item named `from_encoded_bytes_unchecked` found for struct `OsStr` in the current scope - --> ../../third_party/rust/chromium_crates_io/vendor/clap_lex-0.7.0/src/ext.rs:206:29 - | -206 | unsafe { OsStr::from_encoded_bytes_unchecked(s) } - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function or associated item not found in `OsStr` - - -as_encoded_bytes() is available as of rustc 1.74.0, but we're on 1.70.0: -https://doc.rust-lang.org/std/ffi/struct.OsStr.html#method.as_encoded_bytes - - -Reverts the following commit: - -https://github.com/epage/clap/commit/f750e577789e1dd34c6950d8c8fe16d1bfd1f49c - - commit f750e577789e1dd34c6950d8c8fe16d1bfd1f49c - Author: Ed Page - Date: Thu Feb 8 10:05:24 2024 -0600 - - fix(lex): Use new-ish OsStr API - - Fixes #5280 - ---- a/third_party/rust/chromium_crates_io/vendor/clap_lex-0.7.1/src/ext.rs -+++ b/third_party/rust/chromium_crates_io/vendor/clap_lex-0.7.1/src/ext.rs -@@ -184,7 +184,7 @@ pub trait OsStrExt: private::Sealed { - - impl OsStrExt for OsStr { - fn try_str(&self) -> Result<&str, std::str::Utf8Error> { -- let bytes = self.as_encoded_bytes(); -+ let bytes = to_bytes(self); - std::str::from_utf8(bytes) - } - -@@ -193,22 +193,22 @@ impl OsStrExt for OsStr { - } - - fn find(&self, needle: &str) -> Option { -- let bytes = self.as_encoded_bytes(); -+ let bytes = to_bytes(self); - (0..=self.len().checked_sub(needle.len())?) - .find(|&x| bytes[x..].starts_with(needle.as_bytes())) - } - - fn strip_prefix(&self, prefix: &str) -> Option<&OsStr> { -- let bytes = self.as_encoded_bytes(); -+ let bytes = to_bytes(self); - bytes.strip_prefix(prefix.as_bytes()).map(|s| { - // SAFETY: -- // - This came from `as_encoded_bytes` -- // - Since `prefix` is `&str`, any split will be along UTF-8 boundary -- unsafe { OsStr::from_encoded_bytes_unchecked(s) } -+ // - This came from `to_bytes` -+ // - Since `prefix` is `&str`, any split will be along UTF-8 boundarie -+ unsafe { to_os_str_unchecked(s) } - }) - } - fn starts_with(&self, prefix: &str) -> bool { -- let bytes = self.as_encoded_bytes(); -+ let bytes = to_bytes(self); - bytes.starts_with(prefix.as_bytes()) - } - -@@ -223,18 +223,13 @@ impl OsStrExt for OsStr { - fn split_once(&self, needle: &'_ str) -> Option<(&OsStr, &OsStr)> { - let start = self.find(needle)?; - let end = start + needle.len(); -- let haystack = self.as_encoded_bytes(); -+ let haystack = to_bytes(self); - let first = &haystack[0..start]; - let second = &haystack[end..]; - // SAFETY: -- // - This came from `as_encoded_bytes` -- // - Since `needle` is `&str`, any split will be along UTF-8 boundary -- unsafe { -- Some(( -- OsStr::from_encoded_bytes_unchecked(first), -- OsStr::from_encoded_bytes_unchecked(second), -- )) -- } -+ // - This came from `to_bytes` -+ // - Since `needle` is `&str`, any split will be along UTF-8 boundarie -+ unsafe { Some((to_os_str_unchecked(first), to_os_str_unchecked(second))) } - } - } - -@@ -244,6 +239,45 @@ mod private { - impl Sealed for std::ffi::OsStr {} - } - -+/// Allow access to raw bytes -+/// -+/// As the non-UTF8 encoding is not defined, the bytes only make sense when compared with -+/// 7-bit ASCII or `&str` -+/// -+/// # Compatibility -+/// -+/// There is no guarantee how non-UTF8 bytes will be encoded, even within versions of this crate -+/// (since its dependent on rustc) -+fn to_bytes(s: &OsStr) -> &[u8] { -+ // SAFETY: -+ // - Lifetimes are the same -+ // - Types are compatible (`OsStr` is effectively a transparent wrapper for `[u8]`) -+ // - The primary contract is that the encoding for invalid surrogate code points is not -+ // guaranteed which isn't a problem here -+ // -+ // There is a proposal to support this natively (https://github.com/rust-lang/rust/pull/95290) -+ // but its in limbo -+ unsafe { std::mem::transmute(s) } -+} -+ -+/// Restore raw bytes as `OsStr` -+/// -+/// # Safety -+/// -+/// - `&[u8]` must either by a `&str` or originated with `to_bytes` within the same binary -+/// - Any splits of the original `&[u8]` must be done along UTF-8 boundaries -+unsafe fn to_os_str_unchecked(s: &[u8]) -> &OsStr { -+ // SAFETY: -+ // - Lifetimes are the same -+ // - Types are compatible (`OsStr` is effectively a transparent wrapper for `[u8]`) -+ // - The primary contract is that the encoding for invalid surrogate code points is not -+ // guaranteed which isn't a problem here -+ // -+ // There is a proposal to support this natively (https://github.com/rust-lang/rust/pull/95290) -+ // but its in limbo -+ std::mem::transmute(s) -+} -+ - pub struct Split<'s, 'n> { - haystack: Option<&'s OsStr>, - needle: &'n str, -@@ -274,11 +308,8 @@ impl<'s, 'n> Iterator for Split<'s, 'n> - /// `index` must be at a valid UTF-8 boundary - pub(crate) unsafe fn split_at(os: &OsStr, index: usize) -> (&OsStr, &OsStr) { - unsafe { -- let bytes = os.as_encoded_bytes(); -+ let bytes = to_bytes(os); - let (first, second) = bytes.split_at(index); -- ( -- OsStr::from_encoded_bytes_unchecked(first), -- OsStr::from_encoded_bytes_unchecked(second), -- ) -+ (to_os_str_unchecked(first), to_os_str_unchecked(second)) - } - } diff -Nru chromium-128.0.6613.84/debian/patches/bookworm/rust-no-thin-lto.patch chromium-128.0.6613.113/debian/patches/bookworm/rust-no-thin-lto.patch --- chromium-128.0.6613.84/debian/patches/bookworm/rust-no-thin-lto.patch 2024-08-07 08:04:57.000000000 +0000 +++ chromium-128.0.6613.113/debian/patches/bookworm/rust-no-thin-lto.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,15 +0,0 @@ -The Rust toolchain on bookworm does not support Chromium's ThinLTO build: - - error: unknown unstable option: `split-lto-unit` - ---- a/build/config/rust.gni -+++ b/build/config/rust.gni -@@ -79,7 +79,7 @@ declare_args() { - # - # TODO(crbug.com/40281834): Re-enable ThinLTO for Rust on LaCrOS - # TODO(b/300937673): Re-enable ThinLTO for Rust on ash-chrome -- toolchain_supports_rust_thin_lto = !is_chromeos -+ toolchain_supports_rust_thin_lto = false - - # Any extra std rlibs in your Rust toolchain, relative to the standard - # Rust toolchain. Typically used with 'rust_sysroot_absolute' diff -Nru chromium-128.0.6613.84/debian/patches/fixes/clang-rust-target.patch chromium-128.0.6613.113/debian/patches/fixes/clang-rust-target.patch --- chromium-128.0.6613.84/debian/patches/fixes/clang-rust-target.patch 1970-01-01 00:00:00.000000000 +0000 +++ chromium-128.0.6613.113/debian/patches/fixes/clang-rust-target.patch 2024-08-28 05:08:39.000000000 +0000 @@ -0,0 +1,23 @@ +Author: Daniel Richard G. + +On amd64, Clang defaults to generating x86_64-pc-linux-gnu, while Rust +generates x86_64-unknown-linux-gnu. When ThinLTO is enabled, this leads +to link errors of the form + + ld.lld-16: error: Linking two modules of different target triples: + $C_CXX_OBJECT is 'x86_64-pc-linux-gnu' whereas $RUST_OBJECT is + 'x86_64-unknown-linux-gnu' + +--- a/build/config/linux/BUILD.gn ++++ b/build/config/linux/BUILD.gn +@@ -27,6 +27,10 @@ config("compiler") { + asmflags += [ "-mbranch-protection=pac-ret" ] + } + } ++ if (current_cpu == "x64") { ++ # Match Rust output target (i.e. not x86_64-pc-linux-gnu) ++ cflags = [ "--target=x86_64-unknown-linux-gnu" ] ++ } + } + + # This is included by reference in the //build/config/compiler:runtime_library diff -Nru chromium-128.0.6613.84/debian/patches/series chromium-128.0.6613.113/debian/patches/series --- chromium-128.0.6613.84/debian/patches/series 2024-08-22 18:06:28.000000000 +0000 +++ chromium-128.0.6613.113/debian/patches/series 2024-08-28 05:08:39.000000000 +0000 @@ -12,6 +12,7 @@ fixes/strlcpy.patch fixes/bindgen.patch fixes/memory-allocator-dcheck-assert-fix.patch +fixes/clang-rust-target.patch fixes/highway-include-path.patch upstream/mojo.patch @@ -49,15 +50,12 @@ bookworm/sizet.patch bookworm/urlhelper-ctor.patch bookworm/v8-wrappable.patch -bookworm/rust-downgrade-osstr-users.patch bookworm/lex-3way.patch bookworm/traitors.patch bookworm/spaceship-operator.patch bookworm/constexpr.patch bookworm/gn-funcs.patch bookworm/gn-absl.patch -bookworm/crabbyav1f.patch -bookworm/rust-no-thin-lto.patch bookworm/highway-blink.patch bookworm/blink-attrib.patch @@ -122,6 +120,7 @@ ppc64le/fixes/fix-rust-linking.patch ppc64le/fixes/fix-breakpad-compile.patch ppc64le/fixes/fix-partition-alloc-compile.patch +ppc64le/fixes/fix-different-data-layouts.patch ppc64le/v8/0002-Add-ppc64-trap-instructions.patch ppc64le/sandbox/fix-ppc64-linux-syscalls-headers.patch diff -Nru chromium-128.0.6613.84/gpu/config/gpu_lists_version.h chromium-128.0.6613.113/gpu/config/gpu_lists_version.h --- chromium-128.0.6613.84/gpu/config/gpu_lists_version.h 2024-08-21 22:51:21.000000000 +0000 +++ chromium-128.0.6613.113/gpu/config/gpu_lists_version.h 2024-08-28 22:43:55.000000000 +0000 @@ -3,6 +3,6 @@ #ifndef GPU_CONFIG_GPU_LISTS_VERSION_H_ #define GPU_CONFIG_GPU_LISTS_VERSION_H_ -#define GPU_LISTS_VERSION "606aa55c7d687518d34b55accc5a71ea0bd28727" +#define GPU_LISTS_VERSION "9597ae93a15d4d03089b4e9997b1072228baa9ad" #endif // GPU_CONFIG_GPU_LISTS_VERSION_H_ diff -Nru chromium-128.0.6613.84/gpu/webgpu/DAWN_VERSION chromium-128.0.6613.113/gpu/webgpu/DAWN_VERSION --- chromium-128.0.6613.84/gpu/webgpu/DAWN_VERSION 2024-08-21 22:51:22.000000000 +0000 +++ chromium-128.0.6613.113/gpu/webgpu/DAWN_VERSION 2024-08-28 22:43:55.000000000 +0000 @@ -1 +1 @@ -9f1487f627fac5897e3de9603dc377bd477a63e6 \ No newline at end of file +5f86f5a316f4e082b2419d8b954ebb79c2be590d \ No newline at end of file diff -Nru chromium-128.0.6613.84/net/http/transport_security_state_static.pins chromium-128.0.6613.113/net/http/transport_security_state_static.pins --- chromium-128.0.6613.84/net/http/transport_security_state_static.pins 2024-08-21 22:46:24.000000000 +0000 +++ chromium-128.0.6613.113/net/http/transport_security_state_static.pins 2024-08-28 22:39:08.000000000 +0000 @@ -43,9 +43,9 @@ # hash function for preloaded entries again (we have already done so once). # -# Last updated: 2024-08-12 12:54 UTC +# Last updated: 2024-08-25 12:56 UTC PinsListTimestamp -1723467293 +1724590599 TestSPKI sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA= diff -Nru chromium-128.0.6613.84/net/http/transport_security_state_static_pins.json chromium-128.0.6613.113/net/http/transport_security_state_static_pins.json --- chromium-128.0.6613.84/net/http/transport_security_state_static_pins.json 2024-08-21 22:46:24.000000000 +0000 +++ chromium-128.0.6613.113/net/http/transport_security_state_static_pins.json 2024-08-28 22:39:08.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: 2024-08-12 12:54 UTC +// Last updated: 2024-08-25 12:56 UTC // { "pinsets": [ diff -Nru chromium-128.0.6613.84/net/http/url_security_manager_win.cc chromium-128.0.6613.113/net/http/url_security_manager_win.cc --- chromium-128.0.6613.84/net/http/url_security_manager_win.cc 2024-08-21 22:46:24.000000000 +0000 +++ chromium-128.0.6613.113/net/http/url_security_manager_win.cc 2024-08-28 22:39:08.000000000 +0000 @@ -7,6 +7,8 @@ #include #include +#include "base/debug/crash_logging.h" +#include "base/debug/dump_without_crashing.h" #include "base/logging.h" #include "base/notreached.h" #include "base/strings/string_util.h" @@ -100,7 +102,9 @@ // TODO(wtc): we should fail the authentication. return false; default: - NOTREACHED_IN_MIGRATION(); + LOG(ERROR) << "Unexpected policy: " << policy; + SCOPED_CRASH_KEY_NUMBER("CanUseDefaultCredentials", "policy", policy); + base::debug::DumpWithoutCrashing(); return false; } } diff -Nru chromium-128.0.6613.84/services/passage_embeddings/passage_embedder.cc chromium-128.0.6613.113/services/passage_embeddings/passage_embedder.cc --- chromium-128.0.6613.84/services/passage_embeddings/passage_embedder.cc 2024-08-21 22:46:24.000000000 +0000 +++ chromium-128.0.6613.113/services/passage_embeddings/passage_embedder.cc 2024-08-28 22:39:09.000000000 +0000 @@ -8,16 +8,26 @@ #include "base/files/file.h" #include "base/metrics/histogram_functions.h" #include "base/timer/elapsed_timer.h" +#include "base/trace_event/trace_event.h" +#include "base/trace_event/trace_id_helper.h" +#include "base/trace_event/typed_macros.h" #include "components/history_embeddings/history_embeddings_features.h" #include "components/optimization_guide/core/tflite_op_resolver.h" #include "third_party/sentencepiece/src/src/sentencepiece_model.pb.h" namespace { +// Records duration and trace event for embeddings generation. void RecordEmbeddingsDurationMetrics( bool is_passive, + base::TimeTicks start_time, base::TimeDelta elapsed_time, std::optional elapsed_thread_time) { + const auto trace_track = + perfetto::Track(base::trace_event::GetNextGlobalTraceId()); + if (is_passive) { + TRACE_EVENT_BEGIN("loading", "PassageEmbeddingsGeneration", trace_track, + start_time); if (elapsed_thread_time.has_value()) { base::UmaHistogramMediumTimes( "History.Embeddings.Embedder." @@ -28,6 +38,8 @@ "History.Embeddings.Embedder.PassageEmbeddingsGenerationDuration", elapsed_time); } else { + TRACE_EVENT_BEGIN("loading", "QueryEmbeddingsGeneration", trace_track, + start_time); if (elapsed_thread_time.has_value()) { base::UmaHistogramMediumTimes( "History.Embeddings.Embedder.QueryEmbeddingsGenerationThreadDuration", @@ -37,6 +49,8 @@ "History.Embeddings.Embedder.QueryEmbeddingsGenerationDuration", elapsed_time); } + + TRACE_EVENT_END("loading", trace_track, start_time + elapsed_time); } } // namespace @@ -233,9 +247,17 @@ base::UmaHistogramBoolean("History.Embeddings.Embedder.InputTruncated", tokenized.size() > embeddings_input_window_size_); tokenized.resize(embeddings_input_window_size_); + base::TimeDelta tokenize_elapsed = tokenize_timer.Elapsed(); base::UmaHistogramMediumTimes( - "History.Embeddings.Embedder.TokenizationDuration", - tokenize_timer.Elapsed()); + "History.Embeddings.Embedder.TokenizationDuration", tokenize_elapsed); + + const auto tokenize_start_time = tokenize_timer.start_time(); + const auto trace_track = + perfetto::Track(base::trace_event::GetNextGlobalTraceId()); + TRACE_EVENT_BEGIN("loading", "PassageTokenization", trace_track, + tokenize_start_time); + TRACE_EVENT_END("loading", trace_track, + tokenize_start_time + tokenize_elapsed); base::ElapsedThreadTimer execute_thread_timer; base::ElapsedTimer execute_timer; @@ -249,7 +271,8 @@ } RecordEmbeddingsDurationMetrics( - priority == mojom::PassagePriority::kPassive, execute_timer.Elapsed(), + priority == mojom::PassagePriority::kPassive, + execute_timer.start_time(), execute_timer.Elapsed(), execute_thread_timer.is_supported() ? std::optional(execute_thread_timer.Elapsed()) : std::nullopt); diff -Nru chromium-128.0.6613.84/skia/ext/skia_commit_hash.h chromium-128.0.6613.113/skia/ext/skia_commit_hash.h --- chromium-128.0.6613.84/skia/ext/skia_commit_hash.h 2024-08-21 22:51:21.000000000 +0000 +++ chromium-128.0.6613.113/skia/ext/skia_commit_hash.h 2024-08-28 22:43:55.000000000 +0000 @@ -3,6 +3,6 @@ #ifndef SKIA_EXT_SKIA_COMMIT_HASH_H_ #define SKIA_EXT_SKIA_COMMIT_HASH_H_ -#define SKIA_COMMIT_HASH "fb67954b7e76dc59567dd1f87734ada0cd1bc7f6" +#define SKIA_COMMIT_HASH "8bd493b850f1a75482af8f30cb492cd70645498c" #endif // SKIA_EXT_SKIA_COMMIT_HASH_H_ diff -Nru chromium-128.0.6613.84/testing/scripts/check_gn_headers.py chromium-128.0.6613.113/testing/scripts/check_gn_headers.py --- chromium-128.0.6613.84/testing/scripts/check_gn_headers.py 2024-08-21 22:46:25.000000000 +0000 +++ chromium-128.0.6613.113/testing/scripts/check_gn_headers.py 2024-08-28 22:39:10.000000000 +0000 @@ -19,7 +19,8 @@ sys.executable, os.path.join(common.SRC_DIR, 'build', 'check_gn_headers.py'), '--out-dir', - os.path.join(args.paths['checkout'], 'out', args.build_config_fs), + args.build_dir + or os.path.join(args.paths['checkout'], 'out', args.build_config_fs), '--whitelist', os.path.join(common.SRC_DIR, 'build', 'check_gn_headers_whitelist.txt'), '--json', diff -Nru chromium-128.0.6613.84/testing/scripts/check_network_annotations.py chromium-128.0.6613.113/testing/scripts/check_network_annotations.py --- chromium-128.0.6613.84/testing/scripts/check_network_annotations.py 2024-08-21 22:46:25.000000000 +0000 +++ chromium-128.0.6613.113/testing/scripts/check_network_annotations.py 2024-08-28 22:39:10.000000000 +0000 @@ -33,7 +33,8 @@ os.path.join(common.SRC_DIR, 'tools', 'traffic_annotation', 'scripts', 'check_annotations.py'), '--build-path', - os.path.join(args.paths['checkout'], 'out', args.build_config_fs), + args.build_dir + or os.path.join(args.paths['checkout'], 'out', args.build_config_fs), '--errors-file', errors_filename, ] diff -Nru chromium-128.0.6613.84/testing/scripts/check_static_initializers.py chromium-128.0.6613.113/testing/scripts/check_static_initializers.py --- chromium-128.0.6613.84/testing/scripts/check_static_initializers.py 2024-08-21 22:46:25.000000000 +0000 +++ chromium-128.0.6613.113/testing/scripts/check_static_initializers.py 2024-08-28 22:39:10.000000000 +0000 @@ -17,6 +17,14 @@ os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir))) from scripts import common +CHROMIUM_ROOT = os.path.join(os.path.dirname(__file__), os.pardir, os.pardir) +BUILD_DIR = os.path.join(CHROMIUM_ROOT, 'build') + +if BUILD_DIR not in sys.path: + sys.path.insert(0, BUILD_DIR) +import gn_helpers + + # A list of filename regexes that are allowed to have static initializers. # If something adds a static initializer, revert it. We don't accept regressions # in static initializers. @@ -170,11 +178,17 @@ def main_run(args): - if args.build_config_fs != 'Release': + if args.build_dir: + with open(os.path.join(args.build_dir, 'args.gn')) as f: + gn_args = gn_helpers.FromGNArgs(f.read()) + if gn_args.get('is_debug') or gn_args.get('is_official_build'): + raise Exception('Only release builds are supported') + elif args.build_config_fs != 'Release': raise Exception('Only release builds are supported') src_dir = args.paths['checkout'] - build_dir = os.path.join(src_dir, 'out', args.build_config_fs) + build_dir = args.build_dir or os.path.join(src_dir, 'out', + args.build_config_fs) os.chdir(build_dir) if sys.platform.startswith('darwin'): diff -Nru chromium-128.0.6613.84/testing/scripts/checkbins.py chromium-128.0.6613.113/testing/scripts/checkbins.py --- chromium-128.0.6613.84/testing/scripts/checkbins.py 2024-08-21 22:46:25.000000000 +0000 +++ chromium-128.0.6613.113/testing/scripts/checkbins.py 2024-08-28 22:39:10.000000000 +0000 @@ -50,7 +50,8 @@ '--verbose', '--json', tempfile_path, - os.path.join(args.paths['checkout'], 'out', args.build_config_fs), + args.build_dir + or os.path.join(args.paths['checkout'], 'out', args.build_config_fs), ]) with open(tempfile_path) as f: diff -Nru chromium-128.0.6613.84/testing/scripts/common.py chromium-128.0.6613.113/testing/scripts/common.py --- chromium-128.0.6613.84/testing/scripts/common.py 2024-08-21 22:46:25.000000000 +0000 +++ chromium-128.0.6613.113/testing/scripts/common.py 2024-08-28 22:39:10.000000000 +0000 @@ -122,8 +122,14 @@ return json.load(f) parser = argparse.ArgumentParser() - # TODO(phajdan.jr): Make build-config-fs required after passing it in recipe. - parser.add_argument('--build-config-fs') + # TODO(crbug.com/355218109): Remove '--build-config-fs' in favor of + # '--build-dir'. + parser.add_argument( + '--build-config-fs', + help='Release or debug "config" of the build. WARNING: This arg ' + 'is deprecated and should not be used If you want the build-dir path, ' + 'use "--build-dir".') + parser.add_argument('--build-dir', help='Absolute path to build-dir.') parser.add_argument('--paths', type=parse_json, default={}) # Properties describe the environment of the build, and are the same per # script invocation. diff -Nru chromium-128.0.6613.84/testing/scripts/count_filtered_tests.py chromium-128.0.6613.113/testing/scripts/count_filtered_tests.py --- chromium-128.0.6613.84/testing/scripts/count_filtered_tests.py 2024-08-21 22:46:25.000000000 +0000 +++ chromium-128.0.6613.113/testing/scripts/count_filtered_tests.py 2024-08-28 22:39:10.000000000 +0000 @@ -58,7 +58,8 @@ def main_run(args): binary_name = args.args[0] test_filter_file = args.args[1] - base_path = os.path.join(args.paths['checkout'], 'out', args.build_config_fs) + base_path = args.build_dir or os.path.join(args.paths['checkout'], 'out', + args.build_config_fs) list_tests_output = subprocess.check_output( [os.path.join(base_path, binary_name), '--gtest_list_tests']) tests = ParseTestList(list_tests_output) diff -Nru chromium-128.0.6613.84/testing/scripts/metrics_python_tests.py chromium-128.0.6613.113/testing/scripts/metrics_python_tests.py --- chromium-128.0.6613.84/testing/scripts/metrics_python_tests.py 2024-08-21 22:46:25.000000000 +0000 +++ chromium-128.0.6613.113/testing/scripts/metrics_python_tests.py 2024-08-28 22:39:10.000000000 +0000 @@ -16,17 +16,18 @@ def main_run(args): with common.temporary_file() as tempfile_path: - rc = common.run_command([ - 'vpython3', - os.path.join(common.SRC_DIR, 'testing', 'test_env.py'), - os.path.join(common.SRC_DIR, 'tools', 'metrics', - 'metrics_python_tests.py'), - '--isolated-script-test-output', - tempfile_path, - '--skip-set-lpac-acls=1', - ], - cwd=os.path.join(common.SRC_DIR, 'out', - args.build_config_fs)) + rc = common.run_command( + [ + 'vpython3', + os.path.join(common.SRC_DIR, 'testing', 'test_env.py'), + os.path.join(common.SRC_DIR, 'tools', 'metrics', + 'metrics_python_tests.py'), + '--isolated-script-test-output', + tempfile_path, + '--skip-set-lpac-acls=1', + ], + cwd=args.build_dir + or os.path.join(common.SRC_DIR, 'out', args.build_config_fs)) with open(tempfile_path) as f: isolated_results = json.load(f) diff -Nru chromium-128.0.6613.84/testing/scripts/test_traffic_annotation_auditor.py chromium-128.0.6613.113/testing/scripts/test_traffic_annotation_auditor.py --- chromium-128.0.6613.84/testing/scripts/test_traffic_annotation_auditor.py 2024-08-21 22:46:25.000000000 +0000 +++ chromium-128.0.6613.113/testing/scripts/test_traffic_annotation_auditor.py 2024-08-28 22:39:10.000000000 +0000 @@ -77,7 +77,8 @@ annotations_filename = annotations_file.name annotations_file.close() - build_path = os.path.join(args.paths['checkout'], 'out', args.build_config_fs) + build_path = args.build_dir or os.path.join(args.paths['checkout'], 'out', + args.build_config_fs) command_line = [ sys.executable, os.path.join(common.SRC_DIR, 'tools', 'traffic_annotation', 'scripts', diff -Nru chromium-128.0.6613.84/third_party/blink/public/strings/translations/blink_strings_te.xtb chromium-128.0.6613.113/third_party/blink/public/strings/translations/blink_strings_te.xtb --- chromium-128.0.6613.84/third_party/blink/public/strings/translations/blink_strings_te.xtb 2024-08-21 22:46:26.000000000 +0000 +++ chromium-128.0.6613.113/third_party/blink/public/strings/translations/blink_strings_te.xtb 2024-08-28 22:39:11.000000000 +0000 @@ -151,7 +151,7 @@ ఫైల్‌ను ఎంచుకోండి ఇతర... TB -డౌన్‌లోడ్ చేయి +డౌన్‌లోడ్ చేయండి గంటలు చిత్రంలో చిత్రం నమోదు చెల్లదు diff -Nru chromium-128.0.6613.84/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h chromium-128.0.6613.113/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h --- chromium-128.0.6613.84/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h 2024-08-21 22:46:26.000000000 +0000 +++ chromium-128.0.6613.113/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl.h 2024-08-28 22:39:11.000000000 +0000 @@ -1820,8 +1820,8 @@ v8::Local value, ExceptionState& exception_state) { typename T::ReturnType result; - using Traits = bindings::internal::TypedArrayElementTraits; - if (Traits::IsViewOfType(value)) { + if (bindings::internal::TypedArrayElementTraits::IsViewOfType( + value)) { v8::Local view = value.As(); if (!T::allow_shared && view->HasBuffer() && view->Buffer()->GetBackingStore()->IsShared()) { @@ -1833,14 +1833,6 @@ bindings::internal::GetViewData(view, result.GetInlineStorage())); return result; } - if constexpr (T::allow_sequence) { - auto&& vec = NativeValueTraits>:: - ArgumentValue(isolate, argument_index, value, exception_state); - if (LIKELY(!exception_state.HadException())) { - result.Assign(std::move(vec)); - } - return result; - } exception_state.ThrowTypeError( ExceptionMessages::ArgumentNotOfType(argument_index, "TypedArray")); return result; diff -Nru chromium-128.0.6613.84/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl_test.cc chromium-128.0.6613.113/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl_test.cc --- chromium-128.0.6613.84/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl_test.cc 2024-08-21 22:46:26.000000000 +0000 +++ chromium-128.0.6613.113/third_party/blink/renderer/bindings/core/v8/native_value_traits_impl_test.cc 2024-08-28 22:39:11.000000000 +0000 @@ -684,48 +684,5 @@ } } -template -using PassAsSpanSequence = - PassAsSpan; - -TEST(NativeValueTraitsImplTest, PassAsSpanAllowSequence) { - test::TaskEnvironment task_environment; - NonThrowableExceptionState exception_state; - V8TestingScope scope; - { - v8::Local v8_object = - EvaluateScriptForObject(scope, "[1, 2, 3, 4]"); - - EXPECT_THAT(NativeValueTraits>::ArgumentValue( - scope.GetIsolate(), 0, v8_object, exception_state) - .as_span(), - testing::ElementsAre(1, 2, 3, 4)); - EXPECT_THAT(NativeValueTraits>::ArgumentValue( - scope.GetIsolate(), 0, v8_object, exception_state) - .as_span(), - testing::ElementsAre(1.0, 2.0, 3.0, 4.0)); - - DummyExceptionStateForTesting thrown_exception; - EXPECT_THAT( - NativeValueTraits>::ArgumentValue( - scope.GetIsolate(), 0, v8_object, thrown_exception) - .as_span(), - testing::IsEmpty()); - EXPECT_TRUE(thrown_exception.HadException()); - } - { - v8::Local v8_iterable = EvaluateScriptForObject(scope, R"( - (function*() { - yield 1; - yield 2; - yield 3; - })())"); - EXPECT_THAT(NativeValueTraits>::ArgumentValue( - scope.GetIsolate(), 0, v8_iterable, exception_state) - .as_span(), - testing::ElementsAre(1, 2, 3)); - } -} - } // namespace } // namespace blink diff -Nru chromium-128.0.6613.84/third_party/blink/renderer/bindings/core/v8/pass_as_span.h chromium-128.0.6613.113/third_party/blink/renderer/bindings/core/v8/pass_as_span.h --- chromium-128.0.6613.84/third_party/blink/renderer/bindings/core/v8/pass_as_span.h 2024-08-21 22:46:26.000000000 +0000 +++ chromium-128.0.6613.113/third_party/blink/renderer/bindings/core/v8/pass_as_span.h 2024-08-28 22:39:11.000000000 +0000 @@ -86,66 +86,33 @@ }; template -class SpanOrVector { - STACK_ALLOCATED(); - - public: - SpanOrVector() = default; - - // NOLINTNEXTLINE(google-explicit-constructor) - operator base::span() const& { return as_span(); } - operator base::span() const&& = delete; - const base::span as_span() const { return span_.as_span(); } - - void Assign(base::span span) { span_.Assign(span); } - void Assign(Vector vec) { - vector_ = std::move(vec); - span_.Assign( - base::make_span(reinterpret_cast(vector_.data()), - vector_.size() * sizeof(T))); - } - base::span - GetInlineStorage() { - return span_.GetInlineStorage(); - } - - private: - SpanWithInlineStorage span_; - Vector vector_; -}; - -template struct TypedArrayElementTraits {}; -#define DEFINE_TYPED_ARRAY_ELEMENT_TRAITS(type, func, idl_type) \ - template <> \ - struct TypedArrayElementTraits { \ - static bool IsViewOfType(v8::Local value) { \ - return value->func(); \ - } \ - using IDLType = idl_type; \ +#define DEFINE_TYPED_ARRAY_ELEMENT_TRAITS(type, func) \ + template <> \ + struct TypedArrayElementTraits { \ + static bool IsViewOfType(v8::Local value) { \ + return value->func(); \ + } \ } -DEFINE_TYPED_ARRAY_ELEMENT_TRAITS(int8_t, IsInt8Array, IDLByte); +DEFINE_TYPED_ARRAY_ELEMENT_TRAITS(int8_t, IsInt8Array); // Note Uint8 array is special case due to need to account for // Uint8 clamped array, so not declared here. -DEFINE_TYPED_ARRAY_ELEMENT_TRAITS(int16_t, IsInt16Array, IDLShort); -DEFINE_TYPED_ARRAY_ELEMENT_TRAITS(uint16_t, IsUint16Array, IDLUnsignedShort); -DEFINE_TYPED_ARRAY_ELEMENT_TRAITS(int32_t, IsInt32Array, IDLLong); -DEFINE_TYPED_ARRAY_ELEMENT_TRAITS(uint32_t, IsUint32Array, IDLUnsignedLong); -DEFINE_TYPED_ARRAY_ELEMENT_TRAITS(int64_t, IsBigInt64Array, IDLLongLong); -DEFINE_TYPED_ARRAY_ELEMENT_TRAITS(uint64_t, - IsBigUint64Array, - IDLUnsignedLongLong); -DEFINE_TYPED_ARRAY_ELEMENT_TRAITS(float, IsFloat32Array, IDLFloat); -DEFINE_TYPED_ARRAY_ELEMENT_TRAITS(double, IsFloat64Array, IDLDouble); +DEFINE_TYPED_ARRAY_ELEMENT_TRAITS(int16_t, IsInt16Array); +DEFINE_TYPED_ARRAY_ELEMENT_TRAITS(uint16_t, IsUint16Array); +DEFINE_TYPED_ARRAY_ELEMENT_TRAITS(int32_t, IsInt32Array); +DEFINE_TYPED_ARRAY_ELEMENT_TRAITS(uint32_t, IsUint32Array); +DEFINE_TYPED_ARRAY_ELEMENT_TRAITS(int64_t, IsBigInt64Array); +DEFINE_TYPED_ARRAY_ELEMENT_TRAITS(uint64_t, IsBigUint64Array); +DEFINE_TYPED_ARRAY_ELEMENT_TRAITS(float, IsFloat32Array); +DEFINE_TYPED_ARRAY_ELEMENT_TRAITS(double, IsFloat64Array); template <> struct TypedArrayElementTraits { static bool IsViewOfType(v8::Local value) { return value->IsUint8Array() || value->IsUint8ClampedArray(); } - using IDLType = IDLOctet; }; } // namespace bindings::internal @@ -159,7 +126,6 @@ enum Flags { kNone, kAllowShared = 1 << 0, - kAllowSequence = 1 << 1, }; }; @@ -174,18 +140,12 @@ typename T = void> struct PassAsSpan : public PassAsSpanMarkerBase { static constexpr bool allow_shared = flags & Flags::kAllowShared; - static constexpr bool allow_sequence = flags & Flags::kAllowSequence; static constexpr bool is_typed = !std::is_same_v; - - static_assert(is_typed || !allow_sequence); - using ElementType = T; - using ReturnType = std::conditional_t< - allow_sequence, - bindings::internal::SpanOrVector, + using ReturnType = std::conditional_t, - bindings::internal::ByteSpanWithInlineStorage>>; + bindings::internal::ByteSpanWithInlineStorage>; }; } // namespace blink diff -Nru chromium-128.0.6613.84/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py chromium-128.0.6613.113/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py --- chromium-128.0.6613.84/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py 2024-08-21 22:46:26.000000000 +0000 +++ chromium-128.0.6613.113/third_party/blink/renderer/bindings/scripts/bind_gen/blink_v8_bridge.py 2024-08-28 22:39:11.000000000 +0000 @@ -217,13 +217,23 @@ real_type = idl_type.unwrap(typedef=True) - if real_type.is_boolean: - return TypeInfo("bool", - const_ref_fmt="{}", - clear_member_var_fmt="{} = false") - - if real_type.is_numeric: - return TypeInfo(numeric_type(real_type), + if real_type.is_boolean or real_type.is_numeric: + cxx_type = { + "boolean": "bool", + "byte": "int8_t", + "octet": "uint8_t", + "short": "int16_t", + "unsigned short": "uint16_t", + "long": "int32_t", + "unsigned long": "uint32_t", + "long long": "int64_t", + "unsigned long long": "uint64_t", + "float": "float", + "unrestricted float": "float", + "double": "double", + "unrestricted double": "double", + } + return TypeInfo(cxx_type[real_type.keyword_typename], const_ref_fmt="{}", clear_member_var_fmt="{} = 0") @@ -370,13 +380,6 @@ is_traceable=True) if real_type.is_union: - if real_type.is_phantom: - return TypeInfo("v8::Local", - ref_fmt="{}*", - value_fmt="{}", - has_null_value=True, - is_gc_type=True) - typename = blink_class_name(real_type.union_definition_object) return TypeInfo(typename, member_fmt="Member<{}>", @@ -429,38 +432,16 @@ types = real_type.flattened_member_types if real_type.is_union else [ real_type ] - sequence_types = set( - map(lambda t: t.element_type.unwrap(typedef=True), - filter(lambda t: t.is_sequence, types))) - assert len( - sequence_types - ) < 2, "Unions of sequence types of different types are not supported with [PassAsSpan]" - typed_arrays = set(filter(lambda t: t.is_typed_array_type, types)) - assert len( - typed_arrays - ) < 2, "Unions of typed arrays of different types are not supported with [PassAsSpan]" - native_type = None - if typed_arrays: - native_type = typed_array_element_type(list(typed_arrays)[0]) - if sequence_types: - types_are_compatible = numeric_type( - list(sequence_types)[0]) == native_type - assert types_are_compatible, "Sequence and typed array types are incompatible" - else: - assert (not sequence_types - ), "Plain sequence<> types are not supported with [PassAsSpan]" - native_type = "void" - is_buffer_source_type = all(t.is_buffer_source_type for t in types) - assert is_buffer_source_type, "All types must be buffer" - + is_buffer_source_type = all(t.is_buffer_source_type for t in types) + assert is_buffer_source_type, ( + "PassAsSpan is only supported for buffer source types") + native_type = typed_array_element_type( + real_type) if real_type.is_typed_array_type else "void" flags = [] - if sequence_types: - flags.append("PassAsSpanMarkerBase::Flags::kAllowSequence") allow_shared = "AllowShared" in idl_type.effective_annotations or any( "AllowShared" in t.effective_annotations for t in types) if allow_shared: flags.append("PassAsSpanMarkerBase::Flags::kAllowShared") - return [ " | ".join(flags) or "PassAsSpanMarkerBase::Flags::kNone", native_type ] @@ -933,7 +914,7 @@ def typed_array_element_type(idl_type): - assert isinstance(idl_type, web_idl.IdlType), type(idl_type) + assert isinstance(idl_type, web_idl.IdlType) assert idl_type.is_typed_array_type element_type_map = { 'Int8Array': 'int8_t', @@ -949,23 +930,3 @@ 'Float64Array': 'double', } return element_type_map.get(idl_type.keyword_typename) - - -def numeric_type(idl_type): - assert isinstance(idl_type, web_idl.IdlType) - assert idl_type.is_numeric - type_map = { - "byte": "int8_t", - "octet": "uint8_t", - "short": "int16_t", - "unsigned short": "uint16_t", - "long": "int32_t", - "unsigned long": "uint32_t", - "long long": "int64_t", - "unsigned long long": "uint64_t", - "float": "float", - "unrestricted float": "float", - "double": "double", - "unrestricted double": "double", - } - return type_map.get(idl_type.keyword_typename) diff -Nru chromium-128.0.6613.84/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py chromium-128.0.6613.113/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py --- chromium-128.0.6613.84/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py 2024-08-21 22:46:26.000000000 +0000 +++ chromium-128.0.6613.113/third_party/blink/renderer/bindings/scripts/bind_gen/interface.py 2024-08-28 22:39:11.000000000 +0000 @@ -2498,8 +2498,9 @@ def v8_type_and_symbol_node(argument, v8_arg_name, blink_arg_name): unwrapped_idl_type = argument.idl_type.unwrap() - if "PassAsSpan" in argument.idl_type.effective_annotations: - return ("v8::Local", + if unwrapped_idl_type.is_interface or unwrapped_idl_type.is_sequence: + return ("v8::Local" if unwrapped_idl_type.is_interface + else "v8::Local", make_v8_to_blink_value( blink_arg_name, "${{{}}}".format(v8_arg_name), @@ -2507,9 +2508,10 @@ argument=argument, error_exit_return_statement="return;", cg_context=cg_context)) - if unwrapped_idl_type.is_interface or unwrapped_idl_type.is_sequence: - return ("v8::Local" if unwrapped_idl_type.is_interface - else "v8::Local", + elif unwrapped_idl_type.is_typed_array_type: + assert "AllowShared" in argument.idl_type.effective_annotations + assert "PassAsSpan" in argument.idl_type.effective_annotations + return ("v8::Local", make_v8_to_blink_value( blink_arg_name, "${{{}}}".format(v8_arg_name), diff -Nru chromium-128.0.6613.84/third_party/blink/renderer/bindings/scripts/bind_gen/typedef.py chromium-128.0.6613.113/third_party/blink/renderer/bindings/scripts/bind_gen/typedef.py --- chromium-128.0.6613.84/third_party/blink/renderer/bindings/scripts/bind_gen/typedef.py 2024-08-21 22:46:26.000000000 +0000 +++ chromium-128.0.6613.113/third_party/blink/renderer/bindings/scripts/bind_gen/typedef.py 2024-08-28 22:39:11.000000000 +0000 @@ -29,15 +29,13 @@ new_and_old_names = list( map( - lambda typedef: - (blink_class_name(typedef), - blink_class_name(typedef.idl_type.union_definition_object)), + lambda typedef: (blink_class_name(typedef), + blink_class_name(typedef.idl_type. + union_definition_object)), filter( lambda typedef: component_selector( [typedef, typedef.idl_type.union_definition_object]), - filter( - lambda typedef: typedef.idl_type.is_union and not typedef. - idl_type.is_phantom, typedefs)))) + filter(lambda typedef: typedef.idl_type.is_union, typedefs)))) node = ListNode([ TextNode("using {} = {};".format(new_name, old_name)) for new_name, old_name in new_and_old_names diff -Nru chromium-128.0.6613.84/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py chromium-128.0.6613.113/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py --- chromium-128.0.6613.84/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py 2024-08-21 22:46:26.000000000 +0000 +++ chromium-128.0.6613.113/third_party/blink/renderer/bindings/scripts/web_idl/idl_compiler.py 2024-08-28 22:39:11.000000000 +0000 @@ -1015,7 +1015,7 @@ all_union_types = [] # all instances of UnionType def collect_unions(idl_type): - if idl_type.is_union and not idl_type.is_phantom: + if idl_type.is_union: all_union_types.append(idl_type) self._idl_type_factory.for_each(collect_unions) @@ -1031,7 +1031,7 @@ all_typedefs = self._db.find_by_kind(DatabaseBody.Kind.TYPEDEF) for typedef in all_typedefs.values(): - if not typedef.idl_type.is_union or typedef.idl_type.is_phantom: + if not typedef.idl_type.is_union: continue token = Union.unique_token(typedef.idl_type) irs[token].typedefs.append(typedef) diff -Nru chromium-128.0.6613.84/third_party/blink/renderer/bindings/scripts/web_idl/idl_type.py chromium-128.0.6613.113/third_party/blink/renderer/bindings/scripts/web_idl/idl_type.py --- chromium-128.0.6613.84/third_party/blink/renderer/bindings/scripts/web_idl/idl_type.py 2024-08-21 22:46:26.000000000 +0000 +++ chromium-128.0.6613.113/third_party/blink/renderer/bindings/scripts/web_idl/idl_type.py 2024-08-28 22:39:11.000000000 +0000 @@ -1336,14 +1336,6 @@ assert self._union_definition_object is None self._union_definition_object = union_definition_object - @property - def is_phantom(self): - """Returns True if a class for union should not be generated, - as would be the case if enum only exists at the IDL level and - is not passed down to implementation. This can happen when all - enum variants are coerced to a single type.""" - return "PassAsSpan" in self.effective_annotations - class NullableType(IdlType): """https://webidl.spec.whatwg.org/#idl-nullable-type""" diff -Nru chromium-128.0.6613.84/third_party/blink/renderer/core/editing/ime/edit_context.cc chromium-128.0.6613.113/third_party/blink/renderer/core/editing/ime/edit_context.cc --- chromium-128.0.6613.84/third_party/blink/renderer/core/editing/ime/edit_context.cc 2024-08-21 22:46:26.000000000 +0000 +++ chromium-128.0.6613.113/third_party/blink/renderer/core/editing/ime/edit_context.cc 2024-08-28 22:39:11.000000000 +0000 @@ -660,7 +660,7 @@ selection_start_ = start; selection_end_ = end; - if (DomWindow()->GetFrame()) { + if (DomWindow() && DomWindow()->GetFrame()) { DomWindow()->GetFrame()->Client()->DidChangeSelection( /*is_selection_empty=*/selection_start_ == selection_end_, blink::SyncCondition::kNotForced); diff -Nru chromium-128.0.6613.84/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.idl chromium-128.0.6613.113/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.idl --- chromium-128.0.6613.84/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.idl 2024-08-21 22:46:27.000000000 +0000 +++ chromium-128.0.6613.113/third_party/blink/renderer/modules/webgl/webgl2_rendering_context_base.idl 2024-08-28 22:39:12.000000000 +0000 @@ -393,53 +393,118 @@ // called with only two arguments, it goes to the WebGL1 signatures; if it's // called with three or four arguments, it goes to the WebGL2 specific // signatures. - [NoAllocDirectCall] void uniform1fv(WebGLUniformLocation? location, Float32List v, + [NoAllocDirectCall] void uniform1fv(WebGLUniformLocation? location, + [AllowShared, PassAsSpan, BufferSourceTypeNoSizeLimit] Float32Array v, GLuint srcOffset, optional GLuint srcLength = 0); - [NoAllocDirectCall] void uniform2fv(WebGLUniformLocation? location, Float32List v, + [NoAllocDirectCall] void uniform1fv(WebGLUniformLocation? location, sequence v, GLuint srcOffset, optional GLuint srcLength = 0); - [NoAllocDirectCall] void uniform3fv(WebGLUniformLocation? location, Float32List v, + [NoAllocDirectCall] void uniform2fv(WebGLUniformLocation? location, + [AllowShared, PassAsSpan, BufferSourceTypeNoSizeLimit] Float32Array v, GLuint srcOffset, optional GLuint srcLength = 0); - [NoAllocDirectCall] void uniform4fv(WebGLUniformLocation? location, Float32List v, + [NoAllocDirectCall] void uniform2fv(WebGLUniformLocation? location, sequence v, GLuint srcOffset, optional GLuint srcLength = 0); - [NoAllocDirectCall] void uniform1iv(WebGLUniformLocation? location, Int32List v, + [NoAllocDirectCall] void uniform3fv(WebGLUniformLocation? location, + [AllowShared, PassAsSpan, BufferSourceTypeNoSizeLimit] Float32Array v, GLuint srcOffset, optional GLuint srcLength = 0); - [NoAllocDirectCall] void uniform2iv(WebGLUniformLocation? location, Int32List v, + [NoAllocDirectCall] void uniform3fv(WebGLUniformLocation? location, sequence v, GLuint srcOffset, optional GLuint srcLength = 0); - [NoAllocDirectCall] void uniform3iv(WebGLUniformLocation? location, Int32List v, + [NoAllocDirectCall] void uniform4fv(WebGLUniformLocation? location, + [AllowShared, PassAsSpan, BufferSourceTypeNoSizeLimit] Float32Array v, GLuint srcOffset, optional GLuint srcLength = 0); - [NoAllocDirectCall] void uniform4iv(WebGLUniformLocation? location, Int32List v, + [NoAllocDirectCall] void uniform4fv(WebGLUniformLocation? location, sequence v, GLuint srcOffset, optional GLuint srcLength = 0); - [NoAllocDirectCall] void uniform1uiv(WebGLUniformLocation? location, Uint32List v, + [NoAllocDirectCall] void uniform1iv(WebGLUniformLocation? location, + [AllowShared, PassAsSpan, BufferSourceTypeNoSizeLimit] Int32Array v, + GLuint srcOffset, optional GLuint srcLength = 0); + [NoAllocDirectCall] void uniform1iv(WebGLUniformLocation? location, sequence v, + GLuint srcOffset, optional GLuint srcLength = 0); + [NoAllocDirectCall] void uniform2iv(WebGLUniformLocation? location, + [AllowShared, PassAsSpan] Int32Array v, + GLuint srcOffset, optional GLuint srcLength = 0); + [NoAllocDirectCall] void uniform2iv(WebGLUniformLocation? location, sequence v, + GLuint srcOffset, optional GLuint srcLength = 0); + [NoAllocDirectCall] void uniform3iv(WebGLUniformLocation? location, + [AllowShared, PassAsSpan] Int32Array v, + GLuint srcOffset, optional GLuint srcLength = 0); + [NoAllocDirectCall] void uniform3iv(WebGLUniformLocation? location, sequence v, + GLuint srcOffset, optional GLuint srcLength = 0); + [NoAllocDirectCall] void uniform4iv(WebGLUniformLocation? location, + [AllowShared, PassAsSpan] Int32Array v, + GLuint srcOffset, optional GLuint srcLength = 0); + [NoAllocDirectCall] void uniform4iv(WebGLUniformLocation? location, sequence v, + GLuint srcOffset, optional GLuint srcLength = 0); + [NoAllocDirectCall] void uniform1uiv(WebGLUniformLocation? location, + [AllowShared, PassAsSpan] Uint32Array v, + optional GLuint srcOffset = 0, optional GLuint srcLength = 0); + [NoAllocDirectCall] void uniform1uiv(WebGLUniformLocation? location, sequence v, + optional GLuint srcOffset = 0, optional GLuint srcLength = 0); + [NoAllocDirectCall] void uniform2uiv(WebGLUniformLocation? location, + [AllowShared, PassAsSpan] Uint32Array v, + optional GLuint srcOffset = 0, optional GLuint srcLength = 0); + [NoAllocDirectCall] void uniform2uiv(WebGLUniformLocation? location, sequence v, optional GLuint srcOffset = 0, optional GLuint srcLength = 0); - [NoAllocDirectCall] void uniform2uiv(WebGLUniformLocation? location, Uint32List v, + [NoAllocDirectCall] void uniform3uiv(WebGLUniformLocation? location, + [AllowShared, PassAsSpan] Uint32Array v, optional GLuint srcOffset = 0, optional GLuint srcLength = 0); - [NoAllocDirectCall] void uniform3uiv(WebGLUniformLocation? location, Uint32List v, + [NoAllocDirectCall] void uniform3uiv(WebGLUniformLocation? location, sequence v, optional GLuint srcOffset = 0, optional GLuint srcLength = 0); - [NoAllocDirectCall] void uniform4uiv(WebGLUniformLocation? location, Uint32List v, + [NoAllocDirectCall] void uniform4uiv(WebGLUniformLocation? location, + [AllowShared, PassAsSpan] Uint32Array v, optional GLuint srcOffset = 0, optional GLuint srcLength = 0); - [NoAllocDirectCall] void uniformMatrix2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List array, + [NoAllocDirectCall] void uniform4uiv(WebGLUniformLocation? location, sequence v, + optional GLuint srcOffset = 0, optional GLuint srcLength = 0); + [NoAllocDirectCall] void uniformMatrix2fv(WebGLUniformLocation? location, GLboolean transpose, + [AllowShared, PassAsSpan] Float32Array array, + GLuint srcOffset, optional GLuint srcLength = 0); + [NoAllocDirectCall] void uniformMatrix2fv(WebGLUniformLocation? location, GLboolean transpose, sequence array, + GLuint srcOffset, optional GLuint srcLength = 0); + [NoAllocDirectCall] void uniformMatrix3fv(WebGLUniformLocation? location, GLboolean transpose, + [AllowShared, PassAsSpan] Float32Array array, GLuint srcOffset, optional GLuint srcLength = 0); - [NoAllocDirectCall] void uniformMatrix3fv(WebGLUniformLocation? location, GLboolean transpose, Float32List array, + [NoAllocDirectCall] void uniformMatrix3fv(WebGLUniformLocation? location, GLboolean transpose, sequence array, GLuint srcOffset, optional GLuint srcLength = 0); - [NoAllocDirectCall] void uniformMatrix4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List array, + [NoAllocDirectCall] void uniformMatrix4fv(WebGLUniformLocation? location, GLboolean transpose, + [AllowShared, PassAsSpan] Float32Array array, GLuint srcOffset, optional GLuint srcLength = 0); - [NoAllocDirectCall] void uniformMatrix2x3fv(WebGLUniformLocation? location, GLboolean transpose, Float32List value, + [NoAllocDirectCall] void uniformMatrix4fv(WebGLUniformLocation? location, GLboolean transpose, sequence array, + GLuint srcOffset, optional GLuint srcLength = 0); + [NoAllocDirectCall] void uniformMatrix2x3fv(WebGLUniformLocation? location, GLboolean transpose, + [AllowShared, PassAsSpan] Float32Array value, + optional GLuint srcOffset = 0, optional GLuint srcLength = 0); + [NoAllocDirectCall] void uniformMatrix2x3fv(WebGLUniformLocation? location, GLboolean transpose, sequence value, + optional GLuint srcOffset = 0, optional GLuint srcLength = 0); + [NoAllocDirectCall] void uniformMatrix3x2fv(WebGLUniformLocation? location, GLboolean transpose, + [AllowShared, PassAsSpan] Float32Array value, + optional GLuint srcOffset = 0, optional GLuint srcLength = 0); + [NoAllocDirectCall] void uniformMatrix3x2fv(WebGLUniformLocation? location, GLboolean transpose, sequence value, + optional GLuint srcOffset = 0, optional GLuint srcLength = 0); + [NoAllocDirectCall] void uniformMatrix2x4fv(WebGLUniformLocation? location, GLboolean transpose, + [AllowShared, PassAsSpan] Float32Array value, + optional GLuint srcOffset = 0, optional GLuint srcLength = 0); + [NoAllocDirectCall] void uniformMatrix2x4fv(WebGLUniformLocation? location, GLboolean transpose, sequence value, + optional GLuint srcOffset = 0, optional GLuint srcLength = 0); + [NoAllocDirectCall] void uniformMatrix4x2fv(WebGLUniformLocation? location, GLboolean transpose, + [AllowShared, PassAsSpan] Float32Array value, optional GLuint srcOffset = 0, optional GLuint srcLength = 0); - [NoAllocDirectCall] void uniformMatrix3x2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List value, + [NoAllocDirectCall] void uniformMatrix4x2fv(WebGLUniformLocation? location, GLboolean transpose, sequence value, optional GLuint srcOffset = 0, optional GLuint srcLength = 0); - [NoAllocDirectCall] void uniformMatrix2x4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List value, + [NoAllocDirectCall] void uniformMatrix3x4fv(WebGLUniformLocation? location, GLboolean transpose, + [AllowShared, PassAsSpan] Float32Array value, optional GLuint srcOffset = 0, optional GLuint srcLength = 0); - [NoAllocDirectCall] void uniformMatrix4x2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List value, + [NoAllocDirectCall] void uniformMatrix3x4fv(WebGLUniformLocation? location, GLboolean transpose, sequence value, optional GLuint srcOffset = 0, optional GLuint srcLength = 0); - [NoAllocDirectCall] void uniformMatrix3x4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List value, + [NoAllocDirectCall] void uniformMatrix4x3fv(WebGLUniformLocation? location, GLboolean transpose, + [AllowShared, PassAsSpan] Float32Array value, optional GLuint srcOffset = 0, optional GLuint srcLength = 0); - [NoAllocDirectCall] void uniformMatrix4x3fv(WebGLUniformLocation? location, GLboolean transpose, Float32List value, + [NoAllocDirectCall] void uniformMatrix4x3fv(WebGLUniformLocation? location, GLboolean transpose, sequence value, optional GLuint srcOffset = 0, optional GLuint srcLength = 0); void vertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w); - [NoAllocDirectCall] void vertexAttribI4iv(GLuint index, Int32List v); + [NoAllocDirectCall] void vertexAttribI4iv(GLuint index, [AllowShared, PassAsSpan] Int32Array v); + [NoAllocDirectCall] void vertexAttribI4iv(GLuint index, sequence v); void vertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w); - [NoAllocDirectCall] void vertexAttribI4uiv(GLuint index, Uint32List v); + [NoAllocDirectCall] void vertexAttribI4uiv(GLuint index, [AllowShared, PassAsSpan] Uint32Array v); + [NoAllocDirectCall] void vertexAttribI4uiv(GLuint index, sequence v); void vertexAttribIPointer(GLuint index, GLint size, GLenum type, GLsizei stride, GLintptr offset); /* Writing to the drawing buffer */ @@ -450,10 +515,15 @@ /* Multiple Render Targets */ [NoAllocDirectCall] void drawBuffers(sequence buffers); - [NoAllocDirectCall] void clearBufferiv(GLenum buffer, GLint drawbuffer, Int32List value, optional GLuint srcOffset = 0); + [NoAllocDirectCall] void clearBufferiv(GLenum buffer, GLint drawbuffer, + [AllowShared, PassAsSpan] Int32Array value, optional GLuint srcOffset = 0); + [NoAllocDirectCall] void clearBufferiv(GLenum buffer, GLint drawbuffer, sequence value, optional GLuint srcOffset = 0); [NoAllocDirectCall] void clearBufferuiv(GLenum buffer, GLint drawbuffer, - Uint32List value, optional GLuint srcOffset = 0); - [NoAllocDirectCall] void clearBufferfv(GLenum buffer, GLint drawbuffer, Float32List value, optional GLuint srcOffset = 0); + [AllowShared, PassAsSpan] Uint32Array value, optional GLuint srcOffset = 0); + [NoAllocDirectCall] void clearBufferuiv(GLenum buffer, GLint drawbuffer, sequence value, optional GLuint srcOffset = 0); + [NoAllocDirectCall] void clearBufferfv(GLenum buffer, GLint drawbuffer, + [AllowShared, PassAsSpan] Float32Array value, optional GLuint srcOffset = 0); + [NoAllocDirectCall] void clearBufferfv(GLenum buffer, GLint drawbuffer, sequence value, optional GLuint srcOffset = 0); [NoAllocDirectCall] void clearBufferfi(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil); /* Query Objects */ diff -Nru chromium-128.0.6613.84/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.idl chromium-128.0.6613.113/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.idl --- chromium-128.0.6613.84/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.idl 2024-08-21 22:46:27.000000000 +0000 +++ chromium-128.0.6613.113/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.idl 2024-08-28 22:39:12.000000000 +0000 @@ -39,9 +39,6 @@ typedef unsigned long GLuint; typedef unrestricted float GLfloat; typedef unrestricted float GLclampf; -typedef [PassAsSpan] ([AllowShared, BufferSourceTypeNoSizeLimit] Float32Array or sequence) Float32List; -typedef [PassAsSpan] ([AllowShared, BufferSourceTypeNoSizeLimit] Int32Array or sequence) Int32List; -typedef [PassAsSpan] ([AllowShared, BufferSourceTypeNoSizeLimit] Uint32Array or sequence) Uint32List; interface mixin WebGLRenderingContextBase { @@ -488,10 +485,10 @@ void bufferData(GLenum target, GLsizeiptr size, GLenum usage); void bufferData(GLenum target, [AllowShared, BufferSourceTypeNoSizeLimit] ArrayBufferView data, GLenum usage); void bufferData(GLenum target, [AllowShared, BufferSourceTypeNoSizeLimit] ArrayBuffer? data, GLenum usage); + void bufferSubData(GLenum target, GLintptr offset, + [AllowShared, PassAsSpan] BufferSource data); GLenum checkFramebufferStatus(GLenum target); - void bufferSubData(GLenum target, GLintptr offset, - [AllowShared, PassAsSpan, BufferSourceTypeNoSizeLimit] BufferSource data); [NoAllocDirectCall] void clear(GLbitfield mask); [NoAllocDirectCall] void clearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha); [NoAllocDirectCall] void clearDepth(GLclampf depth); @@ -671,37 +668,63 @@ GLenum format, GLenum type, VideoFrame frame); [NoAllocDirectCall] void uniform1f(WebGLUniformLocation? location, GLfloat x); - [NoAllocDirectCall] void uniform1fv(WebGLUniformLocation? location, Float32List v); + [NoAllocDirectCall] void uniform1fv(WebGLUniformLocation? location, + [AllowShared, PassAsSpan, BufferSourceTypeNoSizeLimit] Float32Array v); + [NoAllocDirectCall] void uniform1fv(WebGLUniformLocation? location, sequence v); [NoAllocDirectCall] void uniform1i(WebGLUniformLocation? location, GLint x); - [NoAllocDirectCall] void uniform1iv(WebGLUniformLocation? location, Int32List v); + [NoAllocDirectCall] void uniform1iv(WebGLUniformLocation? location, + [AllowShared, PassAsSpan, BufferSourceTypeNoSizeLimit] Int32Array v); + [NoAllocDirectCall] void uniform1iv(WebGLUniformLocation? location, sequence v); [NoAllocDirectCall] void uniform2f(WebGLUniformLocation? location, GLfloat x, GLfloat y); - [NoAllocDirectCall] void uniform2fv(WebGLUniformLocation? location, Float32List v); + [NoAllocDirectCall] void uniform2fv(WebGLUniformLocation? location, + [AllowShared, PassAsSpan] Float32Array v); + [NoAllocDirectCall] void uniform2fv(WebGLUniformLocation? location, sequence v); [NoAllocDirectCall] void uniform2i(WebGLUniformLocation? location, GLint x, GLint y); - [NoAllocDirectCall] void uniform2iv(WebGLUniformLocation? location, Int32List v); + [NoAllocDirectCall] void uniform2iv(WebGLUniformLocation? location, + [AllowShared, PassAsSpan] Int32Array v); + [NoAllocDirectCall] void uniform2iv(WebGLUniformLocation? location, sequence v); [NoAllocDirectCall] void uniform3f(WebGLUniformLocation? location, GLfloat x, GLfloat y, GLfloat z); - [NoAllocDirectCall] void uniform3fv(WebGLUniformLocation? location, Float32List v); + [NoAllocDirectCall] void uniform3fv(WebGLUniformLocation? location, + [AllowShared, PassAsSpan] Float32Array v); + [NoAllocDirectCall] void uniform3fv(WebGLUniformLocation? location, sequence v); [NoAllocDirectCall] void uniform3i(WebGLUniformLocation? location, GLint x, GLint y, GLint z); - [NoAllocDirectCall] void uniform3iv(WebGLUniformLocation? location, Int32List v); + [NoAllocDirectCall] void uniform3iv(WebGLUniformLocation? location, + [AllowShared, PassAsSpan] Int32Array v); + [NoAllocDirectCall] void uniform3iv(WebGLUniformLocation? location, sequence v); [NoAllocDirectCall] void uniform4f(WebGLUniformLocation? location, GLfloat x, GLfloat y, GLfloat z, GLfloat w); - [NoAllocDirectCall] void uniform4fv(WebGLUniformLocation? location, Float32List v); + [NoAllocDirectCall] void uniform4fv(WebGLUniformLocation? location, + [AllowShared, PassAsSpan] Float32Array v); + [NoAllocDirectCall] void uniform4fv(WebGLUniformLocation? location, sequence v); [NoAllocDirectCall] void uniform4i(WebGLUniformLocation? location, GLint x, GLint y, GLint z, GLint w); - [NoAllocDirectCall] void uniform4iv(WebGLUniformLocation? location, Int32List v); - - [NoAllocDirectCall] void uniformMatrix2fv(WebGLUniformLocation? location, GLboolean transpose, Float32List array); - [NoAllocDirectCall] void uniformMatrix3fv(WebGLUniformLocation? location, GLboolean transpose, Float32List array); - [NoAllocDirectCall] void uniformMatrix4fv(WebGLUniformLocation? location, GLboolean transpose, Float32List array); + [NoAllocDirectCall] void uniform4iv(WebGLUniformLocation? location, + [AllowShared, PassAsSpan] Int32Array v); + [NoAllocDirectCall] void uniform4iv(WebGLUniformLocation? location, sequence v); + + [NoAllocDirectCall] void uniformMatrix2fv(WebGLUniformLocation? location, GLboolean transpose, + [AllowShared, PassAsSpan] Float32Array array); + [NoAllocDirectCall] void uniformMatrix2fv(WebGLUniformLocation? location, GLboolean transpose, sequence array); + [NoAllocDirectCall] void uniformMatrix3fv(WebGLUniformLocation? location, GLboolean transpose, + [AllowShared, PassAsSpan] Float32Array array); + [NoAllocDirectCall] void uniformMatrix3fv(WebGLUniformLocation? location, GLboolean transpose, sequence array); + [NoAllocDirectCall] void uniformMatrix4fv(WebGLUniformLocation? location, GLboolean transpose, + [AllowShared, PassAsSpan] Float32Array array); + [NoAllocDirectCall] void uniformMatrix4fv(WebGLUniformLocation? location, GLboolean transpose, sequence array); void useProgram(WebGLProgram? program); void validateProgram(WebGLProgram program); [NoAllocDirectCall] void vertexAttrib1f(GLuint indx, GLfloat x); - void vertexAttrib1fv(GLuint indx, Float32List values); + [NoAllocDirectCall] void vertexAttrib1fv(GLuint indx, [AllowShared, PassAsSpan] Float32Array values); + [NoAllocDirectCall] void vertexAttrib1fv(GLuint indx, sequence values); [NoAllocDirectCall] void vertexAttrib2f(GLuint indx, GLfloat x, GLfloat y); - void vertexAttrib2fv(GLuint indx, Float32List values); + [NoAllocDirectCall] void vertexAttrib2fv(GLuint indx, [AllowShared, PassAsSpan] Float32Array values); + [NoAllocDirectCall] void vertexAttrib2fv(GLuint indx, sequence values); [NoAllocDirectCall] void vertexAttrib3f(GLuint indx, GLfloat x, GLfloat y, GLfloat z); - void vertexAttrib3fv(GLuint indx, Float32List values); + [NoAllocDirectCall] void vertexAttrib3fv(GLuint indx, [AllowShared, PassAsSpan] Float32Array values); + [NoAllocDirectCall] void vertexAttrib3fv(GLuint indx, sequence values); [NoAllocDirectCall] void vertexAttrib4f(GLuint indx, GLfloat x, GLfloat y, GLfloat z, GLfloat w); - void vertexAttrib4fv(GLuint indx, Float32List values); + [NoAllocDirectCall] void vertexAttrib4fv(GLuint indx, [AllowShared, PassAsSpan] Float32Array values); + [NoAllocDirectCall] void vertexAttrib4fv(GLuint indx, sequence values); [NoAllocDirectCall] void vertexAttribPointer(GLuint indx, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset); diff -Nru chromium-128.0.6613.84/third_party/blink/renderer/platform/fonts/win/font_fallback_win.cc chromium-128.0.6613.113/third_party/blink/renderer/platform/fonts/win/font_fallback_win.cc --- chromium-128.0.6613.84/third_party/blink/renderer/platform/fonts/win/font_fallback_win.cc 2024-08-21 22:46:28.000000000 +0000 +++ chromium-128.0.6613.113/third_party/blink/renderer/platform/fonts/win/font_fallback_win.cc 2024-08-28 22:39:12.000000000 +0000 @@ -403,10 +403,12 @@ static const char* const kEmojiFonts[] = {"Segoe UI Emoji", "Segoe UI Symbol"}; static const char* emoji_font = nullptr; - static std::once_flag once_flag; - std::call_once(once_flag, [&] { + // `std::once()` may cause hangs. crbug.com/349456407 + static bool initialized = false; + if (!initialized) { emoji_font = FirstAvailableFont(kEmojiFonts, font_manager); - }); + initialized = true; + } return emoji_font; } @@ -414,17 +416,24 @@ static const char* const kMathFonts[] = {"Cambria Math", "Segoe UI Symbol", "Code2000"}; static const char* math_font = nullptr; - static std::once_flag once_flag; - std::call_once(once_flag, [&] { + // `std::once()` may cause hangs. crbug.com/349456407 + static bool initialized = false; + if (!initialized) { math_font = FirstAvailableFont(kMathFonts, font_manager); - }); + initialized = true; + } return math_font; } const AtomicString& GetEmojiFont(const SkFontMgr& font_manager) { - DEFINE_THREAD_SAFE_STATIC_LOCAL(AtomicString, kEmojiFont, - (FirstAvailableEmojiFont(font_manager))); - return kEmojiFont; + // Calling `FirstAvailableEmojiFont()` from `DEFINE_THREAD_SAFE_STATIC_LOCAL` + // may cause hangs. crbug.com/349456407 + DEFINE_THREAD_SAFE_STATIC_LOCAL(AtomicString, emoji_font, (g_empty_atom)); + if (emoji_font.empty() && !emoji_font.IsNull()) { + emoji_font = AtomicString(FirstAvailableEmojiFont(font_manager)); + CHECK(!emoji_font.empty() || emoji_font.IsNull()); + } + return emoji_font; } const AtomicString& GetFontBasedOnUnicodeBlock(UBlockCode block_code, diff -Nru chromium-128.0.6613.84/third_party/dawn/DEPS chromium-128.0.6613.113/third_party/dawn/DEPS --- chromium-128.0.6613.84/third_party/dawn/DEPS 2024-08-21 22:47:51.000000000 +0000 +++ chromium-128.0.6613.113/third_party/dawn/DEPS 2024-08-28 22:40:39.000000000 +0000 @@ -332,7 +332,7 @@ }, 'third_party/dxc': { - 'url': '{chromium_git}/external/github.com/microsoft/DirectXShaderCompiler@4a3a5dad437cc2f2400cdbdf1ccc9aaadffef0e2', + 'url': '{chromium_git}/external/github.com/microsoft/DirectXShaderCompiler@3ea0e7f6b5f464814d6b896eaf69cbd5ebe7fac4', }, 'third_party/dxheaders': { diff -Nru chromium-128.0.6613.84/third_party/dawn/third_party/dxc/lib/Transforms/Scalar/ScalarReplAggregatesHLSL.cpp chromium-128.0.6613.113/third_party/dawn/third_party/dxc/lib/Transforms/Scalar/ScalarReplAggregatesHLSL.cpp --- chromium-128.0.6613.84/third_party/dawn/third_party/dxc/lib/Transforms/Scalar/ScalarReplAggregatesHLSL.cpp 2024-08-21 22:48:02.000000000 +0000 +++ chromium-128.0.6613.113/third_party/dawn/third_party/dxc/lib/Transforms/Scalar/ScalarReplAggregatesHLSL.cpp 2024-08-28 22:40:50.000000000 +0000 @@ -3728,7 +3728,9 @@ // I is the last inst in the block after split. // Any inst in current block is before I. if (LoadInst *LI = dyn_cast(UI)) { - LI->replaceAllUsesWith(ConstantAggregateZero::get(LI->getType())); + // Replace uses of the load with a constant zero. + Constant *replacement = Constant::getNullValue(LI->getType()); + LI->replaceAllUsesWith(replacement); LI->eraseFromParent(); continue; } diff -Nru chromium-128.0.6613.84/third_party/dawn/third_party/dxc/tools/clang/test/DXC/Passes/ScalarReplHLSL/scalarrepl-param-hlsl-entry-replace-zero-recurse-to-float.ll chromium-128.0.6613.113/third_party/dawn/third_party/dxc/tools/clang/test/DXC/Passes/ScalarReplHLSL/scalarrepl-param-hlsl-entry-replace-zero-recurse-to-float.ll --- chromium-128.0.6613.84/third_party/dawn/third_party/dxc/tools/clang/test/DXC/Passes/ScalarReplHLSL/scalarrepl-param-hlsl-entry-replace-zero-recurse-to-float.ll 1970-01-01 00:00:00.000000000 +0000 +++ chromium-128.0.6613.113/third_party/dawn/third_party/dxc/tools/clang/test/DXC/Passes/ScalarReplHLSL/scalarrepl-param-hlsl-entry-replace-zero-recurse-to-float.ll 2024-08-28 22:40:51.000000000 +0000 @@ -0,0 +1,125 @@ +; RUN: %dxopt %s -hlsl-passes-resume -scalarrepl-param-hlsl -S | FileCheck %s + +; The pass replaces a memcpy from a zero-initialized global that does not have an +; intervening store in the entry block. +; When tracing through geps and bitcasts of uses of that global, the algorithm might +; bottom out at replacing a load of a scalar float. Verify this works. + +; In the following code, %1 should be replaced by int 0 +; %1 = load float, float* %arrayidx,... +; It only has one use: being stored to one of the elements of @arr_var + +; CHECK-LABEL: entry: +; CHECK: [[DEST:%[a-z0-9\.]+]] = getelementptr inbounds [4 x float], [4 x float]* %zero_arr, i32 0, i32 0 +; CHECK-NEXT: store float 0.000000e+00, float* [[DEST]] + +; Generated from compiling the following HLSL: +; static int arr_var[4] = (int[4])0; +; +; [numthreads(1, 1, 1)] +; void main() { +; int i32_var = 0; +; int f32_var = arr_var[i32_var]; +; int zero_arr[4] = (int[4])0; +; arr_var = zero_arr; +; } + +; +; Buffer Definitions: +; +; cbuffer $Globals +; { +; +; [0 x i8] (type annotation not present) +; +; } +; +; +; Resource Bindings: +; +; Name Type Format Dim ID HLSL Bind Count +; ------------------------------ ---------- ------- ----------- ------- -------------- ------ +; $Globals cbuffer NA NA CB0 cb4294967295 1 +; +target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64" +target triple = "dxil-ms-dx" + +%ConstantBuffer = type opaque + +@arr_var = internal global [4 x float] zeroinitializer, align 4 +@"$Globals" = external constant %ConstantBuffer + +; Function Attrs: nounwind +define void @main() #0 { +entry: + %i32_var = alloca i32, align 4 + %f32_var = alloca float, align 4 + %zero_arr = alloca [4 x float], align 4 + store i32 0, i32* %i32_var, align 4, !dbg !17, !tbaa !21 ; line:5 col:7 + %0 = load i32, i32* %i32_var, align 4, !dbg !25, !tbaa !21 ; line:6 col:27 + %arrayidx = getelementptr inbounds [4 x float], [4 x float]* @arr_var, i32 0, i32 %0, !dbg !26 ; line:6 col:19 + %1 = load float, float* %arrayidx, align 4, !dbg !26, !tbaa !27 ; line:6 col:19 + store float %1, float* %f32_var, align 4, !dbg !29, !tbaa !27 ; line:6 col:9 + %2 = getelementptr inbounds [4 x float], [4 x float]* %zero_arr, i32 0, i32 0, !dbg !30 ; line:7 col:33 + store float 0.000000e+00, float* %2, !dbg !30 ; line:7 col:33 + %3 = getelementptr inbounds [4 x float], [4 x float]* %zero_arr, i32 0, i32 1, !dbg !30 ; line:7 col:33 + store float 0.000000e+00, float* %3, !dbg !30 ; line:7 col:33 + %4 = getelementptr inbounds [4 x float], [4 x float]* %zero_arr, i32 0, i32 2, !dbg !30 ; line:7 col:33 + store float 0.000000e+00, float* %4, !dbg !30 ; line:7 col:33 + %5 = getelementptr inbounds [4 x float], [4 x float]* %zero_arr, i32 0, i32 3, !dbg !30 ; line:7 col:33 + store float 0.000000e+00, float* %5, !dbg !30 ; line:7 col:33 + %6 = bitcast [4 x float]* @arr_var to i8*, !dbg !31 ; line:8 col:13 + %7 = bitcast [4 x float]* %zero_arr to i8*, !dbg !31 ; line:8 col:13 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* %6, i8* %7, i64 16, i32 1, i1 false), !dbg !31 ; line:8 col:13 + ret void, !dbg !32 ; line:9 col:1 +} + +; Function Attrs: nounwind +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) #0 + +attributes #0 = { nounwind } + +!llvm.module.flags = !{!0} +!pauseresume = !{!1} +!llvm.ident = !{!2} +!dx.version = !{!3} +!dx.valver = !{!4} +!dx.shaderModel = !{!5} +!dx.typeAnnotations = !{!6} +!dx.entryPoints = !{!10} +!dx.fnprops = !{!14} +!dx.options = !{!15, !16} + +!0 = !{i32 2, !"Debug Info Version", i32 3} +!1 = !{!"hlsl-hlemit", !"hlsl-hlensure"} +!2 = !{!"dxc(private) 1.8.0.4666 (759e9e1da-dirty)"} +!3 = !{i32 1, i32 0} +!4 = !{i32 1, i32 8} +!5 = !{!"cs", i32 6, i32 0} +!6 = !{i32 1, void ()* @main, !7} +!7 = !{!8} +!8 = !{i32 1, !9, !9} +!9 = !{} +!10 = !{void ()* @main, !"main", null, !11, null} +!11 = !{null, null, !12, null} +!12 = !{!13} +!13 = !{i32 0, %ConstantBuffer* @"$Globals", !"$Globals", i32 0, i32 -1, i32 1, i32 0, null} +!14 = !{void ()* @main, i32 5, i32 1, i32 1, i32 1} +!15 = !{i32 64} +!16 = !{i32 -1} +!17 = !DILocation(line: 5, column: 7, scope: !18) +!18 = !DISubprogram(name: "main", scope: !19, file: !19, line: 4, type: !20, isLocal: false, isDefinition: true, scopeLine: 4, flags: DIFlagPrototyped, isOptimized: false, function: void ()* @main) +!19 = !DIFile(filename: "/mnt/c/Users/amaiorano/Downloads/356423093/356423093_reduced.hlsl", directory: "") +!20 = !DISubroutineType(types: !9) +!21 = !{!22, !22, i64 0} +!22 = !{!"int", !23, i64 0} +!23 = !{!"omnipotent char", !24, i64 0} +!24 = !{!"Simple C/C++ TBAA"} +!25 = !DILocation(line: 6, column: 27, scope: !18) +!26 = !DILocation(line: 6, column: 19, scope: !18) +!27 = !{!28, !28, i64 0} +!28 = !{!"float", !23, i64 0} +!29 = !DILocation(line: 6, column: 9, scope: !18) +!30 = !DILocation(line: 7, column: 33, scope: !18) +!31 = !DILocation(line: 8, column: 13, scope: !18) +!32 = !DILocation(line: 9, column: 1, scope: !18) diff -Nru chromium-128.0.6613.84/third_party/dawn/third_party/dxc/tools/clang/test/DXC/Passes/ScalarReplHLSL/scalarrepl-param-hlsl-entry-replace-zero-recurse-to-int.ll chromium-128.0.6613.113/third_party/dawn/third_party/dxc/tools/clang/test/DXC/Passes/ScalarReplHLSL/scalarrepl-param-hlsl-entry-replace-zero-recurse-to-int.ll --- chromium-128.0.6613.84/third_party/dawn/third_party/dxc/tools/clang/test/DXC/Passes/ScalarReplHLSL/scalarrepl-param-hlsl-entry-replace-zero-recurse-to-int.ll 1970-01-01 00:00:00.000000000 +0000 +++ chromium-128.0.6613.113/third_party/dawn/third_party/dxc/tools/clang/test/DXC/Passes/ScalarReplHLSL/scalarrepl-param-hlsl-entry-replace-zero-recurse-to-int.ll 2024-08-28 22:40:51.000000000 +0000 @@ -0,0 +1,122 @@ +; RUN: %dxopt %s -hlsl-passes-resume -scalarrepl-param-hlsl -S | FileCheck %s + +; The pass replaces a memcpy from a zero-initialized global that does not have an intervening store. +; When tracing through geps and bitcasts of uses of that global, the algorithm might +; bottom out at replacing a load of a scalar float. Verify this works. + +; In the following code, %1 should be replaced by int 0 +; %1 = load i32, i32* %arrayidx,... +; It only has one use: being stored to one of the elements of @g_1 + +; CHECK-LABEL: entry: +; CHECK: [[DEST:%[a-z0-9\.]+]] = getelementptr inbounds [4 x i32], [4 x i32]* %zero_arr, i32 0, i32 0 +; CHECK-NEXT: store i32 0, i32* [[DEST]] + +; Generated from compiling the following HLSL: +; static int arr_var[4] = (int[4])0; +; +; [numthreads(1, 1, 1)] +; void main() { +; int i32_var = 0; +; int f32_var = arr_var[i32_var]; +; int zero_arr[4] = (int[4])0; +; arr_var = zero_arr; +; } + +; +; Buffer Definitions: +; +; cbuffer $Globals +; { +; +; [0 x i8] (type annotation not present) +; +; } +; +; +; Resource Bindings: +; +; Name Type Format Dim ID HLSL Bind Count +; ------------------------------ ---------- ------- ----------- ------- -------------- ------ +; $Globals cbuffer NA NA CB0 cb4294967295 1 +; +target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64" +target triple = "dxil-ms-dx" + +%ConstantBuffer = type opaque + +@arr_var = internal global [4 x i32] zeroinitializer, align 4 +@"$Globals" = external constant %ConstantBuffer + +; Function Attrs: nounwind +define void @main() #0 { +entry: + %i32_var = alloca i32, align 4 + %f32_var = alloca i32, align 4 + %zero_arr = alloca [4 x i32], align 4 + store i32 0, i32* %i32_var, align 4, !dbg !17, !tbaa !21 ; line:16 col:7 + %0 = load i32, i32* %i32_var, align 4, !dbg !25, !tbaa !21 ; line:17 col:25 + %arrayidx = getelementptr inbounds [4 x i32], [4 x i32]* @arr_var, i32 0, i32 %0, !dbg !26 ; line:17 col:17 + %1 = load i32, i32* %arrayidx, align 4, !dbg !26, !tbaa !21 ; line:17 col:17 + store i32 %1, i32* %f32_var, align 4, !dbg !27, !tbaa !21 ; line:17 col:7 + %2 = getelementptr inbounds [4 x i32], [4 x i32]* %zero_arr, i32 0, i32 0, !dbg !28 ; line:18 col:29 + store i32 0, i32* %2, !dbg !28 ; line:18 col:29 + %3 = getelementptr inbounds [4 x i32], [4 x i32]* %zero_arr, i32 0, i32 1, !dbg !28 ; line:18 col:29 + store i32 0, i32* %3, !dbg !28 ; line:18 col:29 + %4 = getelementptr inbounds [4 x i32], [4 x i32]* %zero_arr, i32 0, i32 2, !dbg !28 ; line:18 col:29 + store i32 0, i32* %4, !dbg !28 ; line:18 col:29 + %5 = getelementptr inbounds [4 x i32], [4 x i32]* %zero_arr, i32 0, i32 3, !dbg !28 ; line:18 col:29 + store i32 0, i32* %5, !dbg !28 ; line:18 col:29 + %6 = bitcast [4 x i32]* @arr_var to i8*, !dbg !29 ; line:19 col:13 + %7 = bitcast [4 x i32]* %zero_arr to i8*, !dbg !29 ; line:19 col:13 + call void @llvm.memcpy.p0i8.p0i8.i64(i8* %6, i8* %7, i64 16, i32 1, i1 false), !dbg !29 ; line:19 col:13 + ret void, !dbg !30 ; line:20 col:1 +} + +; Function Attrs: nounwind +declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) #0 + +attributes #0 = { nounwind } + +!llvm.module.flags = !{!0} +!pauseresume = !{!1} +!llvm.ident = !{!2} +!dx.version = !{!3} +!dx.valver = !{!4} +!dx.shaderModel = !{!5} +!dx.typeAnnotations = !{!6} +!dx.entryPoints = !{!10} +!dx.fnprops = !{!14} +!dx.options = !{!15, !16} + +!0 = !{i32 2, !"Debug Info Version", i32 3} +!1 = !{!"hlsl-hlemit", !"hlsl-hlensure"} +!2 = !{!"dxc(private) 1.8.0.4666 (759e9e1da-dirty)"} +!3 = !{i32 1, i32 0} +!4 = !{i32 1, i32 8} +!5 = !{!"cs", i32 6, i32 0} +!6 = !{i32 1, void ()* @main, !7} +!7 = !{!8} +!8 = !{i32 1, !9, !9} +!9 = !{} +!10 = !{void ()* @main, !"main", null, !11, null} +!11 = !{null, null, !12, null} +!12 = !{!13} +!13 = !{i32 0, %ConstantBuffer* @"$Globals", !"$Globals", i32 0, i32 -1, i32 1, i32 0, null} +!14 = !{void ()* @main, i32 5, i32 1, i32 1, i32 1} +!15 = !{i32 64} +!16 = !{i32 -1} +!17 = !DILocation(line: 16, column: 7, scope: !18) +!18 = !DISubprogram(name: "main", scope: !19, file: !19, line: 15, type: !20, isLocal: false, isDefinition: true, scopeLine: 15, flags: DIFlagPrototyped, isOptimized: false, function: void ()* @main) +!19 = !DIFile(filename: "/mnt/c/Users/amaiorano/Downloads/356423093/356423093_reduced.hlsl", directory: "") +!20 = !DISubroutineType(types: !9) +!21 = !{!22, !22, i64 0} +!22 = !{!"int", !23, i64 0} +!23 = !{!"omnipotent char", !24, i64 0} +!24 = !{!"Simple C/C++ TBAA"} +!25 = !DILocation(line: 17, column: 25, scope: !18) +!26 = !DILocation(line: 17, column: 17, scope: !18) +!27 = !DILocation(line: 17, column: 7, scope: !18) +!28 = !DILocation(line: 18, column: 29, scope: !18) +!29 = !DILocation(line: 19, column: 13, scope: !18) +!30 = !DILocation(line: 20, column: 1, scope: !18) diff -Nru chromium-128.0.6613.84/third_party/skia/src/gpu/ganesh/ops/DrawMeshOp.cpp chromium-128.0.6613.113/third_party/skia/src/gpu/ganesh/ops/DrawMeshOp.cpp --- chromium-128.0.6613.84/third_party/skia/src/gpu/ganesh/ops/DrawMeshOp.cpp 2024-08-21 22:47:13.000000000 +0000 +++ chromium-128.0.6613.113/third_party/skia/src/gpu/ganesh/ops/DrawMeshOp.cpp 2024-08-28 22:40:03.000000000 +0000 @@ -1181,7 +1181,11 @@ if (SkToBool(fIndexCount) != SkToBool(that->fIndexCount)) { return CombineResult::kCannotCombine; } - if (SkToBool(fIndexCount) && fVertexCount > SkToInt(UINT16_MAX) - that->fVertexCount) { + if (SkToBool(fIndexCount) && + // Index count would overflow + (fIndexCount > INT32_MAX - that->fIndexCount || + // *or* combined vertex count would not be referenceable by uint16 indices + fVertexCount > SkToInt(UINT16_MAX) - that->fVertexCount)) { return CombineResult::kCannotCombine; } diff -Nru chromium-128.0.6613.84/third_party/skia/src/gpu/ganesh/ops/RegionOp.cpp chromium-128.0.6613.113/third_party/skia/src/gpu/ganesh/ops/RegionOp.cpp --- chromium-128.0.6613.84/third_party/skia/src/gpu/ganesh/ops/RegionOp.cpp 2024-08-21 22:47:13.000000000 +0000 +++ chromium-128.0.6613.113/third_party/skia/src/gpu/ganesh/ops/RegionOp.cpp 2024-08-28 22:40:03.000000000 +0000 @@ -8,6 +8,7 @@ #include "src/gpu/ganesh/ops/RegionOp.h" #include "include/core/SkRegion.h" +#include "src/base/SkSafeMath.h" #include "src/core/SkMatrixPriv.h" #include "src/gpu/BufferWriter.h" #include "src/gpu/ganesh/GrCaps.h" @@ -116,8 +117,14 @@ int numRegions = fRegions.size(); int numRects = 0; + + SkSafeMath safeMath; for (int i = 0; i < numRegions; i++) { - numRects += fRegions[i].fRegion.computeRegionComplexity(); + numRects = safeMath.addInt(numRects, fRegions[i].fRegion.computeRegionComplexity()); + } + if (!safeMath) { + // This is a nonsensical draw, so we can just drop it. + return; } if (!numRects) { diff -Nru chromium-128.0.6613.84/third_party/webrtc/video/quality_convergence_controller.cc chromium-128.0.6613.113/third_party/webrtc/video/quality_convergence_controller.cc --- chromium-128.0.6613.84/third_party/webrtc/video/quality_convergence_controller.cc 2024-08-21 22:48:15.000000000 +0000 +++ chromium-128.0.6613.113/third_party/webrtc/video/quality_convergence_controller.cc 2024-08-28 22:41:15.000000000 +0000 @@ -44,6 +44,7 @@ absl::optional static_qp_threshold, VideoCodecType codec, const FieldTrialsView& trials) { + RTC_DCHECK(sequence_checker_.IsCurrent()); RTC_CHECK(number_of_layers > 0); number_of_layers_ = number_of_layers; convergence_monitors_.clear(); @@ -61,11 +62,20 @@ int layer_index, int qp, bool is_refresh_frame) { + RTC_DCHECK(sequence_checker_.IsCurrent()); RTC_CHECK(initialized_); if (layer_index < 0 || layer_index >= number_of_layers_) { return false; } + // TODO(kron): Remove temporary check that verifies that the initialization is + // working as expected. See https://crbug.com/359410061. + RTC_DCHECK(number_of_layers_ == + static_cast(convergence_monitors_.size())); + if (number_of_layers_ != static_cast(convergence_monitors_.size())) { + return false; + } + convergence_monitors_[layer_index]->AddSample(qp, is_refresh_frame); return convergence_monitors_[layer_index]->AtTargetQuality(); } diff -Nru chromium-128.0.6613.84/third_party/webrtc/video/quality_convergence_controller.h chromium-128.0.6613.113/third_party/webrtc/video/quality_convergence_controller.h --- chromium-128.0.6613.84/third_party/webrtc/video/quality_convergence_controller.h 2024-08-21 22:48:15.000000000 +0000 +++ chromium-128.0.6613.113/third_party/webrtc/video/quality_convergence_controller.h 2024-08-28 22:41:15.000000000 +0000 @@ -16,6 +16,7 @@ #include "absl/types/optional.h" #include "api/field_trials_view.h" +#include "api/sequence_checker.h" #include "api/video/video_codec_type.h" #include "video/quality_convergence_monitor.h" @@ -41,6 +42,7 @@ bool initialized_ = false; int number_of_layers_ = 0; std::vector> convergence_monitors_; + SequenceChecker sequence_checker_{SequenceChecker::kDetached}; }; } // namespace webrtc diff -Nru chromium-128.0.6613.84/third_party/webrtc/video/video_stream_encoder.cc chromium-128.0.6613.113/third_party/webrtc/video/video_stream_encoder.cc --- chromium-128.0.6613.84/third_party/webrtc/video/video_stream_encoder.cc 2024-08-21 22:48:15.000000000 +0000 +++ chromium-128.0.6613.113/third_party/webrtc/video/video_stream_encoder.cc 2024-08-28 22:41:15.000000000 +0000 @@ -2090,22 +2090,11 @@ .value_or(-1); } - // Check if the encoded image has reached target quality. - const size_t simulcast_index = encoded_image.SimulcastIndex().value_or(0); - bool at_target_quality = - quality_convergence_controller_.AddSampleAndCheckTargetQuality( - simulcast_index, image_copy.qp_, - image_copy.IsSteadyStateRefreshFrame()); - image_copy.SetAtTargetQuality(at_target_quality); TRACE_EVENT2("webrtc", "VideoStreamEncoder::AugmentEncodedImage", "stream_idx", stream_idx, "qp", image_copy.qp_); - TRACE_EVENT_INSTANT2("webrtc", "VideoStreamEncoder::AugmentEncodedImage", - TRACE_EVENT_SCOPE_GLOBAL, "simulcast_idx", - simulcast_index, "at_target_quality", at_target_quality); RTC_LOG(LS_VERBOSE) << __func__ << " ntp time " << encoded_image.NtpTimeMs() << " stream_idx " << stream_idx << " qp " - << image_copy.qp_ << " at target quality " - << at_target_quality; + << image_copy.qp_; return image_copy; } @@ -2128,11 +2117,16 @@ unsigned int image_width = image_copy._encodedWidth; unsigned int image_height = image_copy._encodedHeight; encoder_queue_->PostTask([this, codec_type, image_width, image_height, - simulcast_index, - at_target_quality = - image_copy.IsAtTargetQuality()] { + simulcast_index, qp = image_copy.qp_, + is_steady_state_refresh_frame = + image_copy.IsSteadyStateRefreshFrame()] { RTC_DCHECK_RUN_ON(encoder_queue_.get()); + // Check if the encoded image has reached target quality. + bool at_target_quality = + quality_convergence_controller_.AddSampleAndCheckTargetQuality( + simulcast_index, qp, is_steady_state_refresh_frame); + // Let the frame cadence adapter know about quality convergence. if (frame_cadence_adapter_) frame_cadence_adapter_->UpdateLayerQualityConvergence(simulcast_index, diff -Nru chromium-128.0.6613.84/third_party/webrtc/video/video_stream_encoder.h chromium-128.0.6613.113/third_party/webrtc/video/video_stream_encoder.h --- chromium-128.0.6613.84/third_party/webrtc/video/video_stream_encoder.h 2024-08-21 22:48:15.000000000 +0000 +++ chromium-128.0.6613.113/third_party/webrtc/video/video_stream_encoder.h 2024-08-28 22:41:15.000000000 +0000 @@ -422,7 +422,8 @@ // The quality convergence controller is used to determine if a codec has // reached its target quality. This is used for screenshare to determine when // there's no need to continue encoding the same repeated frame. - QualityConvergenceController quality_convergence_controller_; + QualityConvergenceController quality_convergence_controller_ + RTC_GUARDED_BY(encoder_queue_); // Enables encoder switching on initialization failures. bool switch_encoder_on_init_failures_; diff -Nru chromium-128.0.6613.84/tools/metrics/histograms/metadata/history/enums.xml chromium-128.0.6613.113/tools/metrics/histograms/metadata/history/enums.xml --- chromium-128.0.6613.84/tools/metrics/histograms/metadata/history/enums.xml 2024-08-21 22:46:45.000000000 +0000 +++ chromium-128.0.6613.113/tools/metrics/histograms/metadata/history/enums.xml 2024-08-28 22:39:34.000000000 +0000 @@ -173,6 +173,8 @@ + + diff -Nru chromium-128.0.6613.84/tools/metrics/histograms/metadata/history/histograms.xml chromium-128.0.6613.113/tools/metrics/histograms/metadata/history/histograms.xml --- chromium-128.0.6613.84/tools/metrics/histograms/metadata/history/histograms.xml 2024-08-21 22:46:45.000000000 +0000 +++ chromium-128.0.6613.113/tools/metrics/histograms/metadata/history/histograms.xml 2024-08-28 22:39:34.000000000 +0000 @@ -1833,6 +1833,74 @@ + + orinj@chromium.org + manukh@chromium.org + + Number of database statement iteration rows skipped due to embeddings data + load failure. If a row is skipped, only one counter is incremented to + reflect the reason; the check order is: passages, embeddings, mismatches. + Logged once for each full iteration, which happens when the database is + queried; this may include a time range or not, and may exhaust all rows or + stop early if a new query is initiated. + + + + + orinj@chromium.org + manukh@chromium.org + + Number of database statement iteration rows skipped due to embeddings count + mismatching passages count. If a row is skipped, only one counter is + incremented to reflect the reason; the check order is: passages, embeddings, + mismatches. Logged once for each full iteration, which happens when the + database is queried; this may include a time range or not, and may exhaust + all rows or stop early if a new query is initiated. + + + + + orinj@chromium.org + manukh@chromium.org + + Number of database statement iteration rows skipped due to embeddings having + unexpected dimensions. If a row is skipped, only one counter is incremented + to reflect the reason; the check order is: passages, embeddings, mismatches. + Logged once for each full iteration, which happens when the database is + queried; this may include a time range or not, and may exhaust all rows or + stop early if a new query is initiated. + + + + + orinj@chromium.org + manukh@chromium.org + + Number of database statement iteration rows skipped due to passages data + load failure. If a row is skipped, only one counter is incremented to + reflect the reason; the check order is: passages, embeddings, mismatches. + Logged once for each full iteration, which happens when the database is + queried; this may include a time range or not, and may exhaust all rows or + stop early if a new query is initiated. + + + + + orinj@chromium.org + manukh@chromium.org + + Number of database statement iteration rows yielded with valid data. Logged + once for each full iteration, which happens when the database is queried; + this may include a time range or not, and may exhaust all rows or stop early + if a new query is initiated. + + + sophiechang@chromium.org diff -Nru chromium-128.0.6613.84/ui/strings/translations/auto_image_annotation_strings_ar.xtb chromium-128.0.6613.113/ui/strings/translations/auto_image_annotation_strings_ar.xtb --- chromium-128.0.6613.84/ui/strings/translations/auto_image_annotation_strings_ar.xtb 2024-08-21 22:46:46.000000000 +0000 +++ chromium-128.0.6613.113/ui/strings/translations/auto_image_annotation_strings_ar.xtb 2024-08-28 22:39:35.000000000 +0000 @@ -60,11 +60,11 @@ يبدو أن: رمز ظرف، وقد يعني "البريد" رمز الشخص -رمز وجه مبتسم، وقد يعني "رمز تعبيري" +رمز وجه مبتسم، وقد يعني "إيموجي" رمز سهم عكس عقارب الساعة، وقد يعني "تراجُع" رمز سلّة التسوّق رمز النجمة -رمز تعبيري لوجه سعيد ووجه حزين +إيموجي لوجه سعيد ووجه حزين لا يتوفر أي وصف. يبدو أنه يحتوي على محتوى للبالغين. لا يتوفر أي وصف. رسم غير مصنّف diff -Nru chromium-128.0.6613.84/ui/strings/translations/ui_strings_ar.xtb chromium-128.0.6613.113/ui/strings/translations/ui_strings_ar.xtb --- chromium-128.0.6613.84/ui/strings/translations/ui_strings_ar.xtb 2024-08-21 22:46:46.000000000 +0000 +++ chromium-128.0.6613.113/ui/strings/translations/ui_strings_ar.xtb 2024-08-28 22:39:35.000000000 +0000 @@ -124,7 +124,7 @@ ‏مفتاح End &حذف النص -الرموز التعبيرية والرموز +رموز الإيموجي والرموز إزالة ‏تعذّر تحميل الصفحة بسبب عدم تثبيت وحدة واجهة المستخدِم الخاصة بمطوّر البرامج (dev_ui). نظام @@ -182,7 +182,7 @@ {MINUTES,plural, =1{يتبقى دقيقة واحدة}zero{يتبقى # من الدقائق}two{يتبقى دقيقتان (#)}few{يتبقى # دقائق}many{يتبقى # دقيقة}other{يتبقى # من الدقائق}} العمود غير مرتَّب. تيرابايت -الرموز التعبيرية +رموز الإيموجي تمت الإزالة. إلغاء أمس diff -Nru chromium-128.0.6613.84/ui/views/bubble/bubble_frame_view.cc chromium-128.0.6613.113/ui/views/bubble/bubble_frame_view.cc --- chromium-128.0.6613.84/ui/views/bubble/bubble_frame_view.cc 2024-08-21 22:46:46.000000000 +0000 +++ chromium-128.0.6613.113/ui/views/bubble/bubble_frame_view.cc 2024-08-28 22:39:35.000000000 +0000 @@ -136,7 +136,6 @@ progress_indicator->SetProperty(views::kElementIdentifierKey, kProgressIndicatorElementId); progress_indicator_ = AddChildView(std::move(progress_indicator)); - SetLayoutManager(std::make_unique(this)); } BubbleFrameView::~BubbleFrameView() = default; @@ -524,13 +523,7 @@ #endif } -ProposedLayout BubbleFrameView::CalculateProposedLayout( - const SizeBounds& size_bounds) const { - ProposedLayout layout; - DCHECK(size_bounds.is_fully_bounded()); - layout.host_size = - gfx::Size(size_bounds.width().value(), size_bounds.height().value()); - +void BubbleFrameView::Layout(PassKey) { // The title margins may not be set, but make sure that's only the case when // there's no title. DCHECK(!title_margins_.IsEmpty() || @@ -539,10 +532,9 @@ const gfx::Rect contents_bounds = GetContentsBounds(); // Lay out the progress bar. - layout.child_layouts.emplace_back( - progress_indicator_.get(), progress_indicator_->GetVisible(), - gfx::Rect(contents_bounds.x(), contents_bounds.y(), - contents_bounds.width(), kProgressIndicatorHeight)); + progress_indicator_->SetBounds(contents_bounds.x(), contents_bounds.y(), + contents_bounds.width(), + kProgressIndicatorHeight); gfx::Rect bounds = contents_bounds; bounds.Inset(title_margins_); @@ -561,12 +553,9 @@ DISTANCE_RELATED_BUTTON_HORIZONTAL), 0, 0)); } - const gfx::Rect button_bounds(button_area_rect.x() - button->width(), - button_area_rect.y(), button->width(), - button->height()); - layout.child_layouts.emplace_back(button, button->GetVisible(), - button_bounds); - button_area_rect.Union(button_bounds); + button->SetPosition(gfx::Point(button_area_rect.x() - button->width(), + button_area_rect.y())); + button_area_rect.Union(button->bounds()); } // Add spacing between the title and buttons. @@ -584,8 +573,7 @@ gfx::Rect header_rect = contents_bounds; header_rect.set_height(GetHeaderHeightForFrameWidth(contents_bounds.width())); if (header_rect.height() > 0) { - layout.child_layouts.emplace_back(header_view_.get(), - header_view_->GetVisible(), header_rect); + header_view_->SetBoundsRect(header_rect); bounds.Inset(gfx::Insets::TLBR(header_rect.height(), 0, 0, 0)); } @@ -609,8 +597,7 @@ const gfx::Insets title_insets = GetTitleLabelInsetsFromFrame() + GetInsets(); DCHECK_EQ(title_insets.left(), title_label_x); - DCHECK_EQ(title_insets.right(), - layout.host_size.width() - title_label_right); + DCHECK_EQ(title_insets.right(), width() - title_label_right); } const int title_available_width = @@ -620,21 +607,15 @@ const int title_height = std::max(title_icon_pref_size.height(), title_preferred_height); - layout.child_layouts.emplace_back( - title_container_.get(), title_container_->GetVisible(), - gfx::Rect(title_label_x, - bounds.y() + (title_height - title_preferred_height) / 2, - title_available_width, title_preferred_height)); - - layout.child_layouts.emplace_back( - title_icon_.get(), title_icon_->GetVisible(), - gfx::Rect(bounds.x(), bounds.y(), title_icon_pref_size.width(), - title_height)); - - const gfx::Size preferred_size = main_image_->GetPreferredSize({}); - layout.child_layouts.emplace_back( - main_image_.get(), main_image_->GetVisible(), - gfx::Rect(0, 0, preferred_size.width(), preferred_size.height())); + title_container_->SetBounds( + title_label_x, bounds.y() + (title_height - title_preferred_height) / 2, + title_available_width, title_preferred_height); + + title_icon_->SetBounds(bounds.x(), bounds.y(), title_icon_pref_size.width(), + title_height); + + main_image_->SetBounds(0, 0, main_image_->GetPreferredSize({}).width(), + main_image_->GetPreferredSize({}).height()); // Lay out the footnote. // Only account for footnote_container_'s height if it's visible, because @@ -642,13 +623,12 @@ if (footnote_container_ && footnote_container_->GetVisible()) { const int width = contents_bounds.width(); const int height = footnote_container_->GetHeightForWidth(width); - layout.child_layouts.emplace_back( - footnote_container_.get(), footnote_container_->GetVisible(), - gfx::Rect(contents_bounds.x(), contents_bounds.bottom() - height, width, - height)); + footnote_container_->SetBounds( + contents_bounds.x(), contents_bounds.bottom() - height, width, height); } - return layout; + // Lay out the client view. + LayoutSuperclass(this); } void BubbleFrameView::OnThemeChanged() { diff -Nru chromium-128.0.6613.84/ui/views/bubble/bubble_frame_view.h chromium-128.0.6613.113/ui/views/bubble/bubble_frame_view.h --- chromium-128.0.6613.84/ui/views/bubble/bubble_frame_view.h 2024-08-21 22:46:46.000000000 +0000 +++ chromium-128.0.6613.113/ui/views/bubble/bubble_frame_view.h 2024-08-28 22:39:35.000000000 +0000 @@ -19,7 +19,6 @@ #include "ui/views/controls/progress_bar.h" #include "ui/views/input_event_activation_protector.h" #include "ui/views/layout/box_layout_view.h" -#include "ui/views/layout/delegating_layout_manager.h" #include "ui/views/style/typography.h" #include "ui/views/window/non_client_view.h" @@ -57,8 +56,7 @@ // and the minimize buttons will be positioned at the end of the // title row. Otherwise, they will be positioned closer to the frame // edge. -class VIEWS_EXPORT BubbleFrameView : public NonClientFrameView, - public LayoutDelegate { +class VIEWS_EXPORT BubbleFrameView : public NonClientFrameView { METADATA_HEADER(BubbleFrameView, NonClientFrameView) public: @@ -123,6 +121,7 @@ const SizeBounds& available_size) const override; gfx::Size GetMinimumSize() const override; gfx::Size GetMaximumSize() const override; + void Layout(PassKey) override; void OnPaint(gfx::Canvas* canvas) override; void PaintChildren(const PaintInfo& paint_info) override; void OnThemeChanged() override; @@ -144,10 +143,6 @@ void SetContentMargins(const gfx::Insets& content_margins); gfx::Insets GetContentMargins() const; - // Overridden from LayoutDelegate: - ProposedLayout CalculateProposedLayout( - const SizeBounds& size_bounds) const override; - // Sets a custom header view for the dialog. If there is an existing header // view it will be deleted. The header view will be inserted above the title, // so outside the content bounds. If there is a close button, it will be shown diff -Nru chromium-128.0.6613.84/v8/include/v8-version.h chromium-128.0.6613.113/v8/include/v8-version.h --- chromium-128.0.6613.84/v8/include/v8-version.h 2024-08-21 22:48:49.000000000 +0000 +++ chromium-128.0.6613.113/v8/include/v8-version.h 2024-08-28 22:41:52.000000000 +0000 @@ -11,7 +11,7 @@ #define V8_MAJOR_VERSION 12 #define V8_MINOR_VERSION 8 #define V8_BUILD_NUMBER 374 -#define V8_PATCH_LEVEL 21 +#define V8_PATCH_LEVEL 24 // Use 1 for candidates and 0 otherwise. // (Boolean macro values are not supported by all preprocessors.) diff -Nru chromium-128.0.6613.84/v8/src/ast/ast-function-literal-id-reindexer.cc chromium-128.0.6613.113/v8/src/ast/ast-function-literal-id-reindexer.cc --- chromium-128.0.6613.84/v8/src/ast/ast-function-literal-id-reindexer.cc 2024-08-21 22:48:49.000000000 +0000 +++ chromium-128.0.6613.113/v8/src/ast/ast-function-literal-id-reindexer.cc 2024-08-28 22:41:52.000000000 +0000 @@ -31,13 +31,6 @@ lit->set_function_literal_id(lit->function_literal_id() + delta_); } -void AstFunctionLiteralIdReindexer::VisitCall(Call* expr) { - AstTraversalVisitor::VisitCall(expr); - if (expr->is_possibly_eval()) { - expr->adjust_eval_scope_info_index(delta_); - } -} - void AstFunctionLiteralIdReindexer::VisitClassLiteral(ClassLiteral* expr) { // Manually visit the class literal so that we can change the property walk. // This should be kept in-sync with AstTraversalVisitor::VisitClassLiteral. diff -Nru chromium-128.0.6613.84/v8/src/ast/ast-function-literal-id-reindexer.h chromium-128.0.6613.113/v8/src/ast/ast-function-literal-id-reindexer.h --- chromium-128.0.6613.84/v8/src/ast/ast-function-literal-id-reindexer.h 2024-08-21 22:48:49.000000000 +0000 +++ chromium-128.0.6613.113/v8/src/ast/ast-function-literal-id-reindexer.h 2024-08-28 22:41:52.000000000 +0000 @@ -30,7 +30,6 @@ // AstTraversalVisitor implementation. void VisitFunctionLiteral(FunctionLiteral* lit); void VisitClassLiteral(ClassLiteral* lit); - void VisitCall(Call* lit); private: int delta_; diff -Nru chromium-128.0.6613.84/v8/src/ast/ast.h chromium-128.0.6613.113/v8/src/ast/ast.h --- chromium-128.0.6613.84/v8/src/ast/ast.h 2024-08-21 22:48:49.000000000 +0000 +++ chromium-128.0.6613.113/v8/src/ast/ast.h 2024-08-28 22:41:52.000000000 +0000 @@ -1731,7 +1731,7 @@ class Call final : public CallBase { public: bool is_possibly_eval() const { - return EvalScopeInfoIndexField::decode(bit_field_) > 0; + return IsPossiblyEvalField::decode(bit_field_); } bool is_tagged_template() const { @@ -1742,15 +1742,6 @@ return IsOptionalChainLinkField::decode(bit_field_); } - uint32_t eval_scope_info_index() const { - return EvalScopeInfoIndexField::decode(bit_field_); - } - - void adjust_eval_scope_info_index(int delta) { - bit_field_ = EvalScopeInfoIndexField::update( - bit_field_, eval_scope_info_index() + delta); - } - enum CallType { GLOBAL_CALL, WITH_CALL, @@ -1766,6 +1757,11 @@ OTHER_CALL, }; + enum PossiblyEval { + IS_POSSIBLY_EVAL, + NOT_EVAL, + }; + // Helpers to determine how to handle the call. CallType GetCallType() const; @@ -1777,26 +1773,26 @@ Call(Zone* zone, Expression* expression, const ScopedPtrList& arguments, int pos, bool has_spread, - int eval_scope_info_index, bool optional_chain) + PossiblyEval possibly_eval, bool optional_chain) : CallBase(zone, kCall, expression, arguments, pos, has_spread) { - bit_field_ |= IsTaggedTemplateField::encode(false) | - IsOptionalChainLinkField::encode(optional_chain) | - EvalScopeInfoIndexField::encode(eval_scope_info_index); - DCHECK_EQ(eval_scope_info_index > 0, is_possibly_eval()); + bit_field_ |= + IsPossiblyEvalField::encode(possibly_eval == IS_POSSIBLY_EVAL) | + IsTaggedTemplateField::encode(false) | + IsOptionalChainLinkField::encode(optional_chain); } Call(Zone* zone, Expression* expression, const ScopedPtrList& arguments, int pos, TaggedTemplateTag tag) : CallBase(zone, kCall, expression, arguments, pos, false) { - bit_field_ |= IsTaggedTemplateField::encode(true) | - IsOptionalChainLinkField::encode(false) | - EvalScopeInfoIndexField::encode(0); + bit_field_ |= IsPossiblyEvalField::encode(false) | + IsTaggedTemplateField::encode(true) | + IsOptionalChainLinkField::encode(false); } - using IsTaggedTemplateField = CallBase::NextBitField; + using IsPossiblyEvalField = CallBase::NextBitField; + using IsTaggedTemplateField = IsPossiblyEvalField::Next; using IsOptionalChainLinkField = IsTaggedTemplateField::Next; - using EvalScopeInfoIndexField = IsOptionalChainLinkField::Next; }; class CallNew final : public CallBase { @@ -3188,11 +3184,12 @@ Call* NewCall(Expression* expression, const ScopedPtrList& arguments, int pos, - bool has_spread, int eval_scope_info_index = 0, + bool has_spread, + Call::PossiblyEval possibly_eval = Call::NOT_EVAL, bool optional_chain = false) { - DCHECK_IMPLIES(eval_scope_info_index > 0, !optional_chain); + DCHECK_IMPLIES(possibly_eval == Call::IS_POSSIBLY_EVAL, !optional_chain); return zone_->New(zone_, expression, arguments, pos, has_spread, - eval_scope_info_index, optional_chain); + possibly_eval, optional_chain); } SuperCallForwardArgs* NewSuperCallForwardArgs(SuperCallReference* expression, diff -Nru chromium-128.0.6613.84/v8/src/ast/scopes.cc chromium-128.0.6613.113/v8/src/ast/scopes.cc --- chromium-128.0.6613.84/v8/src/ast/scopes.cc 2024-08-21 22:48:49.000000000 +0000 +++ chromium-128.0.6613.113/v8/src/ast/scopes.cc 2024-08-28 22:41:52.000000000 +0000 @@ -2607,23 +2607,6 @@ } } -// Needs to be kept in sync with ScopeInfo::UniqueIdInScript. -int Scope::UniqueIdInScript() const { - // Script scopes start "before" the script to avoid clashing with a scope that - // starts on character 0. - if (is_script_scope() || scope_type() == EVAL_SCOPE || - scope_type() == MODULE_SCOPE) { - return -1; - } - if (is_declaration_scope()) { - // Default constructors have the same start position as their parent class - // scope. Use the next char position to distinguish this scope. - return start_position() + - IsDefaultConstructor(AsDeclarationScope()->function_kind()); - } - return start_position(); -} - void Scope::AllocateVariablesRecursively() { this->ForEach([](Scope* scope) -> Iteration { DCHECK(!scope->already_resolved_); @@ -2675,63 +2658,33 @@ } template -void Scope::AllocateScopeInfosRecursively( - IsolateT* isolate, MaybeHandle outer_scope, - std::unordered_map>& scope_infos_to_reuse) { +void Scope::AllocateScopeInfosRecursively(IsolateT* isolate, + MaybeHandle outer_scope) { DCHECK(scope_info_.is_null()); MaybeHandle next_outer_scope = outer_scope; - auto it = scope_infos_to_reuse.find(UniqueIdInScript()); - if (it != scope_infos_to_reuse.end()) { - scope_info_ = it->second; - CHECK(NeedsContext()); - // The ScopeInfo chain mirrors the context chain, so we only link to the - // next outer scope that needs a context. - next_outer_scope = scope_info_; - DCHECK(!scope_info_.is_null()); - DCHECK(!is_hidden_catch_scope()); - CHECK_EQ(scope_info_->scope_type(), scope_type_); - CHECK_EQ(scope_info_->ContextLength(), num_heap_slots_); -#ifdef DEBUG - // Consume the scope info. - it->second = {}; -#endif - } else if (NeedsScopeInfo()) { -#ifdef DEBUG - // Mark this ID as being used. Skip hidden scopes because they are - // synthetic, unreusable, but hard to make unique. - if (v8_flags.reuse_scope_infos && !is_hidden_catch_scope()) { - scope_infos_to_reuse[UniqueIdInScript()] = {}; - } -#endif + if (NeedsScopeInfo()) { scope_info_ = ScopeInfo::Create(isolate, zone(), this, outer_scope); - DCHECK_EQ(UniqueIdInScript(), scope_info_->UniqueIdInScript()); - // The ScopeInfo chain mirrors the context chain, so we only link to the - // next outer scope that needs a context. + // The ScopeInfo chain should mirror the context chain, so we only link to + // the next outer scope that needs a context. if (NeedsContext()) next_outer_scope = scope_info_; } // Allocate ScopeInfos for inner scopes. for (Scope* scope = inner_scope_; scope != nullptr; scope = scope->sibling_) { - DCHECK_GT(scope->UniqueIdInScript(), UniqueIdInScript()); - DCHECK_IMPLIES(scope->sibling_, scope->sibling_->UniqueIdInScript() != - scope->UniqueIdInScript()); if (!scope->is_function_scope() || scope->AsDeclarationScope()->ShouldEagerCompile()) { - scope->AllocateScopeInfosRecursively(isolate, next_outer_scope, - scope_infos_to_reuse); + scope->AllocateScopeInfosRecursively(isolate, next_outer_scope); } } } template EXPORT_TEMPLATE_DEFINE(V8_EXPORT_PRIVATE) void Scope:: - AllocateScopeInfosRecursively( - Isolate* isolate, MaybeHandle outer_scope, - std::unordered_map>& scope_infos_to_reuse); + AllocateScopeInfosRecursively(Isolate* isolate, + MaybeHandle outer_scope); template EXPORT_TEMPLATE_DEFINE(V8_EXPORT_PRIVATE) void Scope:: AllocateScopeInfosRecursively( - LocalIsolate* isolate, MaybeHandle outer_scope, - std::unordered_map>& scope_infos_to_reuse); + LocalIsolate* isolate, MaybeHandle outer_scope); void DeclarationScope::RecalcPrivateNameContextChain() { // The outermost scope in a class heritage expression is marked to skip the @@ -2776,9 +2729,7 @@ // static template -void DeclarationScope::AllocateScopeInfos(ParseInfo* info, - Handle