Version in base suite: 143.0.7499.169-1~deb13u1
Version in overlay suite: 145.0.7632.116-1~deb13u1
Base version: chromium_145.0.7632.116-1~deb13u1
Target version: chromium_145.0.7632.159-1~deb13u1
Base file: /srv/ftp-master.debian.org/ftp/pool/main/c/chromium/chromium_145.0.7632.116-1~deb13u1.dsc
Target file: /srv/ftp-master.debian.org/policy/pool/main/c/chromium/chromium_145.0.7632.159-1~deb13u1.dsc
DEPS | 18
ash/strings/ash_strings_de.xtb | 4
ash/strings/ash_strings_pt-BR.xtb | 8
ash/strings/ash_strings_pt-PT.xtb | 2
ash/strings/ash_strings_sr-Latn.xtb | 2
ash/strings/ash_strings_sr.xtb | 2
ash/strings/ash_strings_zh-CN.xtb | 4
ash/webui/camera_app_ui/resources/strings/camera_strings_es-419.xtb | 2
ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb | 2
build/util/LASTCHANGE | 2
build/util/LASTCHANGE.committime | 2
chrome/VERSION | 2
chrome/app/resources/chromium_strings_da.xtb | 2
chrome/app/resources/chromium_strings_el.xtb | 2
chrome/app/resources/chromium_strings_es-419.xtb | 2
chrome/app/resources/chromium_strings_es.xtb | 4
chrome/app/resources/generated_resources_ar.xtb | 2
chrome/app/resources/generated_resources_ca.xtb | 4
chrome/app/resources/generated_resources_cs.xtb | 4
chrome/app/resources/generated_resources_da.xtb | 6
chrome/app/resources/generated_resources_de.xtb | 20
chrome/app/resources/generated_resources_el.xtb | 4
chrome/app/resources/generated_resources_es-419.xtb | 6
chrome/app/resources/generated_resources_es.xtb | 8
chrome/app/resources/generated_resources_et.xtb | 2
chrome/app/resources/generated_resources_eu.xtb | 12
chrome/app/resources/generated_resources_fa.xtb | 16
chrome/app/resources/generated_resources_fi.xtb | 14
chrome/app/resources/generated_resources_fr.xtb | 20
chrome/app/resources/generated_resources_hr.xtb | 10
chrome/app/resources/generated_resources_is.xtb | 2
chrome/app/resources/generated_resources_it.xtb | 4
chrome/app/resources/generated_resources_ja.xtb | 4
chrome/app/resources/generated_resources_kk.xtb | 2
chrome/app/resources/generated_resources_ko.xtb | 2
chrome/app/resources/generated_resources_my.xtb | 6
chrome/app/resources/generated_resources_no.xtb | 2
chrome/app/resources/generated_resources_pt-BR.xtb | 6
chrome/app/resources/generated_resources_ro.xtb | 4
chrome/app/resources/generated_resources_sk.xtb | 2
chrome/app/resources/generated_resources_sl.xtb | 2
chrome/app/resources/generated_resources_sq.xtb | 2
chrome/app/resources/generated_resources_sr-Latn.xtb | 4
chrome/app/resources/generated_resources_sr.xtb | 4
chrome/app/resources/generated_resources_sw.xtb | 2
chrome/app/resources/generated_resources_te.xtb | 2
chrome/app/resources/generated_resources_tr.xtb | 2
chrome/app/resources/generated_resources_uk.xtb | 2
chrome/app/resources/generated_resources_vi.xtb | 4
chrome/app/resources/generated_resources_zh-CN.xtb | 10
chrome/app/resources/generated_resources_zh-TW.xtb | 2
chrome/app/resources/google_chrome_strings_ca.xtb | 2
chrome/app/resources/google_chrome_strings_da.xtb | 2
chrome/app/resources/google_chrome_strings_el.xtb | 2
chrome/app/resources/google_chrome_strings_es-419.xtb | 4
chrome/app/resources/google_chrome_strings_es.xtb | 4
chrome/app/resources/google_chrome_strings_fr.xtb | 2
chrome/app/resources/google_chrome_strings_hr.xtb | 4
chrome/app/resources/google_chrome_strings_vi.xtb | 2
chrome/app/resources/google_chrome_strings_zh-CN.xtb | 12
chrome/browser/glic/glic_profile_manager.cc | 14
chrome/browser/glic/glic_profile_manager.h | 2
chrome/browser/glic/glic_profile_manager_browsertest.cc | 25
chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_de.xtb | 18
chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zh-CN.xtb | 2
chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb | 2
chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb | 2
chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb | 10
chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb | 2
chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb | 2
chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb | 2
chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb | 2
chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb | 2
chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb | 2
chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb | 6
chrome/browser/ui/ash/network/mobile_data_notifications.cc | 2
chrome/browser/ui/views/infobars/infobar_container_view.cc | 61
chrome/browser/ui/views/infobars/infobar_container_view.h | 9
chrome/browser/ui/views/infobars/infobar_container_view_browsertest.cc | 88
chromeos/CHROMEOS_LKGM | 2
chromeos/profiles/arm.afdo.newest.txt | 2
chromeos/profiles/atom.afdo.newest.txt | 2
chromeos/profiles/bigcore.afdo.newest.txt | 2
chromeos/strings/chromeos_strings_de.xtb | 2
chromeos/strings/chromeos_strings_el.xtb | 2
chromeos/strings/chromeos_strings_fa.xtb | 4
chromeos/strings/chromeos_strings_pt-BR.xtb | 4
components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb | 8
components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb | 8
components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb | 2
components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb | 2
components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb | 2
components/certificate_transparency/data/log_list.json | 20
components/infobars/core/infobar_container.cc | 2
components/infobars/core/infobar_container.h | 2
components/infobars/core/infobar_container_with_priority.h | 2
components/policy/resources/policy_templates_de.xtb | 19
components/policy/resources/policy_templates_fr.xtb | 20
components/policy/resources/policy_templates_nl.xtb | 10
components/policy/resources/policy_templates_pt-BR.xtb | 8
components/policy/resources/policy_templates_ru.xtb | 2
components/strings/components_strings_ca.xtb | 4
components/strings/components_strings_de.xtb | 2
components/strings/components_strings_es-419.xtb | 2
components/strings/components_strings_es.xtb | 4
components/strings/components_strings_fa.xtb | 8
components/strings/components_strings_hi.xtb | 2
components/strings/components_strings_hu.xtb | 2
components/strings/components_strings_kn.xtb | 2
components/strings/components_strings_pt-BR.xtb | 2
components/strings/components_strings_ru.xtb | 2
components/strings/components_strings_sq.xtb | 2
components/strings/components_strings_sr-Latn.xtb | 6
components/strings/components_strings_sr.xtb | 6
components/strings/components_strings_sw.xtb | 4
components/strings/components_strings_zh-CN.xtb | 2
components/strings/components_strings_zh-TW.xtb | 2
content/browser/renderer_host/render_frame_host_impl.cc | 24
content/browser/security_exploit_browsertest.cc | 126
debian/changelog | 30
debian/clean | 1
debian/control | 1
debian/copyright | 1
debian/scripts/unbundle | 1
gpu/command_buffer/service/context_group.cc | 15
gpu/command_buffer/service/context_group.h | 5
gpu/command_buffer/service/decoder_context.h | 6
gpu/command_buffer/service/feature_info.cc | 40
gpu/command_buffer/service/feature_info.h | 10
gpu/command_buffer/service/gles2_cmd_copy_tex_image.cc | 4
gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc | 13
gpu/command_buffer/service/gles2_cmd_decoder.cc | 125
gpu/command_buffer/service/gles2_cmd_decoder_mock.h | 2
gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc | 5
gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h | 2
gpu/command_buffer/service/raster_decoder.cc | 6
gpu/command_buffer/service/renderbuffer_manager.cc | 4
gpu/command_buffer/service/renderbuffer_manager.h | 2
gpu/command_buffer/service/webgpu_decoder_impl.cc | 3
gpu/config/gpu_driver_bug_list.json | 11
gpu/config/gpu_lists_version.h | 2
gpu/config/gpu_workaround_list.txt | 1
infra/config/dev.star | 2
infra/config/generated/luci/cr-buildbucket.cfg | 56
infra/config/main.star | 2
net/data/ssl/chrome_root_store/root_store.certs | 562
net/data/ssl/chrome_root_store/root_store.md | 19
net/data/ssl/chrome_root_store/root_store.textproto | 69
net/http/transport_security_state_static.pins | 4
net/http/transport_security_state_static_pins.json | 2
remoting/resources/remoting_strings_el.xtb | 2
remoting/resources/remoting_strings_fa.xtb | 2
skia/ext/skia_commit_hash.h | 2
third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp | 13
third_party/blink/common/page_state/page_state_serialization.cc | 68
third_party/blink/public/common/page_state/page_state_serialization.h | 7
third_party/blink/renderer/core/css/css_math_expression_node.cc | 2
third_party/blink/renderer/core/css/cssom/css_unparsed_value.cc | 19
third_party/blink/renderer/core/css/parser/css_parser_token.h | 16
third_party/blink/renderer/core/inspector/devtools_session.cc | 1
third_party/blink/renderer/core/inspector/devtools_session.h | 10
third_party/blink/renderer/core/inspector/inspector_trace_events.cc | 2
third_party/blink/renderer/modules/clipboard/clipboard_change_event_controller.cc | 17
third_party/blink/renderer/modules/clipboard/clipboard_change_event_controller_unittest.cc | 100
third_party/blink/renderer/modules/webcodecs/background_readback.cc | 7
third_party/blink/renderer/platform/audio/mac/fft_frame_mac.cc | 12
third_party/blink/renderer/platform/audio/pffft/fft_frame_pffft.cc | 28
third_party/devtools-frontend/src/front_end/models/stack_trace/StackTraceImpl.test.ts | 4
third_party/devtools-frontend/src/front_end/models/stack_trace/StackTraceImpl.ts | 14
third_party/devtools-frontend/src/front_end/models/stack_trace/StackTraceModel.test.ts | 9
third_party/devtools-frontend/src/front_end/models/stack_trace/StackTraceModel.ts | 10
third_party/devtools-frontend/src/front_end/panels/timeline/BUILD.gn | 3
third_party/devtools-frontend/src/front_end/panels/timeline/TimelineUIUtils.ts | 83
third_party/devtools-frontend/src/front_end/ui/legacy/components/utils/JSPresentationUtils.test.ts | 2
third_party/devtools-frontend/src/front_end/ui/legacy/components/utils/JSPresentationUtils.ts | 11
third_party/libxslt/BUILD.gn | 113
third_party/libxslt/DIR_METADATA | 6
third_party/libxslt/OWNERS | 1
third_party/libxslt/README.chromium | 16
third_party/libxslt/chromium/0004-Use-a-dedicated-node-type-to-maintain-the-list-of-ca.patch | 707
third_party/libxslt/chromium/roll.py | 440
third_party/libxslt/chromium/xslt-locale.patch | 45
third_party/libxslt/linux/COPYING | 53
third_party/libxslt/linux/config.h | 225
third_party/libxslt/linux/libexslt/exsltconfig.h | 70
third_party/libxslt/linux/libxslt/xsltwin32config.h | 105
third_party/libxslt/mac/config.h | 225
third_party/libxslt/src/AUTHORS | 64
third_party/libxslt/src/Copyright | 53
third_party/libxslt/src/FEATURES | 242
third_party/libxslt/src/FindGcrypt.cmake | 40
third_party/libxslt/src/INSTALL | 50
third_party/libxslt/src/Makefile.am | 51
third_party/libxslt/src/README.md | 19
third_party/libxslt/src/TODO | 124
third_party/libxslt/src/config.h.cmake.in | 136
third_party/libxslt/src/config.h.in | 224
third_party/libxslt/src/libexslt.pc.in | 13
third_party/libxslt/src/libexslt/Makefile.am | 35
third_party/libxslt/src/libexslt/common.c | 124
third_party/libxslt/src/libexslt/crypto.c | 806
third_party/libxslt/src/libexslt/date.c | 3956 ++
third_party/libxslt/src/libexslt/dynamic.c | 296
third_party/libxslt/src/libexslt/exslt.c | 35
third_party/libxslt/src/libexslt/exslt.h | 108
third_party/libxslt/src/libexslt/exsltconfig.h.in | 70
third_party/libxslt/src/libexslt/exsltexports.h | 63
third_party/libxslt/src/libexslt/functions.c | 837
third_party/libxslt/src/libexslt/libexslt.3 | 270
third_party/libxslt/src/libexslt/libexslt.h | 35
third_party/libxslt/src/libexslt/math.c | 1173
third_party/libxslt/src/libexslt/saxon.c | 318
third_party/libxslt/src/libexslt/sets.c | 320
third_party/libxslt/src/libexslt/strings.c | 884
third_party/libxslt/src/libxslt-config.cmake.cmake.in | 107
third_party/libxslt/src/libxslt-config.cmake.in | 112
third_party/libxslt/src/libxslt.pc.in | 13
third_party/libxslt/src/libxslt/Makefile.am | 77
third_party/libxslt/src/libxslt/attributes.c | 1242
third_party/libxslt/src/libxslt/attributes.h | 39
third_party/libxslt/src/libxslt/attrvt.c | 405
third_party/libxslt/src/libxslt/documents.c | 442
third_party/libxslt/src/libxslt/documents.h | 93
third_party/libxslt/src/libxslt/extensions.c | 2403 +
third_party/libxslt/src/libxslt/extensions.h | 262
third_party/libxslt/src/libxslt/extra.c | 197
third_party/libxslt/src/libxslt/extra.h | 72
third_party/libxslt/src/libxslt/functions.c | 1109
third_party/libxslt/src/libxslt/functions.h | 78
third_party/libxslt/src/libxslt/imports.c | 423
third_party/libxslt/src/libxslt/imports.h | 75
third_party/libxslt/src/libxslt/keys.c | 935
third_party/libxslt/src/libxslt/keys.h | 53
third_party/libxslt/src/libxslt/libxslt.3 | 31
third_party/libxslt/src/libxslt/libxslt.h | 55
third_party/libxslt/src/libxslt/namespaces.c | 835
third_party/libxslt/src/libxslt/namespaces.h | 68
third_party/libxslt/src/libxslt/numbers.c | 1412 +
third_party/libxslt/src/libxslt/numbersInternals.h | 73
third_party/libxslt/src/libxslt/pattern.c | 2534 +
third_party/libxslt/src/libxslt/pattern.h | 84
third_party/libxslt/src/libxslt/preproc.c | 2368 +
third_party/libxslt/src/libxslt/preproc.h | 43
third_party/libxslt/src/libxslt/security.c | 479
third_party/libxslt/src/libxslt/security.h | 104
third_party/libxslt/src/libxslt/templates.c | 875
third_party/libxslt/src/libxslt/templates.h | 77
third_party/libxslt/src/libxslt/transform.c | 6472 ++++
third_party/libxslt/src/libxslt/transform.h | 207
third_party/libxslt/src/libxslt/transformInternals.h | 9
third_party/libxslt/src/libxslt/trio.h | 216
third_party/libxslt/src/libxslt/triodef.h | 220
third_party/libxslt/src/libxslt/variables.c | 2437 +
third_party/libxslt/src/libxslt/variables.h | 118
third_party/libxslt/src/libxslt/win32config.h | 53
third_party/libxslt/src/libxslt/xslt.c | 7066 +++++
third_party/libxslt/src/libxslt/xslt.h | 110
third_party/libxslt/src/libxslt/xsltInternals.h | 2004 +
third_party/libxslt/src/libxslt/xsltconfig.h | 146
third_party/libxslt/src/libxslt/xsltconfig.h.in | 146
third_party/libxslt/src/libxslt/xsltexports.h | 64
third_party/libxslt/src/libxslt/xsltlocale.c | 538
third_party/libxslt/src/libxslt/xsltlocale.h | 44
third_party/libxslt/src/libxslt/xsltutils.c | 2725 ++
third_party/libxslt/src/libxslt/xsltutils.h | 343
third_party/libxslt/src/m4/ax_append_link_flags.m4 | 44
third_party/libxslt/src/m4/ax_check_link_flag.m4 | 53
third_party/libxslt/src/m4/ax_require_defined.m4 | 37
third_party/libxslt/src/m4/libtool.m4 | 8513 ++++++
third_party/libxslt/src/m4/ltoptions.m4 | 467
third_party/libxslt/src/m4/ltsugar.m4 | 124
third_party/libxslt/src/m4/ltversion.m4 | 24
third_party/libxslt/src/m4/lt~obsolete.m4 | 99
third_party/libxslt/src/py-compile | 244
third_party/libxslt/src/win32/Makefile.mingw | 308
third_party/libxslt/src/win32/Readme.txt | 133
third_party/libxslt/src/win32/configure.js | 549
third_party/libxslt/src/win32/libxslt/libxslt.def | 149
third_party/libxslt/src/win32/libxslt/libxslt.dsw | 44
third_party/libxslt/src/win32/libxslt/libxslt_so.dsp | 247
third_party/libxslt/src/win32/libxslt/xsltproc.dsp | 102
third_party/libxslt/src/win32/runtests.py | 87
third_party/libxslt/src/xsltConf.sh.in | 8
third_party/libxslt/win32/config.h | 53
third_party/skia/src/gpu/ganesh/GrVertexChunkArray.cpp | 9
third_party/skia/src/gpu/ganesh/ops/AtlasRenderTask.cpp | 11
third_party/skia/src/gpu/ganesh/ops/AtlasRenderTask.h | 8
third_party/skia/src/gpu/ganesh/ops/PathTessellateOp.cpp | 6
third_party/skia/src/gpu/tessellate/FixedCountBufferUtils.h | 7
ui/accessibility/extensions/strings/accessibility_extensions_strings_de.xtb | 2
ui/accessibility/extensions/strings/accessibility_extensions_strings_zh-CN.xtb | 2
ui/strings/translations/ax_strings_de.xtb | 6
ui/strings/translations/ui_strings_de.xtb | 2
ui/strings/translations/ui_strings_sw.xtb | 2
v8/include/v8-inspector.h | 14
v8/include/v8-version.h | 2
v8/src/asmjs/asm-parser.cc | 3
v8/src/ast/ast-function-literal-id-reindexer.cc | 5
v8/src/ast/ast-traversal-visitor.h | 5
v8/src/debug/liveedit.cc | 8
v8/src/inspector/search-util.cc | 7
v8/src/inspector/search-util.h | 4
v8/src/inspector/v8-debugger-agent-impl.cc | 2
v8/src/inspector/v8-inspector-impl.cc | 45
v8/src/inspector/v8-inspector-impl.h | 6
v8/src/inspector/v8-inspector-session-impl.cc | 6
v8/src/inspector/v8-inspector-session-impl.h | 10
v8/src/parsing/parser.cc | 6
v8/src/regexp/regexp.cc | 5
v8/tools/builtins-pgo/profiles/meta.json | 2
v8/tools/builtins-pgo/profiles/x64-rl.profile | 3743 +-
v8/tools/builtins-pgo/profiles/x64.profile | 2877 +-
v8/tools/builtins-pgo/profiles/x86-rl.profile |12922 ++++-----
v8/tools/builtins-pgo/profiles/x86.profile |13200 +++++-----
314 files changed, 82103 insertions(+), 16878 deletions(-)
dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmp27r_6__k/chromium_145.0.7632.116-1~deb13u1.dsc: no acceptable signature found
dpkg-source: warning: cannot verify inline signature for /srv/release.debian.org/tmp/tmp27r_6__k/chromium_145.0.7632.159-1~deb13u1.dsc: no acceptable signature found
diff -Nru chromium-145.0.7632.116/DEPS chromium-145.0.7632.159/DEPS
--- chromium-145.0.7632.116/DEPS 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/DEPS 2026-03-02 23:00:09.000000000 +0000
@@ -312,15 +312,15 @@
# 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': '2ab8add5be2c46eb6238f4c217f6d6dbc9bccd23',
+ 'skia_revision': 'fba326b8829e469ac02e5a68a0d36982ef1975bc',
# 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': 'ce21eb288e9b86bf6a294968a5113a2646d7b8dd',
+ 'v8_revision': '1e1e0c88c55414e3ab7f98629a0233d3dc77fca0',
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling ANGLE
# and whatever else without interference from each other.
- 'angle_revision': '4c0ae3917d4feab6ae1c99d7b750a69cdf3cc96c',
+ 'angle_revision': '2d051d9cef02bca69a97749a995b138e3dec0e1f',
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling SwiftShader
# and whatever else without interference from each other.
@@ -400,7 +400,7 @@
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling devtools-frontend
# and whatever else without interference from each other.
- 'devtools_frontend_revision': '8eb35b80efbc72ffb3aff36c3c1106fe9269df88',
+ 'devtools_frontend_revision': 'b1eec47965f0f0bed968133496c5c097fb41cc0e',
# Three lines of non-changing comments so that
# the commit queue can handle CLs rolling libprotobuf-mutator
# and whatever else without interference from each other.
@@ -1206,7 +1206,7 @@
'packages': [
{
'package': 'chromium/chrome/android/orderfiles/arm64',
- 'version': 'iKZe8VLuAf1KG3cuNm3dp5oIv2BB2mjXoJTcsTQzQG4C',
+ 'version': '8Eq-PQRtQQ5mNczyxFgkEo4BeVLm-JJgKPzdDDJMYLcC',
},
],
'condition': 'checkout_android and non_git_source',
@@ -1217,7 +1217,7 @@
'packages': [
{
'package': 'chromium/android_webview/tools/orderfiles/arm',
- 'version': 'BaIioIL8jGXNVPRz0IuD2HcFfek-aZs6UPa5QnWdhjcC',
+ 'version': 'zCa0x67uzpvnnTsvvzZfSMOCqjVtlfg5_xDn0O8VRwEC',
},
],
'condition': 'checkout_android and non_git_source',
@@ -1228,7 +1228,7 @@
'packages': [
{
'package': 'chromium/android_webview/tools/orderfiles/arm64',
- 'version': 'kA7sSXzkhSV08mCQ_EJQ8D8PWBpvD3Q9yjdeMzOlhggC',
+ 'version': '4IMWgbPZ0sNU7XSU_U31e3c6HfYJU3J9YRLZpqBcoI8C',
},
],
'condition': 'checkout_android and non_git_source',
@@ -1624,7 +1624,7 @@
'src/clank': {
'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
- '8fb16bd37d8d5afcd260df296d6bfefac4c21396',
+ 'fbe5dc3fce52e9301d4b88843f2e12928a5e8341',
'condition': 'checkout_android and checkout_src_internal',
},
@@ -3769,7 +3769,7 @@
'src/ios_internal': {
'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
- 'da24730e14ce8740155049c2ed16ace480e2c5a4',
+ '780a275060655dc392f36ef313d39fd89681770a',
'condition': 'checkout_ios and checkout_src_internal',
},
diff -Nru chromium-145.0.7632.116/ash/strings/ash_strings_de.xtb chromium-145.0.7632.159/ash/strings/ash_strings_de.xtb
--- chromium-145.0.7632.116/ash/strings/ash_strings_de.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/ash/strings/ash_strings_de.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -1371,7 +1371,7 @@
Neu laden
Hohe Sichtbarkeit bei Nearby Share aktivieren/deaktivieren
Kreativität
-Schaltfläche
+Button
Neuen Tab in neuem Inkognitofenster öffnen
Bluetooth aktiviert
Essentials
@@ -2305,7 +2305,7 @@
Leistungsschwaches Ladegerät angeschlossen
Einstellungen für den Konzentrationsmodus anzeigen. Konzentrationsmodus ist aktiviert, noch .
Leistungsverfolgung ist aktiv
-Aufnahme starten. Wenn die Aufnahme gestartet ist, kannst du Alt + Umschalttaste + L verwenden, um zur Ablage zu gehen – dort findest du die Schaltfläche zum Beenden der Aufnahme.
+Aufnahme starten. Wenn die Aufnahme gestartet ist, kannst du Alt + Umschalttaste + L verwenden, um zur Ablage zu gehen – dort findest du den Button zum Beenden der Aufnahme.
Fokus auf das Bild-im-Bild-Fenster verschieben
Spracheingabe aktivieren/deaktivieren
Optionen für das Dashboard für Spiele
diff -Nru chromium-145.0.7632.116/ash/strings/ash_strings_pt-BR.xtb chromium-145.0.7632.159/ash/strings/ash_strings_pt-BR.xtb
--- chromium-145.0.7632.116/ash/strings/ash_strings_pt-BR.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/ash/strings/ash_strings_pt-BR.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -221,7 +221,7 @@
Ativar o Sincronizar Wi-Fi
O ponto de acesso está desativado
Mudar para o usuário anterior
-Escolha entre o tema claro ou escuro. Toque na área de trabalho e a mantenha pressionada. Depois, selecione a opção "Plano de fundo e estilo".
+Escolha entre o tema claro ou escuro. Toque e mantenha pressionada a área de trabalho. Depois, selecione a opção "Plano de fundo e estilo".
Área selecionada, use as teclas de seta para mover
"" visível para dispositivos Bluetooth.
Dispensar configuração de visualização de notificações do smartphone
@@ -832,7 +832,7 @@
Não foi possível copiar com a formatação
Essa ação libera o acesso à câmera para e todos os apps e sites com essa permissão. Talvez seja necessário atualizar a página da Web ou reiniciar o app.
Usar senha
-Modo de Economia de bateria ativado
+Modo de economia de bateria ativado
Sair da visualização do tutorial
Mostrar configurações do teclado
Excluir modelo?
@@ -1906,7 +1906,7 @@
Algo deu errado
VPN desconectada
Mudar sua configuração de proteção de acesso a dados para periféricos pode otimizar o desempenho
-Definir Estilo e fundo de tela
+Definir plano de fundo e estilo
Você precisa ter pelo menos 18 anos para usar os recursos Me ajude a ler, Me ajude a escrever e criar imagens com a IA.
Gravar janela
Memória disponível: de um total de
@@ -1916,7 +1916,7 @@
Conectar com um código
Arraste para selecionar uma área para a gravação
Controles de mídia
-Modo de Economia de bateria desativado
+Modo de economia de bateria desativado
Ativar
Clique com o botão direito do mouse em qualquer lugar para reordenar os apps
Alternar conexão de rede. .
diff -Nru chromium-145.0.7632.116/ash/strings/ash_strings_pt-PT.xtb chromium-145.0.7632.159/ash/strings/ash_strings_pt-PT.xtb
--- chromium-145.0.7632.116/ash/strings/ash_strings_pt-PT.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/ash/strings/ash_strings_pt-PT.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -1543,7 +1543,7 @@
Alterar utilização de letras maiúsculas
Playlist:
Desativado pelo administrador
-Taxa de voz
+Velocidade de voz
Adicionar ligação a
Editado no mês passado
sistema
diff -Nru chromium-145.0.7632.116/ash/strings/ash_strings_sr-Latn.xtb chromium-145.0.7632.159/ash/strings/ash_strings_sr-Latn.xtb
--- chromium-145.0.7632.116/ash/strings/ash_strings_sr-Latn.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/ash/strings/ash_strings_sr-Latn.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -1738,7 +1738,7 @@
Izabrali ste marker na desnoj ivici, koristite tastere sa strelicama za pomeranje
Tastatura za PIN
Prevucite ili pritisnite taster za razmak da biste izabrali oblast za snimanje videa
-Prethodno
+Nazad
Energija
Prikaži šta je novo
Povezano, nivo baterije je %
diff -Nru chromium-145.0.7632.116/ash/strings/ash_strings_sr.xtb chromium-145.0.7632.159/ash/strings/ash_strings_sr.xtb
--- chromium-145.0.7632.116/ash/strings/ash_strings_sr.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/ash/strings/ash_strings_sr.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -1738,7 +1738,7 @@
Изабрали сте маркер на десној ивици, користите тастере са стрелицама за померање
Тастатура за PIN
Превуците или притисните тастер за размак да бисте изабрали област за снимање видеа
-Претходно
+Назад
Енергија
Прикажи шта је ново
Повезано, ниво батерије је %
diff -Nru chromium-145.0.7632.116/ash/strings/ash_strings_zh-CN.xtb chromium-145.0.7632.159/ash/strings/ash_strings_zh-CN.xtb
--- chromium-145.0.7632.116/ash/strings/ash_strings_zh-CN.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/ash/strings/ash_strings_zh-CN.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -190,7 +190,7 @@
键 + 向下键
暂停媒体
取消设置查看手机中的应用
-“撤消”
+“撤销”
开启
开启这些功能后,系统可能会将输入文本、文档内容和网页网址发送到 Google AI 服务器。系统会根据这些信息生成写作建议、总结内容、回答问题和改进产品,并遵守 。请勿包含任何个人、敏感或机密信息。
摄像头
@@ -315,7 +315,7 @@
以摄氏度显示温度
键盘亮度
开启/关闭。已
-撤消
+撤销
打开表情符号选择器
游戏
Chromebook 版 Steam 资讯
diff -Nru chromium-145.0.7632.116/ash/webui/camera_app_ui/resources/strings/camera_strings_es-419.xtb chromium-145.0.7632.159/ash/webui/camera_app_ui/resources/strings/camera_strings_es-419.xtb
--- chromium-145.0.7632.116/ash/webui/camera_app_ui/resources/strings/camera_strings_es-419.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/ash/webui/camera_app_ui/resources/strings/camera_strings_es-419.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -137,7 +137,7 @@
Tipo de grabación
Resolución de video
Errores en el sistema de archivos
-Se copió el texto.
+Se copió el texto
Grabar video de GIF
Muestra el texto y el botón para copiar
Cambiar a la siguiente cámara
diff -Nru chromium-145.0.7632.116/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb chromium-145.0.7632.159/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb
--- chromium-145.0.7632.116/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/ash/webui/camera_app_ui/resources/strings/camera_strings_fa.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -37,7 +37,7 @@
برای جزئیات، با سرپرست تماس بگیرید.
برای درستیسنجی محتوا، آن را کپی کنید یا برای متوقف کردن اسکن، آن را ازهم باز کنید.
جمع کردن کادر گفتگو و شروع کردن اسکن
-بازگشت
+برگشتن
ضبط متوقف شد
اسکن
شروع ضبط
diff -Nru chromium-145.0.7632.116/build/util/LASTCHANGE chromium-145.0.7632.159/build/util/LASTCHANGE
--- chromium-145.0.7632.116/build/util/LASTCHANGE 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/build/util/LASTCHANGE 2026-03-02 23:00:09.000000000 +0000
@@ -1,2 +1,2 @@
-LASTCHANGE=7d28075c6a9ba147e6df449209001258bb82a122-refs/branch-heads/7632@{#3100}
+LASTCHANGE=838c69b2e5b8cd00a916e35097249bc20eb25a0a-refs/branch-heads/7632@{#3673}
LASTCHANGE_YEAR=2026
diff -Nru chromium-145.0.7632.116/build/util/LASTCHANGE.committime chromium-145.0.7632.159/build/util/LASTCHANGE.committime
--- chromium-145.0.7632.116/build/util/LASTCHANGE.committime 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/build/util/LASTCHANGE.committime 2026-03-02 23:00:09.000000000 +0000
@@ -1 +1 @@
-1771618804
\ No newline at end of file
+1772492409
\ No newline at end of file
diff -Nru chromium-145.0.7632.116/chrome/VERSION chromium-145.0.7632.159/chrome/VERSION
--- chromium-145.0.7632.116/chrome/VERSION 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/VERSION 2026-03-02 23:00:09.000000000 +0000
@@ -1,4 +1,4 @@
MAJOR=145
MINOR=0
BUILD=7632
-PATCH=116
+PATCH=159
diff -Nru chromium-145.0.7632.116/chrome/app/resources/chromium_strings_da.xtb chromium-145.0.7632.159/chrome/app/resources/chromium_strings_da.xtb
--- chromium-145.0.7632.116/chrome/app/resources/chromium_strings_da.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/chromium_strings_da.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -304,7 +304,7 @@
Servicevilkår
Installationen mislykkedes på grund af en ikke-specificeret fejl. Hvis Chromium kører, skal du lukke programmet og prøve igen.
Eksportér adgangskoder fra Chromium
-Adgangskodeadministrator
+Adgangskodeadministrator
Søg i dette screenshot
Download fuldført.
kræver, at du læser og accepterer følgende servicevilkår, inden du bruger denne enhed. Disse vilkår udvider, ændrer eller begrænser på ingen måde vilkårene for Chromium OS.
diff -Nru chromium-145.0.7632.116/chrome/app/resources/chromium_strings_el.xtb chromium-145.0.7632.159/chrome/app/resources/chromium_strings_el.xtb
--- chromium-145.0.7632.116/chrome/app/resources/chromium_strings_el.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/chromium_strings_el.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -301,7 +301,7 @@
Σας προειδοποιεί για επικίνδυνους ιστοτόπους, ακόμα και για όσους δεν γνώριζε η Google στο παρελθόν, αναλύοντας περισσότερα δεδομένα από ιστοτόπους σε σχέση με την βασική προστασία. Μπορείτε να επιλέξετε να παραβλέψετε τις ειδοποιήσεις του Chromium.
Αποσύνδεση από το Chromium
Λήψη βοήθειας σχετικά με το Chromium
-Όροι Παροχής Υπηρεσιών
+Όροι παροχής υπηρεσιών
Η εγκατάσταση απέτυχε λόγω απροσδιόριστου σφάλματος. Εάν το Chromium εκτελείται αυτήν τη στιγμή, κλείστε το και δοκιμάστε ξανά.
Εξαγωγή κωδικών πρόσβασης από το Chromium
Διαχείριση κωδικών πρόσβασης
diff -Nru chromium-145.0.7632.116/chrome/app/resources/chromium_strings_es-419.xtb chromium-145.0.7632.159/chrome/app/resources/chromium_strings_es-419.xtb
--- chromium-145.0.7632.116/chrome/app/resources/chromium_strings_es-419.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/chromium_strings_es-419.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -572,7 +572,7 @@
Retoma tu actividad desde donde la dejaste: Chromium restablece tus pestañas cada vez que reinicias. Para desactivar esta opción, ve a
Importar contraseñas a Chromium
: Chromium para desarrolladores
-Se copió el texto.
+Se copió el texto
Chromium necesita permiso para acceder a tu cámara para este sitio
Para usar el micrófono, otorga acceso a Chromium en la configuración del sistema
Para obtener próximas actualizaciones de Chromium, necesitarás Windows 10 o versiones posteriores. Esta computadora usa Windows 7.
diff -Nru chromium-145.0.7632.116/chrome/app/resources/chromium_strings_es.xtb chromium-145.0.7632.159/chrome/app/resources/chromium_strings_es.xtb
--- chromium-145.0.7632.116/chrome/app/resources/chromium_strings_es.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/chromium_strings_es.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -42,7 +42,7 @@
Comparte tus ideas
Para compartir tu ventana, permite la grabación de pantalla de Chromium en Ajustes del sistema
Obtener ayuda con Chrome for Testing
-Hola, ,¿en qué estás pensando hoy?
+Hola, ,¿qué tienes en mente hoy?
Error de instalación:
Esta página está protegida
Compartir una pestaña de Chromium
@@ -366,7 +366,7 @@
Gemini en Chromium usa la navegación automática en tus pestañas para completar las tareas que le asignes. Más información
Chromium necesita permiso para hacer seguimiento de tus manos
No has visitado el sitio recientemente. Chromium ha eliminado , y .
-¿En qué estás pensando hoy?
+¿Qué tienes en mente hoy?
Sueles bloquear las notificaciones. Para permitir que este sitio te envíe notificaciones, haz clic en el icono de notificación que aparece en la esquina derecha de la barra de direcciones.
No hay suficiente espacio en disco.
La cuenta de Chromium debe volver a autenticarse
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_ar.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_ar.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_ar.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_ar.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -8902,7 +8902,7 @@
تم حظر "" وبعض التطبيقات الأخرى على
تُفتح صفحة إعدادات الأمان في علامة تبويب جديدة
{NUM_PASSWORDS,plural, =1{هناك كلمة مرور جديدة لهذا الموقع الإلكتروني}zero{ما مِن كلمات مرور جديدة لهذا الموقع الإلكتروني}two{هناك كلمتا مرور جديدتان لهذا الموقع الإلكتروني}few{هناك كلمات مرور جديدة لهذا الموقع الإلكتروني}many{هناك كلمات مرور جديدة لهذا الموقع الإلكتروني}other{هناك كلمات مرور جديدة لهذا الموقع الإلكتروني}}
-يمكن أن يؤدي ذلك إلى قراءة بيانات الموقع الإلكتروني وتغييرها
+يمكن لهذه الإضافة قراءة بيانات الموقع الإلكتروني وتغييرها
اسم الاختصار
بإمكان التطبيقات والمواقع الإلكترونية التي لديها أذونات تحديد الموقع الجغرافي وكذلك خدمات النظام استخدام موقعك الجغرافي. مزيد من المعلومات
مجموعة -
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_ca.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_ca.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_ca.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_ca.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -4916,7 +4916,7 @@
Noms d'emmagatzematge extraïble
Finestra d'&incògnit nova
Obre l'aplicació
-Canvia per mi
+Canvia-la per mi
Aquesta pàgina té permís per editar fitxers
{COUNT,plural, =1{# contacte no està disponible. Per fer servir amb aquesta persona, afegeix als teus contactes l'adreça electrònica associada al seu Compte de Google.}other{# contactes no estan disponibles. Per fer servir amb aquestes persones, afegeix als teus contactes les adreces electròniques associades als seus Comptes de Google.}}
Configura un PIN nou per a la clau de seguretat
@@ -10471,7 +10471,7 @@
Si ja esteu registrat en aquest dispositiu, podeu iniciar la sessió com a usuari existent.
Afegeix i classifica els teus idiomes preferits. Quan sigui possible, els llocs web es mostraran en aquests idiomes. Aquestes preferències se sincronitzen amb la configuració del navegador. Més informació
No s'ha pogut iniciar la sessió. Contacteu amb l'administrador o torneu-ho a provar.
-Ajuda a millorar les funcions i el rendiment de Chrome i Chrome OS enviant automàticament informes d'error i dades de diagnòstic i d'ús a Google.
+Ajuda a millorar les funcions i el rendiment de Chrome i ChromeOS enviant automàticament informes d'error i dades de diagnòstic i d'ús a Google.
S'ha trobat pestanya
Més accions per als fitxers de Google Drive
Limita l'inici de sessió
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_cs.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_cs.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_cs.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_cs.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -5163,7 +5163,7 @@
Stahování souborů k rozpoznávání řeči… %
Seskupit karty pomocí AI
Můžete použít preferovaný jazyk účtu Google ()
-Pomoci s vylepšováním funkcí a výkonu prohlížeče Chrome
+Pomáhat vylepšovat funkce a výkon Chromu
Vygenerovaný obrázek na téma ve stylu
Začít
Klikněte pravým tlačítkem na kartu a vyberte Přidat kartu do nové skupiny
@@ -11778,7 +11778,7 @@
Odesílání této karty
Poznámky k vydání
Gemini momentálně není k dispozici. Zkuste to později.
-Při pohybu myši posouvat obrazovku souvisle
+Při pohybu myši se obrazovku souvisle posouvá
Chrání před weby, soubory ke stažení a rozšířeními, o kterých je známo, že jsou nebezpečné. Pokud stránka provede něco podezřelého, odešlou se adresy URL a části obsahu stránky do Bezpečného prohlížení Google.
K instalaci Linuxu je potřeba volného místa. Místo uvolníte smazáním souborů ze zařízení.
Výukový program čtečky ChromeVox
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_da.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_da.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_da.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_da.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -4939,7 +4939,7 @@
{COUNT,plural, =1{# kontakt er ikke tilgængelig. Hvis du vil bruge med denne kontakt, skal du føje den mailadresse, der er tilknyttet vedkommendes Google-konto, til dine kontakter.}one{# kontakt er ikke tilgængelig. Hvis du vil bruge med denne kontakt, skal du føje den mailadresse, der er tilknyttet vedkommendes Google-konto, til dine kontakter.}other{# kontakter er ikke tilgængelige. Hvis du vil bruge med disse kontakter, skal du føje de mailadresser, der er tilknyttet deres Google-konti, til dine kontakter.}}
Opret en ny pinkode til din sikkerhedsnøgle
Flyt din adresselinje for at få en tilpasset browseroplevelse
-Adgangskodeadministrator
+Adgangskodeadministrator
Kopiér til
Skift
Apps skal downloades med indholdstypen ""
@@ -5196,7 +5196,7 @@
Konfigurerer den virtuelle maskine. Dette kan tage et par minutter.
scripttjeneste
Fane, der blev lukket for nylig
-Lokationsnøjagtighed
+Lokationsnøjagtighed
Chromebooks bruger apps i stedet for traditionel software. Få apps til produktivitet, underholdning og meget mere.
Har tilladelse til at bruge dit kamera
Udvidelser er ikke tilladt på dette website
@@ -7717,7 +7717,7 @@
Serveren er utilgængelig
Importér ONC-fil
Du kan få adgang til den i Google Adgangskodeadministrator.
-Google Adgangskodeadministrator
+Google Adgangskodeadministrator
Der blev ikke fundet nogen apps
%
System:
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_de.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_de.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_de.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_de.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -498,7 +498,7 @@
Es konnte keine Verbindung zu hergestellt werden. Versuche es erneut.
Synchronisierung pausiert
Deine Dockingstation arbeitet im Modus für USB Typ-C-Kompatibilität.
-Schaltfläche "Zurück" auf Unterseite ""
+Button „Zurück“ auf Unterseite „“
Gespeicherte Passwörter in meinem ansehen und verwalten
Verwende „x“, um zwischen der linken, der rechten und beiden Maustasten gleichzeitig zu wechseln
Besser schreiben
@@ -1273,7 +1273,7 @@
Dürfen Ton abspielen
Zum Ausführen von die Strg-Taste drücken und mit der Maus klicken
Beim Zuklappen abmelden
-Funktionsanfrage
+Feature Request
Alle HID-Geräte
Dürfen deine Mauseingaben erfassen und verwenden
Zum Anpinnen von Verknüpfungen gedrückt halten
@@ -1302,7 +1302,7 @@
ist bereit, die Installation abzuschließen
Die Passwortüberprüfung ist in Chromium nicht verfügbar
Standortermittlung für Android-Apps und -Dienste nutzen.
-Lesezeichen-Schaltfläche
+Lesezeichen-Button
In Chrome-Browser öffnen
Vollständiger Downloadverlauf
Weniger Apps
@@ -3411,7 +3411,7 @@
Über das Kartenmenü kannst du die Einstellungen verwalten und unter „Chrome anpassen“ kannst du weitere Optionen aufrufen.
-Schaltfläche ausblenden
+Button ausblenden
{GROUP_COUNT,plural, =1{Die Tabs bleiben auf diesem Gerät geöffnet, aber die Gruppe wird endgültig gelöscht.}other{Die Tabs bleiben auf diesem Gerät geöffnet, aber die Gruppen werden endgültig gelöscht.}}
Google Assistant wird geladen...
Bauwerke
@@ -6446,7 +6446,7 @@
Wer Inhalte mit dir teilen kann
Dieses Passwort wird nur auf diesem Gerät gespeichert. Wenn du es auf deinen anderen Geräten verwenden möchtest, speichere es in deinem Google-Konto.
bearbeiten
-Die Unternehmensrichtlinie hat sich geändert. Die Schaltfläche für Tests wurde zur Symbolleiste hinzugefügt. Klicke auf die Schaltfläche, um das Dialogfeld zum Aktivieren von Tests zu öffnen.
+Die Unternehmensrichtlinie hat sich geändert. Der Button für Tests wurde zur Symbolleiste hinzugefügt. Klicke auf den Button, um das Dialogfeld zum Aktivieren von Tests zu öffnen.
Apps und Websites mit Kameraberechtigung sowie Systemdienste können die Kamera verwenden. Möglicherweise musst du die App neu starten oder die Seite aktualisieren, damit die Kamera verwendet werden kann.
{NUM_SITES,plural, =1{1 Website mit vielen Benachrichtigungen gefunden}other{{NUM_SITES} Websites mit vielen Benachrichtigungen gefunden}}
Datei kann nicht hochgeladen werden. Die Bilddatei konnte nicht verarbeitet werden.
@@ -8006,7 +8006,7 @@
Aufleuchten bei Benachrichtigungen
Wenn du Tabs teilen und mit anderen zusammenarbeiten möchtest, melde dich in Chrome an und synchronisiere deinen Verlauf und deine Tabs. Du kannst dann auch auf allen deinen Geräten auf deine Passwörter und weitere Daten zugreifen.
Benachrichtigungen stummschalten
-Schaltfläche „Startseite“ anzeigen
+Button „Startseite“ anzeigen
Option auswählen
Die Aufhebung der Freigabe ist nicht möglich, weil eine Anwendung diesen Ordner verwendet. Die Freigabe des Ordners wird aufgehoben, wenn Linux das nächste Mal heruntergefahren wird.
Verbindung zu Google Drive-Konto aufheben
@@ -8272,7 +8272,7 @@
Zwölf Boxkämpfer jagen Viktor quer über den großen Sylter Deich.
Druckserver
Mit dem Google Passwortmanager kannst du dich auf allen deinen Geräten schneller auf Websites anmelden
-Die Unternehmensrichtlinie hat sich geändert. Die Schaltfläche für Tests wurde aus der Symbolleiste entfernt.
+Die Unternehmensrichtlinie hat sich geändert. Der Button für Tests wurde aus der Symbolleiste entfernt.
Führe Powerwash für dein aus und setze es auf die vorherige Version zurück.
Beim Öffnen deines Profils ist ein Fehler aufgetreten. Melde dich bitte ab und dann wieder an.
Wild
@@ -9121,7 +9121,7 @@
Wenn du diese Daten löschen möchtest, ruf die entsprechenden Verwaltungseinstellungen auf
&Weitere Informationen
Soll "" wirklich im Diagnosemodus gestartet werden?
-Lesezeichenordner-Schaltfläche
+Lesezeichenordner-Button
Übernehmen
Die Website verwendet deine Kamera
Mikrofon auf der Rückseite
@@ -10651,7 +10651,7 @@
Ungültiges Clientzertifikat
Drive
Aktueller Downloadverlauf
-Schaltfläche „Startseite“ anzeigen
+Button „Startseite“ anzeigen
Du kannst Definitionen oder Übersetzungen anzeigen oder Einheiten umrechnen lassen, indem du Text gedrückt hältst oder mit der rechten Maustaste darauf klickst. Unter Websitesprachen kannst du die Sprachen für die Übersetzung anpassen.
Liebe Eltern, die nächsten Schritte müsst ihr ausführen. Ihr könnt das Gerät () nach der Kontoeinrichtung wieder eurem Kind geben.
Bild herunterladen
@@ -12167,7 +12167,7 @@
Anfängliche Punktbreite ist "Voll".
Auf ein Element doppeltippen, es beim zweiten Tippen gedrückt halten und es dann an die gewünschte Position ziehen
Dieses Fenster wird nach Abbruch der Installation geschlossen.
-Dreipunkt-Menü-Schaltfläche
+Dreipunkt-Menü-Button
Offline
Einschränkungen hinzufügen
Hallo
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_el.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_el.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_el.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_el.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -4899,7 +4899,7 @@
Η συσκευή θα αποσυνδέεται αυτόματα μόλις απενεργοποιείται ή όταν δεν χρησιμοποιείται
Οι ιστότοποι μπορούν να ζητούν άδεια για την εγκατάσταση εφαρμογών ιστού στη συσκευή σας
Δημιουργία
-Όροι Παροχής Υπηρεσιών
+Όροι παροχής υπηρεσιών
Προσαρμογή κουμπιών γραφίδας
Το Smart Lock είναι ενεργοποιημένο
Σύμπτυξη κατακόρυφων καρτελών
@@ -5177,7 +5177,7 @@
Πραγματοποιείται λήψη των αρχείων αναγνώρισης ομιλίας… %
Ομαδοποίηση καρτελών με AI
Μπορείτε να χρησιμοποιήσετε τη γλώσσα του Λογαριασμού Google που προτιμάτε ()
-Συμβάλλετε στη βελτίωση των λειτουργιών και της απόδοσης του Chrome
+Συμβάλετε στη βελτίωση των λειτουργιών και της απόδοσης του Chrome
Δημιουργήθηκε εικόνα σχετικά με , σε στιλ
Έναρξη
Κάντε δεξί κλικ σε μια καρτέλα και επιλέξτε Προσθήκη καρτέλας σε νέα ομάδα
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_es-419.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_es-419.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_es-419.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_es-419.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -3598,7 +3598,7 @@
Seguridad
Se agotó el papel
Habilitar
-Pregúntale al Modo IA
+Preguntarle al Modo IA
Administra tu actividad en las Apps con Gemini
Consulta tus archivos de SharePoint y OneDrive, y el calendario de Outlook
Ninja
@@ -6723,7 +6723,7 @@
Detecta eventos peligrosos cuando ocurren y te advierte sobre ellos.
Si deseas obtener más información, comunícate con tu administrador
archivo local o compartido
-Busca en Google o escribe una URL
+Buscar en Google o escribir una URL
¿Quieres salir del grupo de pestañas?
Activo
No puedo acceder
@@ -7538,7 +7538,7 @@
No pueden administrar las ventanas de todas tus pantallas
retroceso
Tu llave de seguridad no está protegida con un PIN. Para administrar las huellas dactilares, crea uno.
-Agregar pestañas y otras cosas
+Agregar pestañas y más
Firma X9.62 ECDSA con SHA-384
Mostrar detalles
Confirmar la descarga
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_es.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_es.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_es.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_es.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -202,7 +202,7 @@
Editar motor de búsqueda
Cyberpunk
Consulta las fotos y el contenido multimedia de tu teléfono
-Gestionar apps
+Gestionar aplicaciones
Crear vista dividida
{0,plural, =1{Cerrar ventana de Incógnito}other{Cerrar ventanas de Incógnito (# ventanas)}}
Elige un nombre y un tema de color para diferenciar entre perfiles
@@ -4913,7 +4913,7 @@
Se ha eliminado del historial de descargas, pero aún está en tu dispositivo
Vuelve a iniciar sesión para confirmar que tu cuenta se puede usar con sitios web, aplicaciones y extensiones tanto en Chrome como en Google Play. También puedes quitar esta cuenta. Más información
Aplicaciones instaladas y emitidas desde
-Tu contraseña original de este sitio se ha encontrado en una brecha de seguridad de datos públicos. El pediste a que cambiara automáticamente tu contraseña.
+Tu contraseña original de este sitio se ha encontrado en una brecha pública de seguridad de datos. El pediste a que cambiara automáticamente tu contraseña.
Reiniciar y restablecer
Rotación de pantalla
Nombres de almacenamiento extraíble
@@ -5553,7 +5553,7 @@
Ir al sitio
Excel
{NUM_TABS,plural, =1{Activar sonido del sitio}other{Activar sonido de los sitios}}
-Tu contraseña se ha encontrado en una brecha de seguridad de datos públicos
+Tu contraseña se ha encontrado en una brecha pública de seguridad de datos
El administrador ha hecho un cambio que afecta a todo el sistema e inhabilita algunos perfiles antiguos. Ya no puedes acceder a este perfil, pero puedes quitarlo.
Estás a punto de eliminar tus datos de guardados en este dispositivo
Los sitios se suelen conectar a dispositivos HID para usarlos en funciones que utilizan teclados poco habituales, mandos de juegos y otros dispositivos
@@ -8225,7 +8225,7 @@
Confirma el número PIN
Mantén tus pestañas ordenadas con la IA
Nombre del contenedor
-Pregunta a Google o escribe una URL
+Preguntar a Google o escribir una URL
Para enviar esta pestaña a otro dispositivo, inicia sesión en Chrome en ambos dispositivos
Seguir bloqueando imágenes
En modo tablet, toca el botón del contador de pestañas situado en la barra de herramientas para abrir la nueva barra de pestañas donde se muestran miniaturas de cada pestaña.
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_et.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_et.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_et.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_et.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -368,7 +368,7 @@
Pealkirjata
Taotluse lõpule viimiseks puudutage uuesti turvavõtit.
Lokaat
-{0,plural, =1{Salvesta üks kontol olev üksus}other{Salvesta # kontol olevat üksust}}
+{0,plural, =1{Salvesta üks üksus kontole}other{Salvesta # üksust kontole}}
Loo selle pildi jaoks QR-kood
Service Workers
Teadaolevad võrgud
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_eu.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_eu.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_eu.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_eu.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -260,7 +260,7 @@
lan-eremukoa da
Kendu egin da txartela, azkenaldian erabili ez duzulako
igarotakoan irekiko da…
-Azkenaldiko AA bidez sortutako garren gaia, erakusten duena, estiloan, .
+Azkenaldiko AA bidezko garren gaia, erakusten duena, estiloan, .
Galdetu Google-ri aurreko orriari buruz
Aldatu hizkuntza automatikoki, hautatutako edukiaren arabera
Jokoak kontrolatzeko aukerak
@@ -3052,7 +3052,7 @@
Eskuineko botoiarekin klik egiteko, erabili ukipen-panela eta teklatua
Hautatu inportatu beharreko elementuak:
Azpititulu automatikoak
-Azkenaldiko AA bidez sortutako gaia ()
+Azkenaldiko AA bidezko gaia ()
Ezkutatu proiektuak
Ez molestatzeko modua gaituta dago
Kontrolatu datuak
@@ -5268,7 +5268,7 @@
Segurtasun-giltzak ez dauka hatz-markarik gordeta
Saiatu berriro minutu batzuk barru.
Onartzen diren esteka batzuek aplikazioan irekitzen jarraituko dute.
-AA bidez azkenaldian sortutako gaiak
+Azkenaldiko AA bidezko gaiak
Sakatu desegiteko
Gailuaren hizkuntza aldatzeko, Chromebook berrabiarazi egin behar duzu. Lortu informazio gehiago
Kanpoko luzapena lehendik dagoenaren bertsio berean edo zaharragoan dago.
@@ -6346,7 +6346,7 @@
Gorde da pasahitza. Ikusi eta kudeatu gordetako pasahitzak hemen: .
Hasi saioa webgunean
Beste norbaitek pantailari begiratzen dionean, erakutsi Pribatutasun-begia ikonoa pantailaren behealdean, eskuinetara
-Azkenaldiko AA bidez sortutako garren gaia, erakusten duena, estiloan
+Azkenaldiko AA bidezko garren gaia, erakusten duena, estiloan
Gaiaren sortzailea:
Aurrera egin nahi duzu, eta software honi gailuan aldaketak egiteko baimena eman?
Ez egin jarraipenik
@@ -9173,7 +9173,7 @@
Leheneratu atzeko plano lehenetsia
Aplikazioan gordetako datuak
× dpi
-Azkenaldiko AA bidez sortutako garren gaia, erakusten duena
+Azkenaldiko AA bidezko garren gaia, erakusten duena
Chrome-ren segurtasun sendoena daukazu
Internetera konektatuta egon arren arazoak badirau, webgunean aurrera egiteko beste modu batzuk proba ditzakezu.
. Baimena eskatu da. Erantzuteko, sakatu F6.
@@ -9979,7 +9979,7 @@
Mendia
Erabili oraingo orriak
Fitxa taldeak
-Azkenaldiko AA bidez sortutako garren gaia, erakusten duena, .
+Azkenaldiko AA bidezko garren gaia, erakusten duena, .
Arakatzaile zaharrekiko bateragarritasuna (LBS) - Barnekoak
Desgaitu da ADB arazketa
Gailu-identifikatzailea gatazkatsua da.
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_fa.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_fa.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_fa.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_fa.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -1110,7 +1110,7 @@
قلم ایتالیک
این برنامه صفحهای را که هنگام جستجو از Omnibox نشان داده میشود، کنترل میکند.
فراموشی گذرواژه قدیمی
-برای حذف برنامهها به «تنظیمات > فروشگاه Google Play > مدیریت اولویتهای Android > برنامهها یا مدیر برنامه» بروید. سپس روی برنامهای که میخواهید حذف نصب شود تکضرب بزنید (ممکن است برای پیدا کردن برنامه نیاز باشد صفحه را تند بهراست یا چپ بکشید). سپس روی «حذف نصب» یا «غیرفعال کردن» تکضرب بزنید.
+برای برداشتن برنامهها به «تنظیمات > فروشگاه Google Play > مدیریت اولویتهای Android > برنامهها یا مدیر برنامه» بروید. سپس روی برنامهای که میخواهید حذف نصب شود تکضرب بزنید (ممکن است برای پیدا کردن برنامه نیاز باشد صفحه را تند بهراست یا چپ بکشید). سپس روی «حذف نصب» یا «غیرفعال کردن» تکضرب بزنید.
پیمایش بهسمت آخرین زبانه
الگوی گواهینامه Microsoft
در حال ارسال درخواست...
@@ -2266,7 +2266,7 @@
بسیار بزرگ
برای محافظت از حریم خصوصیتان مسدود شده است
گواهی در انتظار
-بازگشت
+برگشتن
تایپ کردن میانبر
کلیدهای چسبان
برداشتن ، از فهرست
@@ -4643,7 +4643,7 @@
خطای شبکه رخ داد.
مجاز کردن حرکتگذاری انعطافپذیر. برای مثال، میتوانید با تایپ کردن «anhs» یا «asnh» به «ánh» برسید.
فضای دستگاه خیلی کم است
-محدودیت جدید مدت تماشای صفحه
+حد جدید مدت تماشای صفحه
SSID پنهان
دایره ساختن با لبها
بازراهاندازی برای powerwash
@@ -6934,7 +6934,7 @@
محافظت همزمان و پیشکنشی با ارسال اطلاعات بیشتر به «مرور ایمن Google»
درحال همگامسازی در
نمایش همیشگی گزینههای دسترسپذیری
-برگشت
+برگشتن
سازمانتان، ، نمیتواند دادههای موجود شما را ببیند یا مدیریت کند. این دادهها در نمایه فعلی باقی خواهد ماند.
نام اصلی Microsoft
گزارشهای سرویس
@@ -8998,7 +8998,7 @@
پرچمهای ChromeOS
اعلانها روی صفحه نشان داده نمیشوند. با کلیک کردن روی نماد «مزاحم نشوید» در پایین سمت چپ صفحه، همچنان میتوانید اعلانها را ببینید.
نصب …
-سعی مجدد
+امتحان مجدد
جلسه قبلی ازسر گرفته نشد
Microsoft 365 برای باز کردن و ویرایش فایلهای Word، Excel، و PowerPoint از OneDrive استفاده میکند. میتوانید این فایلها را در منو پیمایش کناری برنامه Files با برچسب «Microsoft OneDrive» پیدا کنید. باید با حساب Microsoft به سیستم وارد شوید. بیشتر بدانید
سایتها ممکن است مطابق انتظار شما عمل نکنند. اگر میخواهید اطلاعاتی درباره سایتهایی که بازدید میکنید در دستگاه باقی نگذارید، این گزینه را انتخاب کنید.
@@ -11474,7 +11474,7 @@
{NUM_TABS,plural, =1{انتقال زبانه به پنجرهای دیگر}one{انتقال زبانهها به پنجرهای دیگر}other{انتقال زبانهها به پنجرهای دیگر}}
برای شروع همگامسازی، تنظیمات همگامسازی را تأیید کنید.
صرفهجوییهای بسیار زیاد
-مرور کردن سریعتر میشود زیرا احتمال کمتری وجود دارد که سایتی از شما بخواهد تأیید کنید شما شخص واقعی هستید
+مرور کردن سریعتر میشود زیرا احتمال کمتری وجود دارد که سایتی از شما بخواهد درستیسنجی کنید شما شخصی حقیقی هستید
وقتی که دستگاهی متصل نشده باشد
پایدار
Web Store
@@ -11602,7 +11602,7 @@
وقتی ارتقا به پایان برسد، برنامهتان باز خواهد شد. ارتقا ممکن است چند دقیقه طول بکشد.
برای دسترسی آسان، میتوانید این پانل کناری را سنجاق کنید
نمایش گزینهها
-همانطور که مرور میکنید، سایتها میتوانند ازطریق Chrome بررسی کنند و بااستفاده از سایت قبلی که بازدید کردهاید تأیید کنند که احتمالاً شما شخص واقعی هستید
+همانطور که مرور میکنید، سایتها میتوانند ازطریق Chrome بررسی کنند و بااستفاده از سایت قبلی که بازدید کردهاید درستیسنجی کنند که احتمالاً شما شخص واقعی هستید
میتواند این فایلها و پوشهها را ویرایش کند:
ممکن است هزینه داده تلفن همراه اعمال شود
منابع
@@ -12138,7 +12138,7 @@
نمایان با نام …
ارسال بازخورد
-سایتهایی که بازدید میکنید میتوانند تأیید کنند که شما شخص واقعی هستید و روبات نیستید
+سایتهایی که بازدید میکنید میتوانند درستیسنجی کنند که شما شخص واقعی هستید و روبات نیستید
&بازرسی عناصر
پاسخ شما
نمیتواند فایلهای این پوشه را باز کند زیرا فایلهای سیستم در آن وجود دارد
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_fi.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_fi.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_fi.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_fi.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -2328,7 +2328,7 @@
Tarkistetaan virtuaalikoneen kuvaa
Kuka käyttää tätä laitetta: ?
Synkronointi pois käytöstä
-Videokehys kopioitu
+Videon yksittäiskuva kopioitu
Kuuntele laajennuksen toiminnot valitsemalla Aloita
Jotain meni pieleen. Virhekoodi: .
Optimoidaanko koko näytön suoratoisto?
@@ -4767,7 +4767,7 @@
Jatka siitä, mihin jäit
Lisää sivustoja
Poista välilehti listasta
-Kopio&i videokehys
+Kopio&i videon yksittäiskehys
Muokatut sanat
Uusi &välilehti
Voit valita synkronoitavan sisällön asetuksissa.
@@ -6139,7 +6139,7 @@
Suositus
Vahvista koodi seuraamalla puhelimen ohjeita
Salasanan vähimmäispituus on kahdeksan merkkiä
-Kopio&i videokehys
+Kopio&i videon yksittäiskuva
Netscape-varmenteen SSL-palvelimen nimi
Vapauta levytilaa, tai tiettyjä tietoja voidaan poistaa automaattisesti.
Ohjaa hiiren kohdistinta näppäimistöllä tai numeronäppäimistöllä
@@ -6939,7 +6939,7 @@
Palvelulokit
Avaaminen ei onnistu. Lisää salasana.
Sivustot julkaisevat joskus PDF-tiedostoja, kuten asiakirjoja, sopimuksia ja lomakkeita
-Sivustot voivat näyttää henkilöllisyyspalveluiden sisäänkirjautumiskehotteita
+Sivustot voivat näyttää identiteettipalveluiden sisäänkirjautumiskehotteita
Avataan edellisen laitteen ikkunoita
Yhdistetty:
Rajoita liikettä näytöllä
@@ -7181,7 +7181,7 @@
Uusi välilehti oikealle
Kanava vaihdettiin. Ota muutokset käyttöön käynnistämällä laite uudelleen.
Valittu tulostin ei ole käytettävissä tai sitä ei ole asennettu oikein. Tarkista tulostin tai valitse toinen tulostin.
-Estä henkilöllisyyspalveluiden sisäänkirjautumiskehotteet
+Estä identiteettipalveluiden sisäänkirjautumiskehotteet
Jos vaihdoit, päivitä muutos tallennettuihin salasanoihin ().
Tunnetut verkot
Estetty automaattisesti: ,
@@ -7392,7 +7392,7 @@
Lomittain
Avaa koko ruudulla
Verkkotunnuksen järjestelmänvalvoja on lukinnut laitteen (sarjanumero )
-&Hae videokehystä tällä:
+&Hae videon yksittäiskuvaa tällä:
Pinon jälki
– USB-laite yhdistetty
Kun esität historiaasi koskevia kysymyksiä, voit saada tiettyyn avaamasi sivun sisältöön liittyviä vastauksia
@@ -11155,7 +11155,7 @@
Muokkaa pikanäppäintä…
Siirrä ylös
Kaikki linkin saaneet voivat muokata kaikkia välilehtiä, joten ne kannattaa jakaa harkiten. Linkki vanhenee 48 tunnin kuluttua.
-&Hae videokehystä tällä:
+&Hae videon yksittäiskuvaa tällä:
Vain pieniä kirjaimia, numeroita, alaviivoja ja yhdysviivoja
Kirjautumistavat
Laajennusten käyttö kielletty
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_fr.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_fr.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_fr.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_fr.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -668,7 +668,7 @@
Impossible de charger "" pour le thème.
Sélectionnez une action pour la touche
Activer la &synchronisation…
-Fiche d'aperçu du survol de l'onglet
+Aperçu au survol de l'onglet
Vous pouvez utiliser ce compte avec les applis Android. Pour ajouter le compte d'une autre personne, ajoutez plutôt un nouvel utilisateur à votre .
Les autorisations que vous avez déjà accordées aux applis peuvent s'appliquer à ce compte. Vous pouvez contrôler les autorisations pour les applis Android dans Paramètres des applications.
@@ -755,7 +755,7 @@
Épingler la vue fractionnée
Les dossiers partagés sont disponibles sous Windows dans .
d'exporter les mots de passe
-Vous pouvez regrouper des onglets pour rassembler des pages similaires et les enregistrer sur vos différents appareils
+Regroupez les onglets pour rassembler des pages similaires et les enregistrer sur vos différents appareils
Moteur de recherche
Lire un ton plus haut
L'accès à votre caméra est bloqué pour cette page
@@ -2484,7 +2484,7 @@
Conseil : De nombreuses applis Android sont disponibles sur le Web. Vérifiez leur disponibilité dans l'appli ou sur le site Web du développeur.
Événement
Impossible de se connecter à l'imprimante. Vérifiez qu'elle est sous tension et connectée à votre Chromebook par Wi-Fi ou USB.
-Page de cache amélioré :
+Page de cache back/forward :
Naviguez plus rapidement et consommez moins de données en mode simplifié. Cliquez ici pour en savoir plus.
Chrome Web Store
Ajout du profil eSIM. Cela peut prendre quelques minutes.
@@ -2683,7 +2683,7 @@
Google Pay
Utilisez votre clé de sécurité avec
Check-up Mots de passe
-Apparence de la fiche d'aperçu du survol de l'onglet
+Apparence de l'aperçu au survol de l'onglet
Descripteurs de fichiers
GTK
–
@@ -4046,7 +4046,7 @@
Inspecter le pop-up
Une seule fois
Aucune remarque ajoutée
-Sous-cadre en cache amélioré :
+Sous-cadre en cache back/forward :
Obtenir les clés d'accès
Code incorrect. Réessayez.
Pour utiliser le Gestionnaire de mots de passe de Google avec le trousseau macOS, relancez Chrome et autorisez l'accès au trousseau. Vos onglets s'ouvriront alors de nouveau.
@@ -4312,7 +4312,7 @@
est configuré pour s'ouvrir dans un nouvel onglet de navigateur. Les liens compatibles s'ouvriront aussi dans le navigateur. En savoir plus
Fenêtres redimensionnées en haut
Paramètres du Partage à proximité pour l'appareil de dans le compte .
-Choisissez d'afficher l'utilisation de la mémoire et les images dans la fiche d'aperçu du survol de l'onglet
+Choisissez d'afficher l'utilisation de la mémoire et les images dans l'aperçu au survol de l'onglet
Gestionnaire de téléchargement
Certaines pages que vous consultez sont préchargées
Le contenu Web disponible dans plusieurs langues vous sera proposé dans la première langue disponible de cette liste. Ces préférences sont synchronisées avec les paramètres de votre navigateur. En savoir plus
@@ -5007,7 +5007,7 @@
partage une fenêtre.
Afficher les notifications
Nom à afficher
-Afficher l'utilisation de la mémoire sur la fiche d'aperçu du survol de l'onglet
+Afficher l'utilisation de la mémoire dans l'aperçu au survol de l'onglet
Ne pas autoriser les sites à se connecter aux appareils sur votre réseau local
Demande de site Web approuvée
Activer/Désactiver la dictée
@@ -6043,7 +6043,7 @@
Non autorisé à suivre la position de la caméra
Afficher le code
Liste des sites que vous avez bloqués et qui ne doivent pas suggérer d'annonces à d'autres sites
-Sous-cadre de navigation privée en cache amélioré :
+Sous-cadre de navigation privée en cache back/forward :
Vous pouvez ouvrir et modifier les fichiers compatibles avec cette appli depuis l'appli Fichiers ou d'autres applis. Pour contrôler quels fichiers s'ouvrent dans cette appli par défaut, découvrez comment définir les applis par défaut sur votre appareil.
Communiquer avec les applications natives associées
Progression
@@ -9808,7 +9808,7 @@
Cliquez sur "Mots de passe et saisie automatique"
Impossible de vérifier si ce document est sûr, car il est trop volumineux. Vous ne pouvez pas imprimer de documents de plus de 50 Mo.
Certains éléments sont bloqués
-Ouvrez facilement Gemini avec
+Ouvrez-le facilement avec
Imprimantes et scanners
Non, continuer à utiliser ce profil pour l'école
Désactivé
@@ -10308,7 +10308,7 @@
Délai dépassé
L'optimisation V8 est désactivée
Remplacer par la vue du haut
-Page de navigation privée en cache amélioré :
+Page de navigation privée en cache back/forward :
Aidez-nous à améliorer la saisie automatique
Phrase précédente
Accéder à l'ensemble du texte énoncé à l'aide de la synthèse vocale
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_hr.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_hr.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_hr.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_hr.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -669,14 +669,14 @@
Nije uspjelo učitavanje putanje "" za temu.
Odaberite radnju za tipku
Uključite &sinkronizaciju...
-Zadržavanje lebdeće kartice pregleda
+Lebdeća kartica pregleda
Ovaj račun možete koristiti s Android aplikacijama. Ako želite dodati račun za nekog drugog, umjesto toga dodajte novu osobu na svoj .
Dopuštenja koja ste već dali aplikacijama mogu se primijeniti na ovaj račun. Dopuštenjima za Android aplikacije možete upravljati u postavkama aplikacija.
Alat za kistove
Žarišne točke vašeg uređaja
Ponovno pritisnite tipku da biste potvrdili dodjelu i
-Otvori profil gosta
+Otvorite profil gosta
Web-stranica, jedna datoteka
Pošalji zapisnike o otklanjanju pogrešaka (preporučeno)
I&zradi snimku zaslona
@@ -2576,7 +2576,7 @@
Nadzirane korisnike onemogućio je administrator.
Vaš će se uređaj isključiti za . Uklonite USB i ponovo uključite uređaj. Nakon toga možete upotrebljavati .
ID:
-Otvori profil gosta
+Otvorite profil gosta
Boja limuna
Ograničenja
WebRTC zapisnici
@@ -4502,7 +4502,7 @@
USB-C uređaj (stražnji desni priključak)
Reproduciraj animaciju
Prikvači na alatnu traku
-Prikaži slike pregleda kartice
+Prikaži slike na pregledu kartice
Upravljajte pisačima
Nećete moći upotrebljavati Android aplikacije i Trgovinu Google Play
Isticanje pokazivača miša prilikom kretanja
@@ -7732,7 +7732,7 @@
Pitaj prije kopiranja ili premještanja Microsoftovih datoteka na Microsoft OneDrive
Ukloni priključak
Povezivanje s uređajem
-Prilagodba profila
+Prilagodite profil
Odaberite certifikat za svoju autentikaciju na
Otvori aplikacijom
Kada zatvorite duplikate zadržava se najstarija kopija
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_is.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_is.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_is.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_is.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -3949,7 +3949,7 @@
Halda áfram að veita aðgang að hljóðnemanum
Lesa aðgengisstillingar
Gögn frá innfelldum vefsvæðum
-Bendilshraði
+Hraði bendils
Bætir við seinkun á milli þess þegar þú ýtir á lykil og þess þegar hann virkjast
TrackPoint-hröðun
Bættu við flipa og fleiru
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_it.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_it.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_it.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_it.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -1200,7 +1200,7 @@
Sospendi alla chiusura dello schermo
La pagina non risponde. Puoi aspettare oppure chiuderla.
Lingua in cui tradurre
-Reimposta
+Riaddestra
Fai clic per attivare
Una scheda in secondo piano sta usando il microfono
Esamina visualizzazioni
@@ -3188,7 +3188,7 @@
Seleziona lo stato dell'esperimento . Descrizione dell'esperimento:
Avatar giallo predefinito
Apri comunque
-In ascolto…
+Sto ascoltando
Nuovo gruppo
Annulla sincronizzazione
Riproduci dall'inizio
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_ja.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_ja.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_ja.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_ja.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -8543,7 +8543,7 @@
エラー
にログインしているデバイスのみ
保存したパスワードに常にアクセスできるようにするには、本人確認を行ってください
-現在のタブで新しい分割表示
+現在のタブで新しい分割ビュー
XML サイトリストの前回のダウンロードは に行われました。
チャットアプリのステータスを設定するため、サイトでデバイスのアクティブ状態を検出する場合があります。
ネットワークのデバッグ
@@ -9608,7 +9608,7 @@
Chrome アプリが開いている間 Chrome は実行され続けます。
Gemini によるログイン
候補の履歴
-現在のタブで新しい分割表示
+現在のタブで新しい分割ビュー
データが失われる危険があります。
入力設定
一部
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_kk.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_kk.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_kk.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_kk.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -5878,7 +5878,7 @@
Қонақ режимінде веб-қолданбалар орнатылмайды
Аяқталғанда ашу
Принтер ақпаратын өзгерту
-Құпия сөз дұрыс емес
+Құпия сөз қате.
Сайттар виртуалдық шындық құрылғыларын және деректерді пайдалануға рұқсат сұрай алады.
{NUM_TABS,plural, =1{Сайттың дыбысын өшіру}other{Сайттардың дыбысын өшіру}}
Қауіпсіздік тексерісі жүргізілді. Құжатыңыз басып шығарылады.
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_ko.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_ko.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_ko.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_ko.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -7555,7 +7555,7 @@
모든 디스플레이의 창 관리 허용 안함
백스페이스
보안 키가 PIN으로 보호되어 있지 않습니다. 지문을 관리하려면 먼저 PIN을 만드세요.
-탭 등 추가
+탭 및 기타 정보 활용
SHA-384를 포함한 X9.62 ECDSA 서명
세부정보 표시
다운로드 확인
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_my.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_my.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_my.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_my.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -6086,7 +6086,7 @@
ဝင်းဒိုးအသစ်တွင် အဖွဲ့ကို ဖွင့်ရန်
သင်၏အရာများကို အရန်သိမ်းမလား။
ရုပ်ဖျက်မုဒ်မှ ထွက်ရန်
-&စာညှပ် မန်နေဂျာ
+&ဝဘ်လိပ်စာ စီမံစနစ်
ဤစက်တွင် အတွက် လျှို့ဝှက်ကီး မရှိပါ
ပြုစုသူ ကိရိယာများ
{NUM_OF_FILES,plural, =1{ဖိုင် ၁ ဖိုင်ရွှေ့လိုက်သည်}other{ဖိုင် {NUM_OF_FILES} ဖိုင်ရွှေ့လိုက်သည်}}
@@ -9544,7 +9544,7 @@
သင့်မိသားစုဝင်သည် စကားဝှက်များကို ယခု မရယူနိုင်ပါ။ Chrome အပ်ဒိတ်လုပ်ပြီး သူ၏စကားဝှက်များ စင့်ခ်လုပ်ခိုင်းပါ။
ဤရွေးချယ်စရာကို ယခုမရနိုင်ပါ။
ရုပ်ဖျက်ဌာန-:
-ဖြတ်လမ်းလင့်ခ်များ ပြရန်
+ဖြတ်လမ်းများ ပြရန်
Microsoft 365 ဖိုင်
စာလုံးကြီးများကို ဖတ်သည့်အခါ
ပရိုဖိုင်ကို အမည်ပြောင်းရန်
@@ -10438,7 +10438,7 @@
စာရင်းသွင်းမှုကို ဤစက်တွင်သာ ထည့်သွင်းထားပြီး သင့်အကောင့်အောက်ရှိ အခြားစက်များနှင့် စင့်ခ်လုပ်ထားခြင်း မရှိပါ။ ပိုမိုလေ့လာရန်
အဆက်အသွယ် စာရင်းကို ဒေါင်းလုဒ်လုပ်နေသည်...
မိုက်ခရိုဖုန်း ခွင့်ပြုချက်
-&စာညှပ် မန်နေဂျာ
+&ဝဘ်လိပ်စာ စီမံစနစ်
က သင်လက်မှတ်ထိုးဝင်ပုံကို မှတ်ထားပြီး ရနိုင်တိုင်း အလိုအလျောက် လက်မှတ်ထိုးဝင်ပေးသည်။ ပိတ်ထားပါက အကြိမ်တိုင်း အတည်ပြုချက် တောင်းပါမည်။
Chrome ကပိတ်ထားသည်။ ဤနောက်ဆက်တွဲသည် လုံခြုံမှုမရှိနိုင်ပါ။
{EXTENSIONS_COUNT,plural, =1{လိပ်စာ # ခု}other{လိပ်စာ # ခု}}
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_no.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_no.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_no.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_no.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -4485,7 +4485,7 @@
Bluetooth i ChromeOS
Blokker og forlat
Fortsett å blokkere dette nettstedet fra å få tilgang til posisjonen din
-Kopiér link
+Kopier link
Denne fanen er koblet til en USB-enhet
Velg tidssone
Logg av
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_pt-BR.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_pt-BR.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_pt-BR.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_pt-BR.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -2742,7 +2742,7 @@
Parar de carregar esta página
Pasta de favoritos
Para salvar senhas na Conta do Google, ative a sincronização.
-Definir Estilo e fundo de tela
+Definir plano de fundo e estilo
Ativar a opção "Não rastrear" significa que uma solicitação será incluída no tráfego de navegação. Qualquer efeito depende de o website responder ou não à solicitação e de como ela é interpretada. Por exemplo, alguns websites podem reagir a esse pedido mostrando anúncios que não têm qualquer relação com os sites que você costuma visitar. Mesmo assim, alguns websites ainda vão coletar e usar seus dados de navegação para, por exemplo, melhorar a segurança, gerar conteúdo, anúncios, recomendações e relatórios de estatística.
Detalhes da impressora
Usar os tamanhos predefinidos para evitar problemas em smartphones, tablets ou janelas redimensionáveis
@@ -8465,8 +8465,8 @@
Muito pequeno
&Gerenciar mecanismos de pesquisa…
Link do doodle
-Os dados de apps podem ser quaisquer dados que um app tenha salvo (com base nas configurações do desenvolvedor), incluindo dados como contatos, mensagens e fotos. Os dados de backup não são contabilizados na cota de armazenamento no Google Drive da criança.
- Você pode desativar esse serviço nas configurações.
+Dados do app são as informações salvas pelo app (com base nas configurações do desenvolvedor), incluindo contatos, mensagens e fotos. Os dados de backup não são contabilizados na cota de armazenamento no Google Drive da criança.
+ Você pode desativar esse serviço nas Configurações.
Backup do Linux cancelado
PIN inválido
Esquecer este dispositivo?
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_ro.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_ro.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_ro.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_ro.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -8560,7 +8560,7 @@
Erori
Doar dispozitivele conectate la
Confirmă-ți identitatea ca să te asiguri că ai în permanență acces la parolele salvate
-Noua afișare împărțită cu fila actuală
+Afișare împărțită nouă cu fila actuală
Listele de site-uri XML au fost descărcate ultima dată pe .
Site-urile detectează de obicei când folosești activ dispozitivul pentru a-ți seta disponibilitatea în aplicații de chat
Remedierea erorilor de rețea
@@ -9625,7 +9625,7 @@
Chrome va rula în continuare când sunt deschise aplicații Chrome.
Gemini poate să se conecteze pentru tine
Istoricul sugestiilor
-Noua afișare împărțită cu fila actuală
+Afișare împărțită nouă cu fila actuală
Ușurel. Fiți atent(ă).
Setări de introducere a textului
Câteva
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_sk.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_sk.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_sk.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_sk.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -7172,7 +7172,7 @@
Nová karta vpravo
Kanál sa zmenil. Ak chcete zmeny použiť, reštartujte zariadenie.
Vybraná tlačiareň nie je k dispozícii alebo nie je správne nainštalovaná. Skontrolujte tlačiareň alebo skúste vybrať inú.
-Blokovať výzvy na prihlásenie zo služieb identity
+Blokovať výzvy na prihlásenie od služieb identity
Ak áno, upravte svoje uložené heslo v službe tak, aby sa zhodovalo s týmto novým heslom.
Známe siete
Automaticky blokované: ,
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_sl.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_sl.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_sl.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_sl.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -836,7 +836,7 @@
Dejavnost v ozadju in nekateri vizualni učinki (denimo gladko drsenje) bodo morda omejeni.
Imenika razširitve ni bilo mogoče premakniti v profil.
Ustvari profil
-Daljši pritisk tipk
+Počasne tipke
Sledilna ploščica
Nadaljuj predvajanje v napravi
To omogoča dostop do lokacije za aplikacije, spletna mesta z dovoljenjem za lokacijo in sistemske storitve
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_sq.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_sq.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_sq.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_sq.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -10674,7 +10674,7 @@
Uebsajtet në gjuhët e tua
Dallgë që përplasen në det, me një qytet dhe kështjellë imagjinare në sfond, me atmosferë të errët.
Printerë të tjerë të disponueshëm
-Kapërce
+Anashkalo
të gjitha faqet
Titrat
Llogaria jote
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_sr-Latn.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_sr-Latn.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_sr-Latn.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_sr-Latn.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -5162,7 +5162,7 @@
Preuzimaju se datoteke za prepoznavanje govora... %
Grupišite kartice pomoću veštačke inteligencije
Možete da koristite željeni jezik Google naloga ()
-Pomozite nam da poboljšamo Chrome-ove funkcije i učinak
+Pomozite nam da poboljšamo Chrome-ove funkcije i performanse
Generisana je . slika od , u stilu
Započnimo
Kliknite desnim tasterom na karticu i izaberite Dodaj karticu u novu grupu
@@ -8350,7 +8350,7 @@
{NUM_PAGES,plural, =0{}=1{ i još 1 kartica}one{ i još # kartica}few{ i još # kartice}other{ i još # kartica}}
Poveži se pomoću
Podešavanja Google usluga
-Prethodno
+Nazad
Proverite da li ima pravopisnih grešaka kada unosite tekst na veb-stranicama
Pre
Već ste sačuvali lozinku sa ovim korisničkim imenom za
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_sr.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_sr.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_sr.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_sr.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -5162,7 +5162,7 @@
Преузимају се датотеке за препознавање говора... %
Групишите картице помоћу вештачке интелигенције
Можете да користите жељени језик Google налога ()
-Помозите нам да побољшамо Chrome-ове функције и учинак
+Помозите нам да побољшамо Chrome-ове функције и перформансе
Генерисана је . слика од , у стилу
Започнимо
Кликните десним тастером на картицу и изаберите Додај картицу у нову групу
@@ -8350,7 +8350,7 @@
{NUM_PAGES,plural, =0{}=1{ и још 1 картица}one{ и још # картица}few{ и још # картице}other{ и још # картица}}
Повежи се помоћу
Подешавања Google услуга
-Претходно
+Назад
Проверите да ли има правописних грешака када уносите текст на веб-страницама
Пре
Већ сте сачували лозинку са овим корисничким именом за
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_sw.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_sw.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_sw.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_sw.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -2502,7 +2502,7 @@
Ongeza neno jipya
Muda wake umekwisha
Lo! Kulikuwa na hitilafu wakati wa uumbizaji.
-Ya Juu
+Juu
Kiwango cha betri ya upande wa kushoto %.
Programu zingine zimeruhusiwa kufungua viungo vinavyofunguliwa na . Hatua hii itazuia na zisifungue viungo vinavyoweza kutumika.
Dhibiti kikagua maendelezo
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_te.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_te.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_te.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_te.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -11621,7 +11621,7 @@
మూలాధారాన్ని మార్చు
దయచేసి దేశాన్ని ఎంచుకోండి
సూచించబడిన గ్రూప్ నుండి ట్యాబ్ను మినహాయించండి
- అన్ఇన్స్టాల్ చేయబడింది
+ అన్ఇన్స్టాల్ అయింది
సైట్ మీ లొకేషన్ను ట్రాక్ చేస్తోంది
మీ బుక్మార్క్లు, హిస్టరీ, పాస్వర్డ్లు, ఇతర సెట్టింగ్లలో మార్పులు మీ Google ఖాతాకు ఇకపై సింక్ చేయబడవు. అయినప్పటికీ, ఇప్పటికే ఉన్న మీ డేటా Google ఖాతాలో స్టోరేజ్ చేయబడుతుంది. Google డాష్బోర్డ్లో నిర్వహించబడుతుంది.
పరికర లిస్ట్ను దాచండి
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_tr.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_tr.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_tr.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_tr.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -8766,7 +8766,7 @@
Yazıcılar
Linux kapsayıcısı başlatılıyor
Sekme, sekme şeridinin başına taşındı
-Google Hesabınızı Yönetin
+Google Hesabınızı yönetin
Burada kal
Bir hedef seç
Gelişmiş yazım denetimini etkinleştirin
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_uk.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_uk.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_uk.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_uk.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -8156,7 +8156,7 @@
Переглянути сертифікати, імпортовані з Windows
Пристрій не може підтримувати зв’язок із телефоном. Переконайтеся, що ваш телефон поблизу й розблокований, а Bluetooth і Wi-Fi увімкнено.
Сайти можуть використовувати цю функцію, щоб шукати пристрої в локальній мережі й підключатися до них
-Пошук вкладок
+Пошук на вкладках
Помірне заощадження
Використовувати інший пристрій
Потрібен дозвіл, щоб завантажити
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_vi.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_vi.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_vi.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_vi.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -1209,7 +1209,7 @@
Chuyển sang chế độ ngủ khi đóng nắp màn hình
Trang không phản hồi. Bạn có thể chờ hoặc thoát khỏi trang này.
Ngôn ngữ cần dịch sang
-Đào tạo lại
+Huấn luyện lại
Nhấp để kích hoạt
Thẻ nền đang sử dụng micrô
Kiểm tra giao diện
@@ -9523,7 +9523,7 @@
Có thể cuộn và thu phóng các thẻ được chia sẻ
Hiệu ứng đánh dấu dòng
Loại Chứng chỉ Netscape
-Giúp tôi thay đổi
+Giúp tôi đổi mật khẩu
Khóa bảo mật sẽ lưu giữ bản ghi lượt truy cập của bạn vào trang web này.
Âm thanh của thẻ này đang tắt
Mở thư mục tệp đã tải xuống
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_zh-CN.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_zh-CN.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_zh-CN.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_zh-CN.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -226,7 +226,7 @@
打印机已停止运行
{SELECTED_ITEMS,plural, =0{扩展程序}=1{扩展程序 ({SELECTED_ITEMS})}other{扩展程序 ({SELECTED_ITEMS})}}
头部指针
-在 Chrome 中畅享 Google 的智能技术
+在 Chrome 中畅享 Google 智能功能
现在轮到使用了
要申请访问权限,请与此设备的管理员联系。
允许运行用户脚本
@@ -1600,7 +1600,7 @@
退出前先发提醒信息 ()
如果您删除了自己的某个证书,则不能再用该证书标识自己的身份。
在新的标签页中打开链接
-撤消
+撤销
使用您的精确位置信息,而非基于 IP 地址的估计位置信息,以便获得最准确的 Gemini 结果。
更多设置
使用电池时让电源闲置
@@ -2496,7 +2496,7 @@
如果 Chrome 发现您的密码在公开数据泄露事件中外泄,Google 密码管理工具可能会在您登录时建议更改密码。详细了解自动更改密码
经过简化的动画
不允许网站查看您剪贴板中的文字或图片
-分享组
+共享分组
您的书签和设置已就绪
crx 文件已损坏,未能成功解压。
您的标签页标题和网址会发送给 Google,并且可能由人工审核员查看,以改进此功能。
@@ -9078,7 +9078,7 @@
填充密码时使用 Windows Hello
缺少网络类型
这款 AI 助理可为您提供要点总结、阐明概念、查找答案等
-管理分享设置
+管理共享设置
下列应用也能处理协议链接。其他应用会请求授权。
若要设置指纹,请让您的孩子轻触键盘右上角的指纹传感器。您孩子的指纹数据会安全地存储在此 上,绝不会外泄。
屏幕锁定和登录
@@ -9128,7 +9128,7 @@
自助服务终端和数字标牌设备注册已完成
如果您降低阈值,就可以做出轻微的动作。如果您提高阈值,可能需要做出更夸张的动作。
按下“c”键表示松开鼠标按键
-分享分组
+共享分组
系统默认文字转语音声音
此登录服务由 托管
您的资料由 管理,管理方可以查看某些信息,包括:
diff -Nru chromium-145.0.7632.116/chrome/app/resources/generated_resources_zh-TW.xtb chromium-145.0.7632.159/chrome/app/resources/generated_resources_zh-TW.xtb
--- chromium-145.0.7632.116/chrome/app/resources/generated_resources_zh-TW.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/generated_resources_zh-TW.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -226,7 +226,7 @@
印表機已停止運作
{SELECTED_ITEMS,plural, =0{擴充功能}=1{擴充功能 ({SELECTED_ITEMS})}other{擴充功能 ({SELECTED_ITEMS})}}
頭部指標
-在 Chrome 中體驗 Google 智慧功能
+在 Chrome 體驗 Google 智慧功能
現在可交由「」使用
如需要求存取權限,請與這個裝置的系統管理員聯絡。
允許使用者指令碼
diff -Nru chromium-145.0.7632.116/chrome/app/resources/google_chrome_strings_ca.xtb chromium-145.0.7632.159/chrome/app/resources/google_chrome_strings_ca.xtb
--- chromium-145.0.7632.116/chrome/app/resources/google_chrome_strings_ca.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/google_chrome_strings_ca.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -395,7 +395,7 @@
Google Lens no està disponible. Torna-ho a provar més tard.
Chrome OS no ha pogut sincronitzar les teves dades perquè la sincronització no està disponible per al teu domini.
Chrome necessita permís d'accés a l'emmagatzematge per poder baixar fitxers
-Opcional: ajuda a millorar les funcions i el rendiment de Chrome OS enviant automàticament dades de diagnòstic i d'ús a Google.
+Opcional: ajuda a millorar les funcions i el rendiment de ChromeOS enviant automàticament dades de diagnòstic i d'ús a Google.
Aprofundeix en la cerca afegint diverses pestanyes, fitxers i eines
Exporteu contrasenyes de Chrome
Codi addicional: .
diff -Nru chromium-145.0.7632.116/chrome/app/resources/google_chrome_strings_da.xtb chromium-145.0.7632.159/chrome/app/resources/google_chrome_strings_da.xtb
--- chromium-145.0.7632.116/chrome/app/resources/google_chrome_strings_da.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/google_chrome_strings_da.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -491,7 +491,7 @@
Indgående regel for Google Chrome om at tillade mDNS-trafik.
Chrome lukkes snart
-Google Adgangskodeadministrator
+Google Adgangskodeadministrator
Advarer dig om skadelige websites – også websites, som Google ikke tidligere har kendt til – ved at analysere flere data fra websites end Standardbeskyttelse. Du kan vælge at springe Chrome-advarsler over.
Din forælder har deaktiveret "Tilladelser for websites, apps og udvidelser" for Chrome
Tilpas og styr Chrome. Angiv Chrome som din standardbrowser.
diff -Nru chromium-145.0.7632.116/chrome/app/resources/google_chrome_strings_el.xtb chromium-145.0.7632.159/chrome/app/resources/google_chrome_strings_el.xtb
--- chromium-145.0.7632.116/chrome/app/resources/google_chrome_strings_el.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/google_chrome_strings_el.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -307,7 +307,7 @@
Το Chrome χρειάζεται άδειες κάμερας και μικροφώνου για αυτόν τον ιστότοπο.
Αποσύνδεση από το Chrome;
Να συνδεθούν τα δεδομένα σας στο Chrome με αυτόν το λογαριασμό;
-Όροι Παροχής Υπηρεσιών
+Όροι παροχής υπηρεσιών
Συνδεθείτε, για να συγχρονίσετε και να εξατομικεύσετε το Chrome στις συσκευές σας
Να επιτρέπεται στην επέκταση να εμφανίζει αιτήματα πρόσβασης στη γραμμή εργαλείων του Chrome
{NUM_TABS,plural, =1{Το Chrome συνιστά να θέσετε σε παύση την καρτέλα που επιβραδύνει το πρόγραμμα περιήγησης}other{Το Chrome συνιστά να θέσετε σε παύση τις καρτέλες που επιβραδύνουν το πρόγραμμα περιήγησης}}
diff -Nru chromium-145.0.7632.116/chrome/app/resources/google_chrome_strings_es-419.xtb chromium-145.0.7632.159/chrome/app/resources/google_chrome_strings_es-419.xtb
--- chromium-145.0.7632.116/chrome/app/resources/google_chrome_strings_es-419.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/google_chrome_strings_es-419.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -67,7 +67,7 @@
Abrir vínculo en una ventana de navegación de incó&gnito de Chrome
Google Chrome no puede leer ni agregar datos al directorio de datos:
Cuando escribes en la barra de direcciones o en el cuadro de búsqueda, Chrome envía lo que escribes a las herramientas de búsqueda, IA y agentes de tu organización para obtener sugerencias.
-Google Chrome es un navegador web que ejecuta aplicaciones y páginas web a gran velocidad. Es rápido, estable y fácil de utilizar. Navega por la Web de forma más segura con protección contra suplantación de identidad y software malicioso integrada a Google Chrome.
+Google Chrome es un navegador web que ejecuta aplicaciones y páginas web a gran velocidad. Es rápido, estable y fácil de utilizar. Navega por la Web de forma más segura con protección contra phishing y software malicioso integrada a Google Chrome.
{0,plural, =1{Se reiniciará Chrome en una hora}other{Se reiniciará Chrome en # horas}}
Esto te permitirá seleccionar dispositivos disponibles y mostrar contenido en ellos.
Asegúrate de haber accedido a Chrome en tu y, luego, intenta enviarlo de nuevo.
@@ -600,7 +600,7 @@
Es posible que Google Chrome no funcione correctamente porque ya no es compatible con esta distribución de Linux
Salir de Chrome
{COUNT,plural, =1{La organización cierra Chrome automáticamente si no lo usas durante 1 minuto.}other{La organización cierra Chrome automáticamente si no lo usas durante # minutos.}}
-Se copió el texto.
+Se copió el texto
{COUNT,plural, =1{Tu organización borra automáticamente los datos de navegación si no usas Chrome durante 1 minuto. Esto puede incluir el historial, los datos de Autocompletar y las descargas. Las pestañas permanecerán abiertas.}other{Tu organización borra automáticamente los datos de navegación si no usas Chrome durante # minutos. Esto puede incluir el historial, los datos de Autocompletar y las descargas. Las pestañas permanecerán abiertas.}}
Chrome te advertirá antes de que cargues un sitio con una conexión no segura
Obtén la seguridad más sólida de Chrome
diff -Nru chromium-145.0.7632.116/chrome/app/resources/google_chrome_strings_es.xtb chromium-145.0.7632.159/chrome/app/resources/google_chrome_strings_es.xtb
--- chromium-145.0.7632.116/chrome/app/resources/google_chrome_strings_es.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/google_chrome_strings_es.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -48,7 +48,7 @@
¿Iniciar sesión en Chrome?
&Gestionar perfiles de Chrome
Reinicia para finalizar la actualización de Chrome
-Hola, ,¿en qué estás pensando hoy?
+Hola, ,¿qué tienes en mente hoy?
Error de instalación:
Personaliza tu nuevo perfil de Chrome.
Esta página está protegida
@@ -382,7 +382,7 @@
Personalizar tu perfil de Chrome
Te damos la bienvenida a Chrome. Se ha abierto una nueva ventana del navegador.
Chrome necesita permiso para hacer seguimiento de tus manos
-¿En qué estás pensando hoy?
+¿Qué tienes en mente hoy?
Usa tus contraseñas con Chrome en tu teléfono
No se puede usar tu perfil porque se corresponde con una versión más reciente de Google Chrome.
diff -Nru chromium-145.0.7632.116/chrome/app/resources/google_chrome_strings_fr.xtb chromium-145.0.7632.159/chrome/app/resources/google_chrome_strings_fr.xtb
--- chromium-145.0.7632.116/chrome/app/resources/google_chrome_strings_fr.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/google_chrome_strings_fr.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -378,7 +378,7 @@
Chrome précharge davantage de pages susceptibles de vous intéresser afin qu'elles se chargent plus rapidement lorsque vous les consultez
Gardez Chrome dans votre Dock pour y accéder rapidement à tout moment
Découvrez des applications, des jeux, des extensions et des thèmes exceptionnels pour Google Chrome.
-Personnalisez votre profil Chrome
+Personnaliser votre profil Chrome
Bienvenue dans Chrome, une nouvelle fenêtre du navigateur a été ouverte
Chrome a besoin de l'autorisation de suivre vos mains
À quoi pensez-vous aujourd'hui ?
diff -Nru chromium-145.0.7632.116/chrome/app/resources/google_chrome_strings_hr.xtb chromium-145.0.7632.159/chrome/app/resources/google_chrome_strings_hr.xtb
--- chromium-145.0.7632.116/chrome/app/resources/google_chrome_strings_hr.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/google_chrome_strings_hr.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -206,7 +206,7 @@
Chrome je blokirao ovo preuzimanje jer ta arhivska datoteka uključuje druge datoteke koje mogu skrivati zlonamjerni softver
Prilagodite Chrome da biste svom pregledniku dali novi izgled
Novo pretraživanje
-Dodavanje profila u Chromeu
+Dodajte profil u Chromeu
Povucite za pretraživanje
Vaše izmjene stupit će na snagu sljedeći put kada se ponovo pokrene Google Chrome.
Aplikacije sustava Chrome
@@ -215,7 +215,7 @@
Chrome je blokirao ovo preuzimanje jer je datoteka opasna
Pretražite bilo što na ovoj stranici pomoću Google objektiva
Ako oznake spremate i na Google račun, cijene proizvoda možete pratiti u Chromeu i primati obavijesti kad cijena padne
-Dodavanje profila u Chromeu
+Dodajte profil u Chromeu
Ako dijelite i izvješća o upotrebi Chromea, ta izvješća uključuju URL-ove koje posjećujete
Ponovo pokreni sad
Tada ćete morati ponovo pokrenuti Chrome.
diff -Nru chromium-145.0.7632.116/chrome/app/resources/google_chrome_strings_vi.xtb chromium-145.0.7632.159/chrome/app/resources/google_chrome_strings_vi.xtb
--- chromium-145.0.7632.116/chrome/app/resources/google_chrome_strings_vi.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/google_chrome_strings_vi.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -557,7 +557,7 @@
góc dưới cùng bên phải của khu vực tìm kiếm: % từ bên phải sang, % từ dưới cùng lên
Đang cập nhật Chrome
Ứng dụng Chrome Beta
-Loại bỏ tài khoản khỏi Chrome
+Xoá tài khoản khỏi Chrome
Sao chép
Dịch vụ này giúp cập nhật phần mềm Google của bạn. Nếu dịch vụ này bị vô hiệu hoá hoặc bị dừng, phần mềm Google của bạn sẽ không được cập nhật. Điều này nghĩa là lỗ hổng bảo mật phát sinh sẽ không thể khắc phục được và các tính năng có thể không hoạt động. Dịch vụ này sẽ tự gỡ cài đặt khi không được phần mềm Google nào dùng.
Hệ thống ChromeOS
diff -Nru chromium-145.0.7632.116/chrome/app/resources/google_chrome_strings_zh-CN.xtb chromium-145.0.7632.159/chrome/app/resources/google_chrome_strings_zh-CN.xtb
--- chromium-145.0.7632.116/chrome/app/resources/google_chrome_strings_zh-CN.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/app/resources/google_chrome_strings_zh-CN.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -48,7 +48,7 @@
重新启动即可完成 Chrome 更新
,您好!今天想聊点什么?
安装时出错:
-自定义您的新 Chrome 个人资料
+自定义新的 Chrome 个人资料
此页面受保护
Chrome 操作系统是借助了其他开源软件才得以问世。
结束突出显示的任务。
@@ -237,7 +237,7 @@
尚未保存任何密码。您需要先保存密码才能使用 Chrome 的密码检查功能。
Chrome 无法检查您的密码。请过 24 小时再试。
您的系统管理员已将 Google Chrome 配置为使用备用浏览器访问 。
-在您的所有设备上同步并个性化设置 Chrome
+在所有设备上同步并设置个性化的 Chrome
您已在另一份 Chrome 个人资料中使用 登录
使用 Google 智能镜头搜索此页面
向 Google 智能镜头询问此页面
@@ -302,7 +302,7 @@
已取消安装。
登录 Chrome 后可获享更多功能
Chrome 需要为此网站授予摄像头权限和麦克风权限
-退出 Chrome?
+要在 Chrome 中退出账号吗?
是否将您的 Chrome 数据与此账号相关联?
服务条款
登录即可在您的所有设备上同步并个性化设置 Chrome
@@ -374,7 +374,7 @@
Chrome 会预加载您可能会访问的更多网页,以便提高这些网页在您访问时的加载速度
将 Chrome 保留在程序坞中,即可随时快速访问
查找适用于Google Chrome的精彩应用、游戏、扩展程序和主题背景。
-自定义您的 Chrome 个人资料
+自定义 Chrome 个人资料
欢迎使用 Chrome;已打开新的浏览器窗口
Chrome 需要获得权限,才能跟踪您的手部动作
今天想聊点什么?
@@ -597,7 +597,7 @@
选择要使用 Google 智能镜头搜索的内容
{NUM_DEVICES,plural, =0{一个或多个 Chrome 扩展程序访问过 1 部 USB 设备}=1{一个或多个 Chrome 扩展程序正在访问 1 部 USB 设备}other{一个或多个 Chrome 扩展程序正在访问 # 部 USB 设备}}
Google Chrome 可能无法正常运行,因为它不再支持此 Linux 发行版
-退出 Chrome
+在 Chrome 中退出账号
{COUNT,plural, =1{您的组织会在 Chrome 闲置 1 分钟后自动关闭它。}other{您的组织会在 Chrome 闲置 # 分钟后自动关闭它。}}
已复制文字
{COUNT,plural, =1{您的组织会在 Chrome 闲置 1 分钟后自动删除浏览数据。这些数据可能包括历史记录、自动填充数据和下载内容。您的标签页将会保持打开状态。}other{您的组织会在 Chrome 闲置 # 分钟后自动删除浏览数据。这些数据可能包括历史记录、自动填充数据和下载内容。您的标签页将会保持打开状态。}}
@@ -731,7 +731,7 @@
它还能够控制Chrome启动后显示的页面。
知道了
离最新版本只有一步之遥了!重新启动 Chrome 即可完成更新。
-退出 Chrome
+在 Chrome 中退出账号
向 Google 询问此视频
Google Chrome 无法确定或设置默认浏览器
搜索区域的左下角:左侧 %,底部 %
diff -Nru chromium-145.0.7632.116/chrome/browser/glic/glic_profile_manager.cc chromium-145.0.7632.159/chrome/browser/glic/glic_profile_manager.cc
--- chromium-145.0.7632.116/chrome/browser/glic/glic_profile_manager.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/browser/glic/glic_profile_manager.cc 2026-03-02 23:00:09.000000000 +0000
@@ -28,9 +28,11 @@
#include "chrome/common/chrome_features.h"
#include "chrome/common/chrome_switches.h"
#include "content/public/browser/network_service_instance.h"
+#include "url/gurl.h"
#if !BUILDFLAG(IS_ANDROID)
#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/browser/ui/profiles/profile_picker.h"
#include "chrome/browser/ui/scoped_tabbed_browser_displayer.h"
#endif
@@ -310,6 +312,18 @@
#else
NOTIMPLEMENTED() << "OpenFreDialogInNewTab";
#endif
+ } else if (GlicEnabling::IsTrustFirstOnboardingEnabledForProfile(profile)) {
+#if !BUILDFLAG(IS_ANDROID)
+ // Open a browser and show the FRE in a new tab.
+ chrome::ScopedTabbedBrowserDisplayer displayer(profile);
+ Browser* browser = displayer.browser();
+ chrome::AddAndReturnTabAt(browser, GURL(), /*index=*/-1,
+ /*foreground=*/true);
+ service->ToggleUI(browser, /*prevent_close=*/true,
+ mojom::InvocationSource::kProfilePicker);
+#else
+ NOTIMPLEMENTED() << "ToggleUIOnNewTab";
+#endif
} else {
// Toggle glic but prevent close if it is already open for the selected
// profile.
diff -Nru chromium-145.0.7632.116/chrome/browser/glic/glic_profile_manager.h chromium-145.0.7632.159/chrome/browser/glic/glic_profile_manager.h
--- chromium-145.0.7632.116/chrome/browser/glic/glic_profile_manager.h 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/browser/glic/glic_profile_manager.h 2026-03-02 23:00:09.000000000 +0000
@@ -110,6 +110,8 @@
private:
FRIEND_TEST_ALL_PREFIXES(GlicProfileManagerDidSelectProfileTest,
DidSelectProfile_NoConsent);
+ FRIEND_TEST_ALL_PREFIXES(GlicProfileManagerDidSelectProfileTest,
+ DidSelectProfile_Consented);
// Callback from ProfilePicker::Show().
void DidSelectProfile(Profile* profile);
diff -Nru chromium-145.0.7632.116/chrome/browser/glic/glic_profile_manager_browsertest.cc chromium-145.0.7632.159/chrome/browser/glic/glic_profile_manager_browsertest.cc
--- chromium-145.0.7632.116/chrome/browser/glic/glic_profile_manager_browsertest.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/browser/glic/glic_profile_manager_browsertest.cc 2026-03-02 23:00:09.000000000 +0000
@@ -604,7 +604,7 @@
auto* service = GetMockGlicKeyedService(profile);
if (IsTrustFREOnboardingEnabled()) {
- EXPECT_CALL(*service, ToggleUI(testing::IsNull(), true,
+ EXPECT_CALL(*service, ToggleUI(testing::NotNull(), true,
mojom::InvocationSource::kProfilePicker,
testing::Eq(std::nullopt), testing::_));
} else {
@@ -615,6 +615,29 @@
GlicProfileManager::GetInstance()->DidSelectProfile(profile);
}
+
+IN_PROC_BROWSER_TEST_P(GlicProfileManagerDidSelectProfileTest,
+ DidSelectProfile_Consented) {
+ // Create a profile that is eligible and has consented.
+ Profile* profile =
+#if BUILDFLAG(IS_CHROMEOS)
+ CreateNewUserSessionAndProfile(kAccountId1, /*allow_glic=*/true);
+#else
+ CreateNewProfile(/*signin_and_allow_glic=*/true);
+#endif // BUILDFLAG(IS_CHROMEOS)
+ profile->GetPrefs()->SetInteger(
+ glic::prefs::kGlicCompletedFre,
+ static_cast(glic::prefs::FreStatus::kCompleted));
+ ASSERT_TRUE(GlicEnabling::IsEnabledAndConsentForProfile(profile));
+
+ auto* service = GetMockGlicKeyedService(profile);
+
+ EXPECT_CALL(*service, ToggleUI(testing::IsNull(), true,
+ mojom::InvocationSource::kProfilePicker,
+ testing::Eq(std::nullopt), testing::_));
+
+ GlicProfileManager::GetInstance()->DidSelectProfile(profile);
+}
INSTANTIATE_TEST_SUITE_P(All,
GlicProfileManagerDidSelectProfileTest,
diff -Nru chromium-145.0.7632.116/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_de.xtb chromium-145.0.7632.159/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_de.xtb
--- chromium-145.0.7632.116/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_de.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_de.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -629,7 +629,7 @@
Textfeld ist leer
Mind.
Keine vorherige Schaltfläche
-Vorherige Schaltfläche
+Vorheriger Button
nicht erkannte Eingabe
Fangen wir mit ein paar Tasten an, die du regelmäßig verwenden wirst. Mit der Steuerung-Taste kannst du die Sprachausgabe anhalten. Du findest die Steuerung-Taste unten links auf deiner Tastatur. Drücke zum Fortfahren die Steuerung-Taste.
Zum Seitenanfang
@@ -661,7 +661,7 @@
Alle Lektionen
Nach unten blicken
Titelseite
-Nutze „Bei Berühren vorlesen“, um die Schaltfläche „Nächste Lektion“ zu finden. Anschließend kannst du durch Doppeltippen fortfahren.
+Nutze „Bei Berühren vorlesen“, um den Button „Nächste Lektion“ zu finden. Anschließend kannst du durch Doppeltippen fortfahren.
Braille-Untertitel aktiviert
Braille – vorherige Zeile
Zeile
@@ -713,7 +713,7 @@
Gainsboro
Diktierfunktion ein-/ausschalten
Akustisches Feedback (Earcons) aktivieren oder deaktivieren
-Schaltfläche
+Button
Nächste Liste
hdnggrp
ChromeVox-Lernmodus
@@ -751,7 +751,7 @@
Hierbei handelt es sich um die zweite Überschrift. Zum Springen drückst du entweder auf „Suche + H“ oder auf „Suche + Umschalttaste + H“.
Vorherige Überschrift der Ebene 5
Anhang
-Perfekt! Du kennst jetzt die Grundlagen von ChromeVox. Du kannst diese Anleitung noch einmal starten oder sie beenden, indem du unten auf die entsprechende Schaltfläche tippst.
+Perfekt! Du kennst jetzt die Grundlagen von ChromeVox. Du kannst diese Anleitung noch einmal starten oder sie beenden, indem du unten auf den entsprechenden Button tippst.
Erweiterung für die Sprachausgabe bei Google Enhanced Network
Mit der Gesichtssteuerung kannst du den Cursor mithilfe von Gesichtsbewegungen steuern und Aktionen ausführen, z. B. die linke Maustaste mit einem Lächeln betätigen
Mit zwei Fingern tippen
@@ -848,7 +848,7 @@
Google Assistant
Benachrichtigungsdialogfeld
Inhaltsverzeichnis
-Nächste Schaltfläche
+Nächster Button
Index
Helligkeit verringern
Türkis
@@ -883,7 +883,7 @@
Ressourcen
Violett
Article-Element
-Sobald du ein wenig Übung hast, suche die Schaltfläche „Nächste Lektion“ und wähle sie aus. Anschließend kannst du durch Doppeltippen fortfahren.
+Sobald du ein wenig Übung hast, suche den Button „Nächste Lektion“ und wähle ihn aus. Anschließend kannst du durch Doppeltippen fortfahren.
lstbx
Chiffongelb
Blasse Goldrutenfarbe
@@ -943,7 +943,7 @@
Verbinden...
Lavendel
Zusammenfassung
-Pop-up-Schaltfläche
+Pop-up-Button
Zeichenecho
Mitternachtsblau
()
@@ -1013,7 +1013,7 @@
Pausiert alle momentan aktiven Medien-Widgets
Nächste Tabelle
(), Grad
-Drücke „Suchtaste plus Rechtspfeil“, um den Übungsbereich oder die Schaltfläche „Nächste Lektion“ zu markieren. Drücke dann „Suchtaste plus Leertaste“, um die Schaltfläche auszuwählen.
+Drücke „Suchtaste plus Rechtspfeil“, um den Übungsbereich oder den Button „Nächste Lektion“ zu markieren. Drücke dann „Suchtaste plus Leertaste“, um den Button auszuwählen.
Dunkelgrau
Überschrift 2
.input {$$COUNT :number} .match $$COUNT 1{{Dollarzeichen}} *{{{$$COUNT} Dollarzeichen}}
@@ -1150,7 +1150,7 @@
ChromeVox-Steuerfeld
Steuerung für Datum
Tomatencreme
-Perfekt! Jetzt kennst du die Grundlagen von ChromeVox. Du kannst diese Anleitung noch einmal starten oder sie beenden, indem du auf die entsprechende Schaltfläche unten klickst.
+Perfekt! Jetzt kennst du die Grundlagen von ChromeVox. Du kannst diese Anleitung noch einmal starten oder sie beenden, indem du auf den entsprechenden Button unten klickst.
Keine nächste Überschrift der Ebene 6
Tomatenrot
Koordinaten der aktuellen Zelle ansagen
diff -Nru chromium-145.0.7632.116/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zh-CN.xtb chromium-145.0.7632.159/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zh-CN.xtb
--- chromium-145.0.7632.116/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zh-CN.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/browser/resources/chromeos/accessibility/strings/accessibility_strings_zh-CN.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -381,7 +381,7 @@
.input {$$COUNT :number} .match $$COUNT 1{{with {$$COUNT} item}} * {{with {$$COUNT} items}}
纵向
滑块
-撤消
+撤销
转到表格末尾
下一个访问过的链接
ChromeVox 辅助键
diff -Nru chromium-145.0.7632.116/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb chromium-145.0.7632.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
--- chromium-145.0.7632.116/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -1608,7 +1608,7 @@
El dispositiu no ha pogut obrir Chrome. Per resoldre el problema, baixa l'actualització més recent de Chrome de la botiga d'aplicacions.
Explora contingut i segueix-lo
Obre ràpidament al navegador. Mantén premuda aquesta drecera per editar-la.
-Ansa per arrossegar
+Ansa de posicionament
Crea una adreça electrònica a
Full inferior de l'activitat recent obert a alçada completa
Utilitza dades mòbils
diff -Nru chromium-145.0.7632.116/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb chromium-145.0.7632.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
--- chromium-145.0.7632.116/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -1218,7 +1218,7 @@
Nogle websites kan f.eks. reagere på denne anmodning ved at vise dig annoncer, som ikke er baseret på andre websites, du har besøgt. Mange websites vil fortsat indsamle og bruge browserdata til f.eks. at forbedre sikkerheden, til at levere indhold, annoncer og anbefalinger og til at generere rapporteringsstatistik.
Læsetilstand
-Google Adgangskodeadministrator
+Google Adgangskodeadministrator
Søg i indstillinger
, fastgjort inkognitofane med multivalg
Se din Chrome-historik her
diff -Nru chromium-145.0.7632.116/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb chromium-145.0.7632.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
--- chromium-145.0.7632.116/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -6,7 +6,7 @@
Hierhin verschieben
Einstellungen für den Lesemodus sind vollständig geöffnet
Für gibt es auf diesem Gerät keine Passkeys
-Schnelle Sprachsuche verwenden. Zum Ändern Schaltfläche gedrückt halten.
+Schnelle Sprachsuche verwenden. Zum Ändern Button gedrückt halten.
Wird an gesendet…
Auch Daten dieser Websites & Apps löschen?
Fenster ist geöffnet
@@ -284,7 +284,7 @@
Wähle einen Zeitraum aus und tippe dann auf „Daten löschen“
Datenschutz-Leitfaden
Gruppe in ein anderes Fenster verschieben
-Über die Schaltfläche "Optionen für Discover" kannst du festlegen, welche Meldungen dir angezeigt werden
+Über den Button „Optionen für Discover“ kannst du festlegen, welche Meldungen dir angezeigt werden
Karte abgelaufen
Du kannst die Informationen anpassen, die von Websites verwendet werden, um dir Werbung zu präsentieren
Neues Inkognitofenster
@@ -1033,7 +1033,7 @@
Website funktioniert nicht? Drittanbieter-Cookies werden blockiert.
In diese Sprache übersetzen
Zurück zur Website
-Auf die Schaltfläche "Tabs öffnen" tippen, um Tabs zu öffnen und mehrere Seiten gleichzeitig zu besuchen
+Auf den Button „Tabs öffnen“ tippen, um Tabs zu öffnen und mehrere Seiten gleichzeitig zu besuchen
Seite herunterladen
Hier erscheinen Websites, denen du folgst
Du kannst dich mit einem Textcursor auf den Seiten bewegen. Wenn du die Tastaturnavigation deaktivieren möchtest, drücke F7.
@@ -1353,7 +1353,7 @@
Mono
Kontodaten prüfen
Wenn du auf allen deinen Geräten auf deine Passwörter und andere Daten zugreifen möchtest, melde dich als an.
-Öffnet schnell einen neuen Tab. Zum Ändern Schaltfläche gedrückt halten.
+Öffnet schnell einen neuen Tab. Zum Ändern Button gedrückt halten.
Wenn du ein neues Fenster wiederherstellen möchtest, reduziere die Gesamtzahl der aktiven und inaktiven Fenster auf maximal . Inaktive Fenster werden nach 6 Monaten gelöscht.
Neue Suche starten
Feedback geben
@@ -1374,7 +1374,7 @@
Seitenansicht bereit
{FILE_COUNT,plural, =1{Bilder, 1 Bild in der Liste}other{Bilder, # Bilder in der Liste}}
In Chrome anmelden, geöffnet.
-Diese Seite schnell teilen. Zum Ändern Schaltfläche gedrückt halten.
+Diese Seite schnell teilen. Zum Ändern Button gedrückt halten.
CVC
Update des Google Passwortmanagers geschlossen
Ansicht mit den letzten Aktivitäten am unteren Rand geschlossen
diff -Nru chromium-145.0.7632.116/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb chromium-145.0.7632.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
--- chromium-145.0.7632.116/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -1541,7 +1541,7 @@
သင်၏စီမံခန့်ခွဲသူက ပိတ်ထားသည်
Chrome ထဲမှ ထွက်သွားရန်
တဘ်ကို အုပ်စုသို့ ရွှေ့ရန်
-စာညှပ် မန်နေဂျာ ဖွင့်ရန်
+ဝဘ်လိပ်စာ စီမံစနစ် ဖွင့်ရန်
ဘေးဘက်မြင်ကွင်းသို့ ချုံ့ရန်
နေရာအလုံအလောက် မရှိပါ
သင့်အဖွဲ့အစည်းက စကားဝှက်သိမ်းခြင်းကို ပိတ်ထားသည်
diff -Nru chromium-145.0.7632.116/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb chromium-145.0.7632.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
--- chromium-145.0.7632.116/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -679,7 +679,7 @@
, festet fane
Legg til et nettsted igjen hvis du vil ha det i gruppen med nettsteder som kan gjette hva du liker
Vil du laste ned igjen?
-Kopiér link
+Kopier link
Slå på mørkt tema når mørkt tema er påslått på enheten
Hjem uten nett
Tilpass og kontroller Google Chrome med et element som er uthevet
diff -Nru chromium-145.0.7632.116/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb chromium-145.0.7632.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
--- chromium-145.0.7632.116/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -1759,7 +1759,7 @@
Raporto si përmbajtje të bezdisshme
Fillo kërkimin
Siguruar nga
-Kapërce
+Anashkalo
Zbato temën e errët për sajtet
Shko te cilësimet e sigurisë
{NUM_WINDOWS,plural, =1{Mbyll 1 dritare të fshehtë}other{Mbyll # dritare të fshehta}}
diff -Nru chromium-145.0.7632.116/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb chromium-145.0.7632.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
--- chromium-145.0.7632.116/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -1343,7 +1343,7 @@
Režim čitanja nije dostupan
Izbori su sačuvani
Provereno juče
-Prethodno
+Nazad
Tajmer aplikacije je istekao. Počeće ponovo sutra.
Da biste vratili novi prozor, smanjite ukupan broj aktivnih prozora na ili manje. Neaktivni prozori se brišu posle 6 meseci.
Na Google nalogu
diff -Nru chromium-145.0.7632.116/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb chromium-145.0.7632.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
--- chromium-145.0.7632.116/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -1343,7 +1343,7 @@
Режим читања није доступан
Избори су сачувани
Проверено јуче
-Претходно
+Назад
Тајмер апликације је истекао. Почеће поново сутра.
Да бисте вратили нови прозор, смањите укупан број активних прозора на или мање. Неактивни прозори се бришу после 6 месеци.
На Google налогу
diff -Nru chromium-145.0.7632.116/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb chromium-145.0.7632.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
--- chromium-145.0.7632.116/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -385,7 +385,7 @@
Upakiaji mapema wa kawaida
Programu za wavuti
Angalia tovuti
-Ya Juu
+Juu
Mtu yeyote anayetumia kifaa hiki anaweza kuona faili zilizopakuliwa
Ondoka
Kimeacha kufanya kazi kwenye kifaa hiki
diff -Nru chromium-145.0.7632.116/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb chromium-145.0.7632.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
--- chromium-145.0.7632.116/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -247,7 +247,7 @@
您的组织已开启“增强型安全浏览”功能
{FILE_COUNT,plural, =1{1 项下载失败}other{# 项下载失败}}
文本
-撤消
+撤销
第 条结果,共 条
当前显示的是精简视图
过去 15 分钟
@@ -736,7 +736,7 @@
工具栏中的快捷方式
密码和自动填充
打开“设置”
-退出 Chrome?
+要在 Chrome 中退出账号吗?
按新近度排序
根据系统向 Google 发送的浏览数据,实时提供 AI 赋能的保护,防范危险的网站、下载内容和扩展程序
开源许可
@@ -1538,7 +1538,7 @@
一律使用安全连接
要退出标签页分组吗?
已被您的管理员关闭
-退出 Chrome
+在 Chrome 中退出账号
将标签页移至分组
打开书签管理器
合拢为侧边视图
diff -Nru chromium-145.0.7632.116/chrome/browser/ui/ash/network/mobile_data_notifications.cc chromium-145.0.7632.159/chrome/browser/ui/ash/network/mobile_data_notifications.cc
--- chromium-145.0.7632.116/chrome/browser/ui/ash/network/mobile_data_notifications.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/browser/ui/ash/network/mobile_data_notifications.cc 2026-03-02 23:00:09.000000000 +0000
@@ -103,7 +103,7 @@
}
void MobileDataNotifications::ShowOptionalMobileDataNotification() {
- if (SessionManager::Get()->IsUserSessionBlocked()) {
+ if (SessionManager::Get()->IsUserSessionBlocked() || !NetworkHandler::IsInitialized()) {
return;
}
diff -Nru chromium-145.0.7632.116/chrome/browser/ui/views/infobars/infobar_container_view.cc chromium-145.0.7632.159/chrome/browser/ui/views/infobars/infobar_container_view.cc
--- chromium-145.0.7632.116/chrome/browser/ui/views/infobars/infobar_container_view.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/browser/ui/views/infobars/infobar_container_view.cc 2026-03-02 23:00:09.000000000 +0000
@@ -160,5 +160,66 @@
RemoveChildView(static_cast(infobar));
}
+void InfoBarContainerView::PlatformSpecificWillRemoveInfoBar(
+ infobars::InfoBar* infobar) {
+ // If there are no pending infobars to surface, there's no need to track
+ // focus for restoration, as no new infobar will immediately appear.
+ if (!HasPendingInfoBars()) {
+ restore_focus_on_next_shown_ = false;
+ return;
+ }
+
+ auto* focus_manager = GetFocusManager();
+ if (!focus_manager) {
+ restore_focus_on_next_shown_ = false;
+ return;
+ }
+
+ // Determine the currently focused view. In environments where the window
+ // might not be fully active (e.g., Wayland during tests or under certain
+ // window manager states), `GetFocusedView()` returns null. In these cases,
+ // we must fall back to `GetStoredFocusView()` which tracks the view that
+ // *will* receive focus when the widget becomes active.
+ views::View* focused_view = focus_manager->GetFocusedView();
+ if (!focused_view) {
+ focused_view = focus_manager->GetStoredFocusView();
+ }
+
+ // Only restore focus to the next infobar if the focus currently resides
+ // within the infobar being removed. This prevents stealing focus from
+ // unrelated UI elements when a background infobar is dismissed.
+ restore_focus_on_next_shown_ =
+ static_cast(infobar)->Contains(focused_view);
+}
+
+void InfoBarContainerView::PlatformSpecificInfoBarShown(
+ infobars::InfoBar* infobar) {
+ auto* info_bar_view = static_cast(infobar);
+ CHECK(info_bar_view);
+
+ if (!restore_focus_on_next_shown_) {
+ return;
+ }
+
+ // Reset the flag to ensure focus is only restored once per removal event.
+ restore_focus_on_next_shown_ = false;
+
+ // Prefer focusing the dismiss button if available, as it's the most common
+ // interactive element. If the infobar lacks a dismiss button, fall back to
+ // focusing the entire infobar view to maintain accessibility context.
+ views::View* view_to_focus =
+ info_bar_view->GetViewByElementId(InfoBarView::kDismissButtonElementId);
+ if (!view_to_focus) {
+ view_to_focus = info_bar_view;
+ }
+
+ views::Widget* widget = GetWidget();
+ if (widget && !widget->IsActive() && GetFocusManager()) {
+ GetFocusManager()->SetStoredFocusView(view_to_focus);
+ } else {
+ view_to_focus->RequestFocus();
+ }
+}
+
BEGIN_METADATA(InfoBarContainerView)
END_METADATA
diff -Nru chromium-145.0.7632.116/chrome/browser/ui/views/infobars/infobar_container_view.h chromium-145.0.7632.159/chrome/browser/ui/views/infobars/infobar_container_view.h
--- chromium-145.0.7632.116/chrome/browser/ui/views/infobars/infobar_container_view.h 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/browser/ui/views/infobars/infobar_container_view.h 2026-03-02 23:00:09.000000000 +0000
@@ -36,12 +36,21 @@
void PlatformSpecificAddInfoBar(infobars::InfoBar* infobar,
size_t position) override;
void PlatformSpecificRemoveInfoBar(infobars::InfoBar* infobar) override;
+ void PlatformSpecificWillRemoveInfoBar(infobars::InfoBar* infobar) override;
+ void PlatformSpecificInfoBarShown(infobars::InfoBar* infobar) override;
private:
// This view draws the shadow over the web contents below the
// lowest infobar. A separate view with a layer is used so it can
// draw outside the bounds of |this|.
raw_ptr content_shadow_;
+
+ // True when the focused view was inside this container at the moment an
+ // infobar removal started. Used to restore focus back to the infobar region
+ // when the next infobar is shown (e.g. a queued infobar being promoted), so
+ // focus does not jump to page contents and screen reader users are made aware
+ // of the newly surfaced infobar.
+ bool restore_focus_on_next_shown_ = false;
};
#endif // CHROME_BROWSER_UI_VIEWS_INFOBARS_INFOBAR_CONTAINER_VIEW_H_
diff -Nru chromium-145.0.7632.116/chrome/browser/ui/views/infobars/infobar_container_view_browsertest.cc chromium-145.0.7632.159/chrome/browser/ui/views/infobars/infobar_container_view_browsertest.cc
--- chromium-145.0.7632.116/chrome/browser/ui/views/infobars/infobar_container_view_browsertest.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chrome/browser/ui/views/infobars/infobar_container_view_browsertest.cc 2026-03-02 23:00:09.000000000 +0000
@@ -28,7 +28,9 @@
#include "components/infobars/core/infobar_manager.h"
#include "content/public/test/browser_test.h"
#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/animation/animation_test_api.h"
#include "ui/views/view_utils.h"
+#include "url/gurl.h"
namespace {
@@ -61,7 +63,7 @@
} // namespace
class InfoBarContainerViewBrowserTest : public InProcessBrowserTest {
- public:
+ protected:
InfoBarContainerViewBrowserTest() = default;
InfoBarContainerView* GetInfoBarContainer() {
@@ -108,7 +110,7 @@
// Tests for standard (non-prioritized) behavior.
//
class InfoBarContainerStandardTest : public InfoBarContainerViewBrowserTest {
- public:
+ protected:
InfoBarContainerStandardTest() {
feature_list_.InitAndDisableFeature(
infobars::features::kInfobarPrioritization);
@@ -179,7 +181,7 @@
// Tests for priority-based behavior.
//
class InfoBarContainerPriorityTest : public InfoBarContainerViewBrowserTest {
- public:
+ protected:
InfoBarContainerPriorityTest() {
// These caps match the design doc's defaults.
feature_list_.InitAndEnableFeatureWithParameters(
@@ -188,6 +190,13 @@
{"max_visible_default", "1"},
{"max_visible_low", "1"}});
}
+
+ // Helper to get the currently focused or stored view. On Wayland, the focused
+ // view may be null. In that case, we return the stored view.
+ views::View* GetFocusedOrStoredView(views::FocusManager* focus_manager) {
+ views::View* focused_view = focus_manager->GetFocusedView();
+ return focused_view ? focused_view : focus_manager->GetStoredFocusView();
+ }
};
IN_PROC_BROWSER_TEST_F(InfoBarContainerPriorityTest, CriticalStacksUpToCap) {
@@ -309,13 +318,84 @@
EXPECT_EQ("Critical", GetVisibleInfoBarMessages()[0]);
}
+IN_PROC_BROWSER_TEST_F(InfoBarContainerPriorityTest,
+ PromotionRestoresFocusWhenFocusWasInInfobars) {
+ // Disable animations to avoid flaky tests related to focus management.
+ auto animation_mode_reset = gfx::AnimationTestApi::SetRichAnimationRenderMode(
+ gfx::Animation::RichAnimationRenderMode::FORCE_DISABLED);
+
+ infobars::InfoBar* first = AddInfoBar(
+ infobars::InfoBarDelegate::InfobarPriority::kDefault, "Default 1");
+ AddInfoBar(infobars::InfoBarDelegate::InfobarPriority::kDefault,
+ "Default 2 (Queued)");
+
+ views::FocusManager* focus_manager = GetInfoBarContainer()->GetFocusManager();
+ ASSERT_TRUE(focus_manager);
+
+ InfoBarContainerView* container = GetInfoBarContainer();
+
+ auto* close_button = static_cast(first)->GetViewByElementId(
+ InfoBarView::kDismissButtonElementId);
+ ASSERT_TRUE(close_button);
+
+ close_button->RequestFocus();
+
+ focus_manager = close_button->GetFocusManager();
+ ASSERT_TRUE(focus_manager);
+
+ EXPECT_EQ(close_button, GetFocusedOrStoredView(focus_manager));
+ ASSERT_TRUE(container->Contains(GetFocusedOrStoredView(focus_manager)));
+
+ GetInfoBarManager()->RemoveInfoBar(first);
+
+ std::vector visible = GetVisibleInfoBarMessages();
+ ASSERT_EQ(1u, visible.size());
+ EXPECT_EQ("Default 2 (Queued)", visible[0]);
+
+ EXPECT_TRUE(container->Contains(GetFocusedOrStoredView(focus_manager)));
+}
+
+IN_PROC_BROWSER_TEST_F(InfoBarContainerPriorityTest,
+ PromotionDoesNotStealFocusWhenFocusWasOutsideInfobars) {
+ infobars::InfoBar* first = AddInfoBar(
+ infobars::InfoBarDelegate::InfobarPriority::kDefault, "Default 1");
+ AddInfoBar(infobars::InfoBarDelegate::InfobarPriority::kDefault,
+ "Default 2 (Queued)");
+
+ InfoBarContainerView* container = GetInfoBarContainer();
+ ASSERT_TRUE(container);
+
+ // Put focus in web contents (outside infobars).
+ content::WebContents* contents =
+ browser()->tab_strip_model()->GetActiveWebContents();
+ ASSERT_TRUE(contents);
+ contents->Focus();
+
+ BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser());
+ ASSERT_TRUE(browser_view);
+ views::FocusManager* focus_manager =
+ browser_view->GetWidget()->GetFocusManager();
+ ASSERT_TRUE(focus_manager);
+
+ EXPECT_FALSE(container->Contains(GetFocusedOrStoredView(focus_manager)));
+
+ // Remove visible infobar -> queued one promoted.
+ GetInfoBarManager()->RemoveInfoBar(first);
+
+ std::vector visible = GetVisibleInfoBarMessages();
+ ASSERT_EQ(1u, visible.size());
+ EXPECT_EQ("Default 2 (Queued)", visible[0]);
+
+ EXPECT_FALSE(container->Contains(GetFocusedOrStoredView(focus_manager)));
+}
+
//
// Tests for split tab behavior, parameterized by whether prioritization is
// enabled.
//
class InfoBarContainerSplitTabTest : public InfoBarContainerViewBrowserTest,
public testing::WithParamInterface {
- public:
+ protected:
InfoBarContainerSplitTabTest() {
std::vector enabled_features;
std::vector disabled_features;
diff -Nru chromium-145.0.7632.116/chromeos/CHROMEOS_LKGM chromium-145.0.7632.159/chromeos/CHROMEOS_LKGM
--- chromium-145.0.7632.116/chromeos/CHROMEOS_LKGM 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chromeos/CHROMEOS_LKGM 2026-03-02 23:00:09.000000000 +0000
@@ -1 +1 @@
-16552.42.0
\ No newline at end of file
+16552.50.0
\ No newline at end of file
diff -Nru chromium-145.0.7632.116/chromeos/profiles/arm.afdo.newest.txt chromium-145.0.7632.159/chromeos/profiles/arm.afdo.newest.txt
--- chromium-145.0.7632.116/chromeos/profiles/arm.afdo.newest.txt 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chromeos/profiles/arm.afdo.newest.txt 2026-03-02 23:00:09.000000000 +0000
@@ -1 +1 @@
-chromeos-chrome-arm-none-145-7632.38-1771211790-benchmark-145.0.7632.114-r1-redacted.afdo.xz
+chromeos-chrome-arm-none-145-7632.66-1771816073-benchmark-145.0.7632.157-r1-redacted.afdo.xz
diff -Nru chromium-145.0.7632.116/chromeos/profiles/atom.afdo.newest.txt chromium-145.0.7632.159/chromeos/profiles/atom.afdo.newest.txt
--- chromium-145.0.7632.116/chromeos/profiles/atom.afdo.newest.txt 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chromeos/profiles/atom.afdo.newest.txt 2026-03-02 23:00:09.000000000 +0000
@@ -1 +1 @@
-chromeos-chrome-amd64-atom-145-7632.66-1771210491-benchmark-145.0.7632.107-r1-redacted.afdo.xz
+chromeos-chrome-amd64-atom-145-7632.66-1771825912-benchmark-145.0.7632.157-r1-redacted.afdo.xz
diff -Nru chromium-145.0.7632.116/chromeos/profiles/bigcore.afdo.newest.txt chromium-145.0.7632.159/chromeos/profiles/bigcore.afdo.newest.txt
--- chromium-145.0.7632.116/chromeos/profiles/bigcore.afdo.newest.txt 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chromeos/profiles/bigcore.afdo.newest.txt 2026-03-02 23:00:09.000000000 +0000
@@ -1 +1 @@
-chromeos-chrome-amd64-bigcore-145-7632.66-1771209749-benchmark-145.0.7632.107-r1-redacted.afdo.xz
+chromeos-chrome-amd64-bigcore-145-7632.66-1771819175-benchmark-145.0.7632.157-r1-redacted.afdo.xz
diff -Nru chromium-145.0.7632.116/chromeos/strings/chromeos_strings_de.xtb chromium-145.0.7632.159/chromeos/strings/chromeos_strings_de.xtb
--- chromium-145.0.7632.116/chromeos/strings/chromeos_strings_de.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chromeos/strings/chromeos_strings_de.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -1036,7 +1036,7 @@
GTC
Dieses Update wird vom Hersteller des externen Geräts bereitgestellt und wurde nicht von Google überprüft.
Dunkles Design bei Sonnenuntergang automatisch aktivieren
-Schaltfläche
+Button
in den Farbtönen
Scannen
UMTS
diff -Nru chromium-145.0.7632.116/chromeos/strings/chromeos_strings_el.xtb chromium-145.0.7632.159/chromeos/strings/chromeos_strings_el.xtb
--- chromium-145.0.7632.116/chromeos/strings/chromeos_strings_el.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chromeos/strings/chromeos_strings_el.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -1414,7 +1414,7 @@
Κάντε κλικ σε οποιοδήποτε πλήκτρο για να προσαρμόσετε το κουμπί. Επανατοποθετήστε το πλήκτρο χρησιμοποιώντας το ποντίκι ή τα πλήκτρα βέλους.
την Τετάρτη
Επιλέξτε το μικρόφωνό σας
-Όροι Παροχής Υπηρεσιών
+Όροι παροχής υπηρεσιών
κυανό
Διαχείριση ρυθμίσεων APN δικτύου. Τα APN δημιουργούν μια σύνδεση μεταξύ ενός δικτύου κινητής τηλεφωνίας και του διαδικτύου. Μάθετε περισσότερα
Ενημερώσεις υλικολογισμικού για εξωτερικές συσκευές
diff -Nru chromium-145.0.7632.116/chromeos/strings/chromeos_strings_fa.xtb chromium-145.0.7632.159/chromeos/strings/chromeos_strings_fa.xtb
--- chromium-145.0.7632.116/chromeos/strings/chromeos_strings_fa.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chromeos/strings/chromeos_strings_fa.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -376,7 +376,7 @@
بهترین عکسهایتان که بهطور خودکار انتخاب شدهاند
·
عقیق
-بازگشت
+برگشتن
بازآوری کاغذدیواری کنونی
بلندگو
نمایش پنجرهها
@@ -1397,7 +1397,7 @@
نوشتار سادهشده
تعداد کلمات برای خلاصه کردن کافی نیست
در حال اتصال
-سعی مجدد
+امتحان مجدد
بتخانه
با انتخاب کلید جدید، مجدداً تخصیص دهید
اتصال LAN
diff -Nru chromium-145.0.7632.116/chromeos/strings/chromeos_strings_pt-BR.xtb chromium-145.0.7632.159/chromeos/strings/chromeos_strings_pt-BR.xtb
--- chromium-145.0.7632.116/chromeos/strings/chromeos_strings_pt-BR.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/chromeos/strings/chromeos_strings_pt-BR.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -1006,7 +1006,7 @@
A rede Wi-Fi não é segura
Modo claro automático
Tipo de IP
-Estilo e fundo de tela
+Plano de fundo e estilo
Arco-íris
O dispositivo está conectando.
Executar todas as rotinas
@@ -1236,7 +1236,7 @@
Acessar as configurações da conta
O botão "Adicionar APN" está ativado
{PAGE_NUMBER,plural, =0{Digitalizar a página novamente?}=1{Digitalizar a página {PAGE_NUMBER} novamente?}one{Digitalizar a página {PAGE_NUMBER} novamente?}other{Digitalizar a página {PAGE_NUMBER} novamente?}}
-Seus 3 comandos e saídas mais recentes. Você só poderá acessar esses itens enquanto estiver usando o Estilo e fundo de tela.
+Seus 3 comandos e resultados mais recentes. Você só poderá acessar esses itens enquanto estiver usando o Plano de fundo e estilo.
OTP
barcos
vermelho-escura
diff -Nru chromium-145.0.7632.116/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb chromium-145.0.7632.159/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb
--- chromium-145.0.7632.116/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/browser_ui/strings/android/translations/browser_ui_strings_fa.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -143,7 +143,7 @@
حذف نصب
تحت مدیریت
راهنمایی و بازخورد
-بازگشت
+برگشتن
وقتی روشن باشد، سایتها میتوانند درخواست دهند به دستگاههای موجود در شبکه محلی شما متصل شوند. وقتی خاموش باشد، سایتها نمیتوانند به دستگاههای موجود در شبکه محلی شما متصل شوند.
این بار اجازه هست • دقیق
رنگ زمینه تیره
@@ -725,11 +725,11 @@
مسدود کردن جاوااسکریپت برای سایتی خاص.
V8 موتور WebAssembly و جاوا اسکریپت Chrome است که از آن برای بهبود عملکرد سایت استفاده میشود
وقتی روشن است
-مرور کردن سریعتر میشود زیرا احتمال کمتری وجود دارد که سایتی از شما بخواهد تأیید کنید شما شخص واقعی هستید
+مرور کردن سریعتر میشود زیرا احتمال کمتری وجود دارد که سایتی از شما بخواهد درستیسنجی کنید شما شخصی حقیقی هستید
سایتها نمیتوانند به حسگرها دسترسی داشته باشند
USB
کوکیهای طرف سوم را بهطور موقت مجاز کنید. این کار بهمعنی محافظت کمتر هنگام مرور است اما ویژگیهای سایت به احتمال زیاد عملکرد موردنظر را خواهد داشت.
-همانطور که مرور میکنید، سایتها میتوانند ازطریق Chrome بررسی کنند و بااستفاده از سایت قبلی که بازدید کردهاید تأیید کنند که احتمالاً شما شخص واقعی هستید
+همانطور که مرور میکنید، سایتها میتوانند ازطریق Chrome بررسی کنند و بااستفاده از سایت قبلی که بازدید کردهاید درستیسنجی کنند که احتمالاً شما شخص واقعی هستید
آگهیهای مزاحم
بزرگنمایی
/
@@ -757,7 +757,7 @@
اجازه دهید Chrome برگههای اخیرتان را در فهرست برنامهها و نتایج جستجوی دستگاهتان نشان دهد. هرزمان بخواهید میتوانید این گزینه را در تنظیمات Chrome خاموش کنید.
این صفحه خطرناک است
به سایتها اجازه داده نشود محتوای محافظتشده را پخش کنند
-سایتهایی که بازدید میکنید میتوانند تأیید کنند که شما شخص واقعی هستید و روبات نیستید
+سایتهایی که بازدید میکنید میتوانند درستیسنجی کنند که شما شخص واقعی هستید و روبات نیستید
سازماندهی شوید
مکان این بار اجازه هست
داده ذخیره شد
diff -Nru chromium-145.0.7632.116/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb chromium-145.0.7632.159/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb
--- chromium-145.0.7632.116/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -172,7 +172,7 @@
Sammuta kamera
Sähköpostiosoitteet
Käynnistä Chrome niin, että omniboxi on tarkennettuna, jolloin käynnistysaika on lyhyempi edullisemmilla laitteilla.
-Sivustot voivat näyttää henkilöllisyyspalveluiden sisäänkirjautumiskehotteita.
+Sivustot voivat näyttää identiteettipalveluiden sisäänkirjautumiskehotteita.
Omniboxin pikakäynnistys
Sivustot voivat pyytää lupaa luoda 3D-kartan ympäristöstäsi tai seurata kameran asentoa
Kun tämä on päällä, äskettäin suljetut sivustot voivat viimeistellä datan lähettämistä tai vastaanottamista. Kun tämä ei ole päällä, äskettäin suljetut sivustot eivät voi viimeistellä datan lähettämistä tai vastaanottamista.
@@ -437,7 +437,7 @@
Kamera laitettiin pois päältä Androidin asetuksista
Kolmannen osapuolen evästeet sallittu
Tämä poistaa evästeet ja muun sivustodatan täällä:
-Sivustot voivat näyttää henkilöllisyyspalveluiden sisäänkirjautumiskehotteita
+Sivustot voivat näyttää identiteettipalveluiden sisäänkirjautumiskehotteita
Sivustot voivat tallentaa dataa laitteellesi
Historia löytyy kaikilta laitteilta, joten voit helposti jatkaa siitä, mihin jäit
Jatka tällä välilehdellä
@@ -457,7 +457,7 @@
Ota käyttöön
Keskeytä video
Tiivistä kaikki pyynnöt
-Estä henkilöllisyyspalveluiden sisäänkirjautumiskehotteet
+Estä identiteettipalveluiden sisäänkirjautumiskehotteet
Koko näyttö
Sivustotoivomus
Avattu viimeksi eilen
@@ -535,7 +535,7 @@
Profiilikuvat
Aktiiviset lataukset
Kysy, saavatko sivustot seurata käsiäsi (suositus)
-Estä henkilöllisyyspalveluiden sisäänkirjautumiskehotteet.
+Estä identiteettipalveluiden sisäänkirjautumiskehotteet.
Siirrä alas
Nollataanko luvat?
Sulje pyyhkäisemällä alas.
diff -Nru chromium-145.0.7632.116/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb chromium-145.0.7632.159/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb
--- chromium-145.0.7632.116/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/browser_ui/strings/android/translations/browser_ui_strings_no.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -290,7 +290,7 @@
Nedlasting fullført
Lokal nettverkstilgang
Nettsteder viser vanligvis annonser for å kunne tilby innhold eller tjenester kostnadsfritt. Men noen nettsteder er kjent for å vise forstyrrende eller villedende annonser.
-Kopiér link
+Kopier link
/ ?
kan bruke informasjonen din når du surfer
Om denne siden
diff -Nru chromium-145.0.7632.116/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb chromium-145.0.7632.159/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb
--- chromium-145.0.7632.116/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -457,7 +457,7 @@
Zapnúť
Pozastaviť video
Zbaliť všetky požiadavky
-Blokovať výzvy na prihlásenie zo služieb identity
+Blokovať výzvy na prihlásenie od služieb identity
Celá obrazovka
Predvoľba webu
Naposledy navštívený včera
diff -Nru chromium-145.0.7632.116/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb chromium-145.0.7632.159/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb
--- chromium-145.0.7632.116/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -94,7 +94,7 @@
增强现实
所有需要使用移动传感器的功能都将无法正常运行
点按即可返回到
-撤消
+撤销
更多设置
声音
主题颜色:浅色
diff -Nru chromium-145.0.7632.116/components/certificate_transparency/data/log_list.json chromium-145.0.7632.159/components/certificate_transparency/data/log_list.json
--- chromium-145.0.7632.116/components/certificate_transparency/data/log_list.json 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/certificate_transparency/data/log_list.json 2026-03-02 23:00:09.000000000 +0000
@@ -1,6 +1,6 @@
{
- "version": "84.8",
- "log_list_timestamp": "2026-02-20T12:57:40Z",
+ "version": "85.3",
+ "log_list_timestamp": "2026-03-02T12:53:38Z",
"operators": [
{
"name": "Google",
@@ -515,12 +515,8 @@
"url": "https://oak.ct.letsencrypt.org/2026h1/",
"mmd": 86400,
"state": {
- "readonly": {
- "timestamp": "2025-12-12T22:30:00Z",
- "final_tree_head": {
- "sha256_root_hash": "deSRNfTNPgd9wfzoXIznvi+QUTxuK0R+daC6JGKGK3Q=",
- "tree_size": 598614696
- }
+ "retired": {
+ "timestamp": "2026-02-28T00:00:00Z"
}
},
"temporal_interval": {
@@ -535,12 +531,8 @@
"url": "https://oak.ct.letsencrypt.org/2026h2/",
"mmd": 86400,
"state": {
- "readonly": {
- "timestamp": "2025-12-12T22:30:00Z",
- "final_tree_head": {
- "sha256_root_hash": "uTgg1k3DUbSFFdXewyyxbsQuCc9RupplMphTwtXqvf4=",
- "tree_size": 130815692
- }
+ "retired": {
+ "timestamp": "2026-02-28T00:00:00Z"
}
},
"temporal_interval": {
diff -Nru chromium-145.0.7632.116/components/infobars/core/infobar_container.cc chromium-145.0.7632.159/components/infobars/core/infobar_container.cc
--- chromium-145.0.7632.116/components/infobars/core/infobar_container.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/infobars/core/infobar_container.cc 2026-03-02 23:00:09.000000000 +0000
@@ -102,6 +102,7 @@
void InfoBarContainer::OnInfoBarRemoved(InfoBar* infobar, bool animate) {
CHECK(scoped_observation_.IsObserving());
+ PlatformSpecificWillRemoveInfoBar(infobar);
infobar->Hide(manager()->animations_enabled() && animate);
}
@@ -131,6 +132,7 @@
infobar->set_container(this);
CHECK(manager());
infobar->Show(manager()->animations_enabled() && animate);
+ PlatformSpecificInfoBarShown(infobar);
// Record the infobar being displayed.
DCHECK_NE(InfoBarDelegate::INVALID, infobar->GetIdentifier());
diff -Nru chromium-145.0.7632.116/components/infobars/core/infobar_container.h chromium-145.0.7632.159/components/infobars/core/infobar_container.h
--- chromium-145.0.7632.116/components/infobars/core/infobar_container.h 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/infobars/core/infobar_container.h 2026-03-02 23:00:09.000000000 +0000
@@ -94,6 +94,8 @@
InfoBar* new_infobar) {}
virtual void PlatformSpecificRemoveInfoBar(InfoBar* infobar) = 0;
virtual void PlatformSpecificInfoBarStateChanged(bool is_animating) {}
+ virtual void PlatformSpecificWillRemoveInfoBar(infobars::InfoBar* infobar) {}
+ virtual void PlatformSpecificInfoBarShown(infobars::InfoBar* infobar) {}
// Adds |infobar| to this container before the existing infobar at position
// |position| and calls Show() on it. |animate| is passed along to
diff -Nru chromium-145.0.7632.116/components/infobars/core/infobar_container_with_priority.h chromium-145.0.7632.159/components/infobars/core/infobar_container_with_priority.h
--- chromium-145.0.7632.116/components/infobars/core/infobar_container_with_priority.h 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/infobars/core/infobar_container_with_priority.h 2026-03-02 23:00:09.000000000 +0000
@@ -42,6 +42,8 @@
// InfoBarContainer overrides:
void ChangeInfoBarManager(InfoBarManager* infobar_manager) override;
+ bool HasPendingInfoBars() const { return !pending_infobars_.empty(); }
+
protected:
// InfoBarContainer overrides:
void OnInfoBarAdded(InfoBar* infobar) override;
diff -Nru chromium-145.0.7632.116/components/policy/resources/policy_templates_de.xtb chromium-145.0.7632.159/components/policy/resources/policy_templates_de.xtb
--- chromium-145.0.7632.116/components/policy/resources/policy_templates_de.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/policy/resources/policy_templates_de.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -463,7 +463,7 @@
Wenn diese Richtlinie aktiviert ist, werden verbesserte internationale Tastenkürzel aktiviert.
Ist die Richtlinie nicht konfiguriert, wird sie für verwaltete und nutzereigene Geräte aktiviert.
Beachte, dass es sich hierbei um eine vorübergehende Richtlinie handelt, die dafür sorgt, dass alte Tastenkürzel weiterhin von verwalteten Nutzern verwendet werden können. Diese Richtlinie wird verworfen, sobald benutzerdefinierte Tastenkürzel verfügbar sind.
-„Home“-Schaltfläche in der Symbolleiste anzeigen
+„Home“-Button in der Symbolleiste anzeigen
Abfragen an Quirks-Server für Hardwareprofile aktivieren
Wenn die Richtlinie aktiviert oder nicht konfiguriert ist, wird die LPAC-Sandbox für Druckdienste aktiviert, sofern dies von der Systemkonfiguration unterstützt wird.
@@ -1833,9 +1833,9 @@
Ist diese Richtlinie nicht konfiguriert, können Nutzer die im Launcher angepinnten Apps ändern.
Gruppen aus Einzelrichtlinien aktivieren
-Wenn die Richtlinie auf "True" gesetzt ist, wird während aktiver Sitzungen in der Taskleiste eine große rote Schaltfläche zum Abmelden angezeigt, solange das Display nicht gesperrt ist.
+Wenn die Richtlinie auf „True“ gesetzt ist, wird während aktiver Sitzungen in der Taskleiste ein großer roter Button zum Abmelden angezeigt, solange das Display nicht gesperrt ist.
- Ist sie auf "False" gesetzt oder nicht konfiguriert, wird keine Schaltfläche angezeigt.
+ Ist sie auf „False“ gesetzt oder nicht konfiguriert, wird kein Button angezeigt.
Das Abspielen von Videos in Android-Apps wird nicht berücksichtigt, auch wenn diese Richtlinie auf gesetzt ist.
Liste der aktivierten Plug-ins angeben
Keine weitergeleiteten Suchen mit erhöhter Sicherheit zulassen
@@ -2199,7 +2199,7 @@
Nutzer können nicht ändern, in welchem Ordner die Lesezeichen abgelegt werden. Aber sie haben die Möglichkeit, den Ordner in der Lesezeichenleiste auszublenden. Der Standardname des Ordners für verwaltete Lesezeichen lautet "Verwaltete Lesezeichen", kann jedoch angepasst werden. Dazu muss der Richtlinie ein neues untergeordnetes Wörterbuch mit einem einfachen Schlüssel namens "" hinzugefügt werden, wobei der gewünschte Ordnername der Wert ist. Verwaltete Lesezeichen werden nicht mit dem Nutzerkonto synchronisiert und können nicht von Erweiterungen geändert werden.
Zeitzone
-„Home“-Schaltfläche in der Symbolleiste ausblenden
+„Home“-Button in der Symbolleiste ausblenden
Ermöglicht die Bereitstellung von Clientzertifikaten für verwaltete Nutzer und Profile
Post-Quanten-Algorithmus für Schlüsselvereinbarungen mit WebRTC deaktivieren
Zulassen, dass veraltete -Plug-ins als normale -Plug-ins verwendet werden
@@ -7606,7 +7606,7 @@
Einstellungen zum Teilen von Tabgruppen
SHA-256-Hash der Desktopvorlage.
Websites nicht erlauben, um Schreibzugriff auf Dateien und Verzeichnisse zu bitten
-Wert der Schaltfläche zum Umschalten der App-Aktivitätserfassung. Wenn diese Option auf „true“ gesetzt ist, werden die App-Aktivitäten von Nutzern an den Server gesendet, damit sie in der -App des Kindes und des Elternteils angezeigt werden können. Ist sie auf „false“ gesetzt, funktionieren App-spezifische Zeitlimits zwar weiterhin, es werden jedoch keine Daten an den Server gesendet, sodass sie nicht in angezeigt werden können.
+Wert des Buttons zum Umschalten der App-Aktivitätserfassung. Wenn diese Option auf „true“ gesetzt ist, werden die App-Aktivitäten von Nutzern an den Server gesendet, damit sie in der -App des Kindes und des Elternteils angezeigt werden können. Ist sie auf „false“ gesetzt, funktionieren App-spezifische Zeitlimits zwar weiterhin, es werden jedoch keine Daten an den Server gesendet, sodass sie nicht in angezeigt werden können.
HTTPS-Upgrades deaktivieren.
Automatische Wiedergabe von Medien in Chrome zulassen
Mit dieser Richtlinie wird festgelegt, ob dem Nutzer beim ersten Anmeldungsvorgang der Einführungsbildschirm für KI-Funktionen während der Sitzung angezeigt wird.
@@ -7845,9 +7845,8 @@
Sie kann den Nutzer vor dem Zugriff auf eingeschränkte Inhalte schützen, die sich auf Web-Properties von Google befinden.
Wenn diese Richtlinie auf "true" gesetzt wird, wird der Nutzer abgemeldet, sobald sein Authentifizierungstoken ungültig wird und das Token nicht wiederhergestellt werden kann.
Wird sie auf "false" gesetzt oder nicht konfiguriert, kann der Nutzer in einem nicht authentifizierten Zustand fortfahren.
-Wenn diese Funktion aktiviert ist, erscheint auf dem Start- und Sperrbildschirm eine Schaltfläche zum Anzeigen des Passworts.
- Sie wird im Textfeld für das Passwort als Augensymbol dargestellt. Die Schaltfläche wird nicht angezeigt, wenn die Funktion deaktiviert ist.
-
+Wenn diese Funktion aktiviert ist, erscheint auf dem Start- und Sperrbildschirm ein Button zum Anzeigen des Passworts.
+ Sie wird im Textfeld für das Passwort als Augensymbol dargestellt. Der Button wird nicht angezeigt, wenn die Funktion deaktiviert ist.
Über diese Richtlinie wird festgelegt, ob die Hauptversion im User-Agent-String als „99“ festgeschrieben wird.
Anhand des User-Agent-Anfrageheaders können Websites die Anwendung, das Betriebssystem, den Anbieter und/oder die Version des anfragenden User-Agents identifizieren.
@@ -8462,7 +8461,7 @@
Cloud-Berichterstellung über verwaltete Profile aktivieren
Erweitertes Autofill zulassen, ohne KI‑Modelle zu verbessern.
Festlegen, wie oft der Nutzer das Passwort eingeben muss, um das schnelle Entsperren zu verwenden
-Schaltfläche zum Anzeigen des Passworts auf dem Start- oder Sperrbildschirm anzeigen
+Button zum Anzeigen des Passworts auf dem Start- oder Sperrbildschirm anzeigen
Mit dieser Richtlinie kann das alte Verhalten für den Cookie-Bereich wiederhergestellt werden.
Das bedeutet, dass auf Cookies, die über ein bestimmtes Protokoll (z. B. HTTPS) oder einen bestimmten Port festgelegt wurden, über ein anderes Protokoll oder einen anderen Port zugegriffen werden kann.
@@ -12127,7 +12126,7 @@
Wenn die Richtlinie auf „false“ gesetzt oder nicht konfiguriert ist, werden keine Informationen ausgegeben.
Wenn sie auf „true“ gesetzt wird, werden die Anmelde-/Abmeldeereignisse auf den Geräten gemeldet.
Konfigurationsrichtlinie für den Chrome Enterprise Connector „OnFileTransfer”
-Wenn diese Richtlinie nicht konfiguriert oder auf „Enabled“ gesetzt wird, können Nutzer mit ihre Kamera für die Suche verwenden. Ist die Richtlinie auf „Disabled“ gesetzt, wird Nutzern die Schaltfläche „“ im Suchfeld nicht angezeigt, wenn die kameragestützte Suche mit verfügbar ist.
+Wenn diese Richtlinie nicht konfiguriert oder auf „Enabled“ gesetzt wird, können Nutzer mit ihre Kamera für die Suche verwenden. Ist die Richtlinie auf „Disabled“ gesetzt, wird Nutzern der Button „“ im Suchfeld nicht angezeigt, wenn die kameragestützte Suche mit verfügbar ist.
Contentanbieter für betreute Nutzer aktivieren
Methode für die automatische Erkennung der Zeitzone konfigurieren
Tab Compare nicht zulassen.
diff -Nru chromium-145.0.7632.116/components/policy/resources/policy_templates_fr.xtb chromium-145.0.7632.159/components/policy/resources/policy_templates_fr.xtb
--- chromium-145.0.7632.116/components/policy/resources/policy_templates_fr.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/policy/resources/policy_templates_fr.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -546,11 +546,11 @@
Si cette règle est désactivée, l'appli n'utilisera pas les notifications temporaires.
Autoriser les utilisateurs non affiliés à utiliser Crostini
-Cette règle détermine si une page avec un en-tête peut être stockée dans le cache amélioré. Le paramètre de site Web défini pour cet en-tête ne prévoit peut-être pas que la page soit restaurée à partir du cache amélioré, car certaines informations sensibles peuvent rester affichées après la restauration, même si elles ne sont plus accessibles.
+Cette règle détermine si une page avec un en-tête peut être stockée dans le cache back/forward. Le paramètre de site Web défini pour cet en-tête ne prévoit peut-être pas que la page soit restaurée à partir du cache back/forward, car certaines informations sensibles peuvent rester affichées après la restauration, même si elles ne sont plus accessibles.
-Si cette règle est activée ou n'est pas configurée, la page avec un en-tête pourrait être restaurée à partir du cache amélioré, sauf si l'éviction du cache est déclenchée (par exemple, en cas de modification du cookie HttpOnly sur le site).
+Si cette règle est activée ou n'est pas configurée, la page avec un en-tête pourrait être restaurée à partir du cache back/forward, sauf si l'éviction du cache est déclenchée (par exemple, en cas de modification du cookie HttpOnly sur le site).
-Si cette règle est désactivée, la page avec un en-tête ne sera pas stockée dans le cache amélioré.
+Si cette règle est désactivée, la page avec un en-tête ne sera pas stockée dans le cache back/forward.
Empêche les utilisateurs de cet appareil de recourir au téléchargement indépendant adb, mais sans imposer la réinitialisation Powerwash. Cela peut remettre en question la sécurité de l'appareil.
Définir un délai en jours pour le stockage des métadonnées liées aux tâches d'impression
Oui
@@ -903,7 +903,7 @@
Désactiver les rapports sur l'état du stockage de l'appareil
Autoriser l'organiseur d'onglets et améliorer les modèles d'IA.
Autoriser à se connecter aux appareils sur toutes les adresses IP
-Autoriser l'utilisation du cache amélioré
+Autoriser l'utilisation du cache back/forward
Fiches non affichées sur la page Nouvel onglet
Les formats de cette liste seront mis en correspondance avec la source
de sécurité de l'URL à l'origine de la demande. En cas de correspondance,
@@ -1887,7 +1887,7 @@
Désactiver l'accès au menu contextuel du moteur de recherche par défaut
Paramètres des groupes suggérés
-Ne pas autoriser l'utilisation du cache amélioré
+Ne pas autoriser l'utilisation du cache back/forward
Si cette règle est activée ou qu'elle n'est pas configurée, les utilisateurs peuvent choisir d'associer les clients et les hôtes au moment de la connexion, ce qui évite d'avoir à saisir systématiquement un code.
Si cette règle est désactivée, cette fonctionnalité n'est pas disponible.
@@ -2984,7 +2984,7 @@
Cette règle ne peut être configurée que comme règle relative aux utilisateurs du cloud.
Ne pas autoriser la fonctionnalité
Désactiver l'enregistreur d'écran
-Interdire le stockage des pages avec un en-tête dans le cache amélioré.
+Interdire le stockage des pages avec un en-tête dans le cache back/forward.
Utiliser la consultation CNAME lors de l'authentification Kerberos
Permet aux utilisateurs affiliés de cet appareil d'utiliser le téléchargement indépendant adb
Laisser l'utilisateur décider si l'appareil doit se verrouiller quand il est arrêté provisoirement ou que son écran est rabattu
@@ -6446,9 +6446,9 @@
Si la règle n'est pas définie, l'utilisateur peut choisir l'image de l'avatar qui le représente dans l'écran de connexion.
Contrôles des paramètres de Privacy Sandbox
Le nouveau comportement de l'analyseur HTML, permettant d'utiliser plus de balises, sera activé.
-Lorsque cette règle est activée, la fonctionnalité permet d'utiliser le cache amélioré. Si l'utilisateur change de page, celle qui est quittée peut être conservée en l'état (arborescence de documents, script, etc.) dans le cache amélioré. Par exemple, si l'utilisateur retourne sur cette page, celle-ci peut ainsi être restaurée à partir de ce cache et affichée telle qu'elle était avant sa mise en cache.
+Lorsque cette règle est activée, la fonctionnalité permet d'utiliser le cache back/forward. Si l'utilisateur change de page, celle qui est quittée peut être conservée en l'état (arborescence de documents, script, etc.) dans le cache back/forward. Par exemple, si l'utilisateur retourne sur cette page, celle-ci peut ainsi être restaurée à partir de ce cache et affichée telle qu'elle était avant sa mise en cache.
- Toutefois, cette fonctionnalité peut entraîner des dysfonctionnements pour certains sites Web qui ne s'attendent pas à ce que leurs pages soient mises en cache, en particulier ceux qui reposent sur le déclenchement de l'événement "" en cas de changement de page. L'événement "" ne se déclenche pas si la page concernée est stockée dans le cache amélioré.
+ Toutefois, cette fonctionnalité peut entraîner des dysfonctionnements pour certains sites Web qui ne s'attendent pas à ce que leurs pages soient mises en cache, en particulier ceux qui reposent sur le déclenchement de l'événement "" en cas de changement de page. L'événement "" ne se déclenche pas si la page concernée est stockée dans le cache back/forward.
Si cette règle est activée ou qu'elle n'est pas configurée,
@@ -7422,7 +7422,7 @@
Si elle est désactivée, ils ne peuvent pas en bénéficier.
Google Sheets (compatible depuis la version 135)
-Autoriser les pages avec un en-tête à accéder au cache amélioré
+Autoriser les pages avec un en-tête à accéder au cache back/forward
Désactiver le transfert de fichiers dans les connexions d'assistance à distance avec les administrateurs de l'entreprise
La collecte de métriques avec clé d'URL n'est pas autorisée
Ne pas autoriser les contrôles de rapports précis
@@ -10654,7 +10654,7 @@
Si cette règle est activée ou si elle n'est pas configurée, les sites Web sont autorisés à vérifier si l'utilisateur possède des modes de paiement enregistrés.
Définir la taille du cache disque de support
-Autoriser le stockage des pages avec un en-tête dans le cache amélioré.
+Autoriser le stockage des pages avec un en-tête dans le cache back/forward.
Autoriser les utilisateurs à lancer des mises à jour du micrologiciel
Règle d'accès à la configuration des imprimantes d'appareils.
URL pour lesquelles la règle AutoOpenFileTypes peut s'appliquer
diff -Nru chromium-145.0.7632.116/components/policy/resources/policy_templates_nl.xtb chromium-145.0.7632.159/components/policy/resources/policy_templates_nl.xtb
--- chromium-145.0.7632.116/components/policy/resources/policy_templates_nl.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/policy/resources/policy_templates_nl.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -3857,11 +3857,11 @@
Als je het beleid niet toepast of niet instelt, rapporteren ingeschreven apparaten de statistieken niet.
Dit beleid is beëindigd in M70. Gebruik in plaats hiervan en .
-Hiermee wordt de functie Automatisch aanvullen van geactiveerd en wordt gebruikers toegestaan webformulieren automatisch in te vullen met eerder opgeslagen informatie zoals adres- of creditcardgegevens.
+Hiermee wordt de functie Automatisch invullen van geactiveerd en wordt gebruikers toegestaan webformulieren automatisch in te vullen met eerder opgeslagen informatie zoals adres- of creditcardgegevens.
-Als je deze instelling uitzet, kunnen gebruikers de functie Automatisch aanvullen niet gebruiken.
+Als je deze instelling uitzet, kunnen gebruikers de functie Automatisch invullen niet gebruiken.
-Als je de instelling activeert of geen waarde instelt, kunnen gebruikers de opties voor Automatisch aanvullen zelf beheren. Zo kunnen ze profielen voor Automatisch aanvullen instellen en de functie naar wens aan- of uitzetten.
+Als je de instelling activeert of geen waarde instelt, kunnen gebruikers de opties voor Automatisch invullen zelf beheren. Zo kunnen ze profielen voor Automatisch invullen instellen en de functie naar wens aan- of uitzetten.
Dag van de week voor het interval.
'Persoon toevoegen' aanzetten in gebruikersbeheer
Toestaan dat een nieuwe decoder gebruikt voor videodecodering met hardwareversnelling.
@@ -7334,8 +7334,8 @@
Als je dit beleid instelt op False of niet instelt, kunnen sites alleen WebAssembly-modules naar vensters en werkrollen in dezelfde oorsprong sturen.
Lijst met geblokkeerde domeinen voor zwevende SSO-service
Dit beleid bepaalt hoe er wordt omgegaan met onveilige formulieren (formulieren die gegevens sturen via HTTP) die zijn ingesloten in beveiligde sites (HTTPS) in de browser.
- Als je het beleid toepast of niet instelt, wordt er een waarschuwingsbericht op de volledige pagina weergegeven als er een onveilig formulier wordt gestuurd. Daarnaast wordt er een waarschuwingsballon naast de formuliervelden weergegeven als de focus erop wordt geplaatst en wordt automatisch aanvullen uitgezet voor deze formulieren.
- Als je het beleid niet toepast, worden er geen waarschuwingen weergegeven voor onveilige formulieren en werkt automatisch aanvullen normaal.
+ Als je het beleid toepast of niet instelt, wordt er een waarschuwingsbericht op de volledige pagina weergegeven als er een onveilig formulier wordt gestuurd. Daarnaast wordt er een waarschuwingsballon naast de formuliervelden weergegeven als de focus erop wordt geplaatst en wordt automatisch invullen uitgezet voor deze formulieren.
+ Als je het beleid niet toepast, worden er geen waarschuwingen weergegeven voor onveilige formulieren en werkt automatisch invullen normaal.
Dit beleid wordt verwijderd in Chrome 130.
Vingerafdruk
diff -Nru chromium-145.0.7632.116/components/policy/resources/policy_templates_pt-BR.xtb chromium-145.0.7632.159/components/policy/resources/policy_templates_pt-BR.xtb
--- chromium-145.0.7632.116/components/policy/resources/policy_templates_pt-BR.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/policy/resources/policy_templates_pt-BR.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -586,7 +586,7 @@
No ChromeOS, essa configuração faz com que o frame rate e a frequência da CPU sejam limitados, as luzes de fundo fiquem esmaecidas e o Android seja colocado no modo de economia de bateria. Em dispositivos com várias CPUs, algumas delas serão desativadas.
Os diferentes níveis são:
(0): o modo de economia de bateria será desativado.
- (1): o modo economia de bateria será ativado quando o dispositivo estiver usando a energia da bateria e o nível dela estiver baixo.
+ (1): o modo de economia de bateria será ativado quando o dispositivo estiver usando a energia da bateria e o nível dela estiver baixo.
(2): esse valor foi descontinuado na versão M121. Na versão M121 e mais recentes, os valores serão tratados como EnabledBelowThreshold.
Desativar verificação ortográfica
@@ -4375,7 +4375,7 @@
Se a política for definida como falsa, o preenchimento automático nunca fará sugestões ou preencherá informações de cartão de crédito nem salvará outros dados desse tipo que os usuários enviarem ao navegar na Web.
Sair
Bloquear pontos de extensão legados do navegador
-O modo Economia de bateria vai ser desativado.
+O modo de economia de bateria vai ser desativado.
Não aplicar o cancelamento de eco do áudio do sistema
Mostrar o aviso abaixo da caixa de pesquisa na página "Nova guia"
Não disponibilizar o Modo área de trabalho unificada para o usuário
@@ -10081,7 +10081,7 @@
Se você definir a política, os usuários não poderão mudá-la. Se ela não for definida, a previsão de rede será ativada, mas os usuários poderão mudar a configuração.
Permitir o backup de dados do
-Ativar o modo Economia de bateria
+Ativar o modo de economia de bateria
Permitir que a execute solicitações de API do WebAuthn transmitidas por proxy de um host remoto.
Ativar acesso a dados de periféricos Thunderbolt/USB4
Não tenho preferência.
@@ -11369,7 +11369,7 @@
Definir se a configuração do para temas de anúncios pode ser desativada
Lupa de tela inteira ativada
Ativar o Serviço de Localização do Google para Android
-O modo Economia de bateria vai ser ativado quando o dispositivo estiver usando a energia da bateria e o nível dela estiver baixo.
+O modo de economia de bateria vai ser ativado quando o dispositivo estiver usando a energia da bateria e o nível dela estiver baixo.
Ativar o recurso de acessibilidade de ditado.
Se esta política for definida como ativada, o ditado ficará sempre ativado.
diff -Nru chromium-145.0.7632.116/components/policy/resources/policy_templates_ru.xtb chromium-145.0.7632.159/components/policy/resources/policy_templates_ru.xtb
--- chromium-145.0.7632.116/components/policy/resources/policy_templates_ru.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/policy/resources/policy_templates_ru.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -3653,7 +3653,7 @@
Настройки для сайтов с навязчивой рекламой
Использовать no-referrer-when-downgrade в качестве правила по умолчанию в отношении URL перехода
Если правило включено, доступны инструменты устранения неполадок для режима киоска:
-– Инструменты разработчика в Chrome;
+– инструменты разработчика в Chrome;
– окно браузера Chrome;
– диспетчер задач.
Если правило отключено или не настроено, инструменты устранения неполадок для режима киоска недоступны.
diff -Nru chromium-145.0.7632.116/components/strings/components_strings_ca.xtb chromium-145.0.7632.159/components/strings/components_strings_ca.xtb
--- chromium-145.0.7632.116/components/strings/components_strings_ca.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/strings/components_strings_ca.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -364,7 +364,7 @@
Google Chrome està provant d'activar Windows Hello per emplenar contrasenyes.
x polzades
S'està verificant la forma de pagament
-Shopping Insights
+Estadístiques de compra
La teva organització ha bloquejat aquest lloc web
CVC
Hi ha hagut un error en mostrar aquesta pàgina web.
@@ -4297,7 +4297,7 @@
És possible que la xarxa Wi-Fi () que esteu fent servir requereixi que visiteu la seva pàgina d'inici de sessió.
Què és la llista de la compra?
La captura de pantalla s'ha iniciat
-Shopping Insights
+Estadístiques de compra
Formes de pagament disponibles per seleccionar i continuar el pagament. El teclat està amagat.
Som-hi
Historial agrupat
diff -Nru chromium-145.0.7632.116/components/strings/components_strings_de.xtb chromium-145.0.7632.159/components/strings/components_strings_de.xtb
--- chromium-145.0.7632.116/components/strings/components_strings_de.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/strings/components_strings_de.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -1393,7 +1393,7 @@
Ladesymbol beim Starten der App
Standortermittlung nicht zulässig
Der Server hat ein Zertifikat übermittelt, das nicht mit den integrierten Erwartungen übereinstimmt. Diese Erwartungen sind zu deinem Schutz in bestimmten Websites mit hohen Sicherheitsstandards enthalten.
-Klicke auf die Schaltfläche zum erneuten Laden, um die für das Laden der Seite erforderlichen Daten noch einmal zu senden.
+Klicke auf den Button zum erneuten Laden, um die für das Laden der Seite erforderlichen Daten noch einmal zu senden.
Miniaturansichten
Mikrofon
Versionsinformationen zu deinem Gerät und Browser
diff -Nru chromium-145.0.7632.116/components/strings/components_strings_es-419.xtb chromium-145.0.7632.159/components/strings/components_strings_es-419.xtb
--- chromium-145.0.7632.116/components/strings/components_strings_es-419.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/strings/components_strings_es-419.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -4525,7 +4525,7 @@
Para obtener información adicional y conocer las políticas que pueden aplicarse, abre chrome://management en tu navegador.
× mm
,
-VIN (número de identificación del vehículo)
+VIN (número de identificación vehicular)
Temperatura de la plataforma
Preparando archivo
Para habilitar estos parámetros de configuración y usar la información de pago de tu Cuenta de Google, visita la configuración de los servicios de autocompletado.
diff -Nru chromium-145.0.7632.116/components/strings/components_strings_es.xtb chromium-145.0.7632.159/components/strings/components_strings_es.xtb
--- chromium-145.0.7632.116/components/strings/components_strings_es.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/strings/components_strings_es.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -1756,7 +1756,7 @@
( x in)
Películas de culto e independientes
La cantidad y las causas de los bloqueos que han ocurrido recientemente
-Hace poco has cambiado una contraseña que se ha encontrado en una brecha de seguridad de datos públicos. Si tienes problemas, el Gestor de contraseñas de Google puede ayudarte a iniciar sesión.
+Hace poco has cambiado una contraseña que se ha encontrado en una brecha pública de seguridad de datos. Si tienes problemas, el Gestor de contraseñas de Google puede ayudarte a iniciar sesión.
Fuente solicitada
De
Lo visitas a menudo
@@ -5087,7 +5087,7 @@
Periféricos de audio conectados
Revistas
Configurando...
-Hace poco has cambiado una contraseña que se ha encontrado en una brecha de seguridad de datos públicos. Si tienes problemas, el Gestor de contraseñas puede ayudarte a iniciar sesión.
+Hace poco has cambiado una contraseña que se ha encontrado en una brecha pública de seguridad de datos. Si tienes problemas, el Gestor de contraseñas puede ayudarte a iniciar sesión.
{0,plural, =1{Es posible que incluya contenido sensible}other{Es posible que archivos incluyan contenido sensible}}
: para salir de pantalla completa, pulsa ||
Mensaje de Slack
diff -Nru chromium-145.0.7632.116/components/strings/components_strings_fa.xtb chromium-145.0.7632.159/components/strings/components_strings_fa.xtb
--- chromium-145.0.7632.116/components/strings/components_strings_fa.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/strings/components_strings_fa.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -954,7 +954,7 @@
میتوانید در انتخاب کنید از اثر انگشت شما برای تکمیل گذرواژهها استفاده شود یا نه
اسکن کارت جدید
برچسب (ساتن)
-بازگشت
+برگشتن
کاغذ (جوهرافشان)
اطلاعات کارت ذخیره شد
محافظت از حساب
@@ -3089,7 +3089,7 @@
نمیتوان با حساب مصرفکننده ثبتنام کرد (مجوز بستهبندی دردسترس است).
نوع
«زیرنویس زنده ناشنوایان» برای این رسانه دردسترس نیست. برای دریافت زیرنویس ناشنوایان، را برای این سایت مسدود کنید.
-راستیآزمایی
+درستیسنجی
بخش
محتوای جاسازیشده
۴۸ × ۳۶ اینچ
@@ -3745,7 +3745,7 @@
هم سرورهای پروکسی ثابت و هم آدرس اسکریپت pac. مشخص شدهاند.
۵ × ۳٫۵ اینچ
موتورهای جستجو
-درهرصورت همرسانی شود
+بههرحال همرسانی شود
Google Drive
صامت (پیشفرض)
پاکت (روکشدار)
@@ -3849,7 +3849,7 @@
دکمه «جستجوی زبانهها»، برای جستجوی زبانهها، فعال کنید
فایلهای دوربین، بارگیریها، و نماگرفتها
PRC 32K
-سعی مجدد
+امتحان مجدد
آخرین بازدید
{PAYMENT_METHOD,plural, =0{}=1{ و روش دیگر}one{ و روش دیگر}other{ و روش دیگر}}
diff -Nru chromium-145.0.7632.116/components/strings/components_strings_hi.xtb chromium-145.0.7632.159/components/strings/components_strings_hi.xtb
--- chromium-145.0.7632.116/components/strings/components_strings_hi.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/strings/components_strings_hi.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -4429,7 +4429,7 @@
"" सही तरीके से कॉन्फ़िगर नहीं किया गया है. आमतौर पर "" को अनइंस्टॉल करने से समस्या ठीक हो जाती है.
सहमति लेना ज़रूरी नहीं है
मेकअप और कॉस्मेटिक
-सेव करें और कीमत ट्रैक करें
+कीमत सेव करके उसे ट्रैक करें
इस नीति में ऐसे डेटा टाइप दिए गए हैं जो आपके मौजूदा प्लैटफ़ॉर्म पर काम नहीं करते: .
कुकी सेटिंग मैनेज करती है
आपने अभी-अभी जिस साइट पर अपना पासवर्ड डाला है वह सुरक्षित नहीं है. क्रोमियम इसमें आपकी मदद कर सकता है. अपना पासवर्ड बदलने और Google को यह बताने के लिए कि आपका खाता सुरक्षित नहीं है, 'खाता सुरक्षित करें' पर क्लिक करें.
diff -Nru chromium-145.0.7632.116/components/strings/components_strings_hu.xtb chromium-145.0.7632.159/components/strings/components_strings_hu.xtb
--- chromium-145.0.7632.116/components/strings/components_strings_hu.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/strings/components_strings_hu.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -4099,7 +4099,7 @@
Eltávolítja az otthoni címet a Chrome automatikus kitöltés funkciójából?
Jelentkezzen be a fotó mentéséhez
Kötelező
-Kérd a szülő segítségét
+Kérd a szülőd segítségét
A(z) elindul…
A kapcsolódási hibák elhárítása
Ez a weboldal korábban megadott adatokat kér ahhoz, hogy megfelelően jelenjen meg. Az adatokat újra elküldheti, de ezzel meg fog ismételni minden olyan műveletet, amelyet ez az oldal korábban végrehajtott.
diff -Nru chromium-145.0.7632.116/components/strings/components_strings_kn.xtb chromium-145.0.7632.159/components/strings/components_strings_kn.xtb
--- chromium-145.0.7632.116/components/strings/components_strings_kn.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/strings/components_strings_kn.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -1711,7 +1711,7 @@
ವೆಬ್ ಕ್ಯಾಲೆಂಡರ್
ಮೊಬೈಲ್ ಡೇಟಾ ಅಥವಾ ವೈ-ಫೈ ಆನ್ ಮಾಡಲಾಗುತ್ತಿದೆ
{0,plural, =1{ಫೈಲ್ ಅನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡದಂತೆ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ}one{ ಫೈಲ್ಗಳನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡದಂತೆ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ}other{ ಫೈಲ್ಗಳನ್ನು ಅಪ್ಲೋಡ್ ಮಾಡದಂತೆ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ}}
-ವೈ-ಫೈಗೆ ಸಂಪರ್ಕಿಸಿ
+ವೈ-ಫೈಗೆ ಕನೆಕ್ಟ್ ಮಾಡಿ
ಪ್ರಾಕ್ಸಿ, ಫೈರ್ವಾಲ್ ಮತ್ತು DNS ಕಾನ್ಫಿಗರೇಶನ್ ಪರಿಶೀಲಿಸಲಾಗುತ್ತಿದೆ
ಐಬಾನ್
ಅಪ್ಡೇಟ್ ಸಮಯದಲ್ಲಿ ನಿಮ್ಮ ಸಾಧನವನ್ನು 10 ನಿಮಿಷಗಳವರೆಗೆ ಬಳಸಲು ನಿಮಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ.
diff -Nru chromium-145.0.7632.116/components/strings/components_strings_pt-BR.xtb chromium-145.0.7632.159/components/strings/components_strings_pt-BR.xtb
--- chromium-145.0.7632.116/components/strings/components_strings_pt-BR.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/strings/components_strings_pt-BR.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -4524,7 +4524,7 @@
Para ver mais informações e políticas que podem ser aplicadas, abra chrome://management no navegador.
x mm
,
-Chassi (número de identificação do veículo)
+NIV (número de identificação do veículo)
Temperatura da plataforma
Preparando o arquivo
Para ativar essas configurações e usar as informações de pagamento da sua Conta do Google, acesse as configurações do preenchimento automático.
diff -Nru chromium-145.0.7632.116/components/strings/components_strings_ru.xtb chromium-145.0.7632.159/components/strings/components_strings_ru.xtb
--- chromium-145.0.7632.116/components/strings/components_strings_ru.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/strings/components_strings_ru.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -2593,7 +2593,7 @@
Блокировка клавиатуры разрешена
Цветы
Окно подтверждения
-Польский
+Доработать
Управление адресами…
Неверный код.
Приложение запрашивает разрешение на установку учетных данных Wi-Fi. Это позволит устройству автоматически подключаться к связанным сетям Wi-Fi. Чтобы стереть эти учетные данные, удалите приложение.
diff -Nru chromium-145.0.7632.116/components/strings/components_strings_sq.xtb chromium-145.0.7632.159/components/strings/components_strings_sq.xtb
--- chromium-145.0.7632.116/components/strings/components_strings_sq.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/strings/components_strings_sq.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -4561,7 +4561,7 @@
Fshi skedarët pas orësh
Tabakaja 11
Tani ofrohen veçori të tjera të privatësisë së reklamave
-Kapërce
+Anashkalo
Fshi lejen e drejtimit
Mirëmbajtje kopshti
Njihu me identifikuesin unik të pajisjes tënde
diff -Nru chromium-145.0.7632.116/components/strings/components_strings_sr-Latn.xtb chromium-145.0.7632.159/components/strings/components_strings_sr-Latn.xtb
--- chromium-145.0.7632.116/components/strings/components_strings_sr-Latn.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/strings/components_strings_sr-Latn.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -364,7 +364,7 @@
Google Chrome pokušava da uključi Windows Hello za popunjavanje lozinki.
x in
Verifikuje se način plaćanja
-Uvid u kupovinu
+Uvid za kupovinu
Vaša organizacija je blokirala ovaj sajt
CVC
Došlo je do greške pri prikazivanju ove veb-stranice.
@@ -3576,7 +3576,7 @@
Ovaj IBAN nije sačuvan na Google nalogu. Umesto toga, sačuvan je u Chrome-u na ovom uređaju.
Da biste dobili ovu adresu na svim uređajima, potvrdite svoj identitet
Vesti
-Prethodno
+Nazad
<Unesite termin za pretragu>
Token za registraciju:
Došlo je do greške sa proksi serverom ili je adresa netačna.
@@ -4296,7 +4296,7 @@
WiFi mreža koju koristite () će možda zahtevati da posetite stranicu za prijavljivanje.
Šta je to lista za kupovinu?
Snimanje ekrana je počelo
-Uvid u kupovinu
+Uvid za kupovinu
Načini plaćanja dostupni za izbor da bi se nastavilo sa plaćanjem. Tastatura je sakrivena.
Idemo
Grupisana istorija
diff -Nru chromium-145.0.7632.116/components/strings/components_strings_sr.xtb chromium-145.0.7632.159/components/strings/components_strings_sr.xtb
--- chromium-145.0.7632.116/components/strings/components_strings_sr.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/strings/components_strings_sr.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -364,7 +364,7 @@
Google Chrome покушава да укључи Windows Hello за попуњавање лозинки.
x in
Верификује се начин плаћања
-Увид у куповину
+Увид за куповину
Ваша организација је блокирала овај сајт
CVC
Дошло је до грешке при приказивању ове веб-странице.
@@ -3576,7 +3576,7 @@
Овај IBAN није сачуван на Google налогу. Уместо тога, сачуван је у Chrome-у на овом уређају.
Да бисте добили ову адресу на свим уређајима, потврдите свој идентитет
Вести
-Претходно
+Назад
<Унесите термин за претрагу>
Токен за регистрацију:
Дошло је до грешке са прокси сервером или је адреса нетачна.
@@ -4296,7 +4296,7 @@
WiFi мрежа коју користите () ће можда захтевати да посетите страницу за пријављивање.
Шта је то листа за куповину?
Снимање екрана је почело
-Увид у куповину
+Увид за куповину
Начини плаћања доступни за избор да би се наставило са плаћањем. Тастатура је сакривена.
Идемо
Груписана историја
diff -Nru chromium-145.0.7632.116/components/strings/components_strings_sw.xtb chromium-145.0.7632.159/components/strings/components_strings_sw.xtb
--- chromium-145.0.7632.116/components/strings/components_strings_sw.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/strings/components_strings_sw.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -1052,7 +1052,7 @@
Sheria ya Ajira na Kazi
Tukio
{COUNT,plural, =0{Hamna}=1{Nenosiri 1 (la )}=2{Manenosiri 2 (ya )}other{Manenosiri # (ya )}}
-Ya Juu
+Juu
Funga vichupo au programu nyingine
Tembelea tovuti
Kivinjari chako hakidhibitiwi.
@@ -1714,7 +1714,7 @@
kalenda ya wavuti
Kuwasha data ya simu au Wi-Fi
{0,plural, =1{Faili imezuiwa ili isipakiwe}other{Faili zimezuiwa ili zisipakiwe}}
-Unganisha kwenye Wi-Fi
+Unganisha Wi-Fi
Kuangalia seva mbadala, kingamtandao na mipangilio ya DNS
Iban
Wakati wa kusasisha hutaweza kutumia kifaa chako kwa hadi dakika 10.
diff -Nru chromium-145.0.7632.116/components/strings/components_strings_zh-CN.xtb chromium-145.0.7632.159/components/strings/components_strings_zh-CN.xtb
--- chromium-145.0.7632.116/components/strings/components_strings_zh-CN.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/strings/components_strings_zh-CN.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -660,7 +660,7 @@
取消屏蔽“”
上次访问时间:
音乐与舞蹈游戏
-撤消
+撤销
此政策最多只能包含 个条目。
已选择“门牌号”选项
已设置为使用系统代理设置,但同时指定了一个明确的代理配置。
diff -Nru chromium-145.0.7632.116/components/strings/components_strings_zh-TW.xtb chromium-145.0.7632.159/components/strings/components_strings_zh-TW.xtb
--- chromium-145.0.7632.116/components/strings/components_strings_zh-TW.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/components/strings/components_strings_zh-TW.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -3548,7 +3548,7 @@
切換至這個分頁
Chrome 瀏覽器正嘗試在 中填入密碼。
影片已儲存至 Google 雲端硬碟
-信用卡驗證碼已儲存
+信用卡安全碼已儲存
耳罩式耳機
信封 (普通紙)
要求的字型大小
diff -Nru chromium-145.0.7632.116/content/browser/renderer_host/render_frame_host_impl.cc chromium-145.0.7632.159/content/browser/renderer_host/render_frame_host_impl.cc
--- chromium-145.0.7632.116/content/browser/renderer_host/render_frame_host_impl.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/content/browser/renderer_host/render_frame_host_impl.cc 2026-03-02 23:00:09.000000000 +0000
@@ -276,6 +276,7 @@
#include "third_party/blink/public/common/loader/resource_type_util.h"
#include "third_party/blink/public/common/messaging/transferable_message.h"
#include "third_party/blink/public/common/navigation/navigation_params_mojom_traits.h"
+#include "third_party/blink/public/common/page_state/page_state_serialization.h"
#include "third_party/blink/public/common/permissions/permission_utils.h"
#include "third_party/blink/public/common/permissions_policy/document_policy.h"
#include "third_party/blink/public/common/runtime_feature_state/runtime_feature_state_context.h"
@@ -13652,8 +13653,29 @@
bool RenderFrameHostImpl::CanAccessFilesOfPageState(
const blink::PageState& state) {
+ // Ensure that all of the files in the PageState were actually listed in the
+ // GetReferencedFiles list, using a set to prune duplicates.
+ // See https://crbug.com/487383169.
+ std::vector all_files;
+ if (!blink::GetAllFilesInPageState(state.ToEncodedData(), &all_files)) {
+ // All files in the PageState weren't recovered due to parsing failures.
+ // The renderer should be killed instead of proceeding with a PageState that
+ // might still contain files that could be used without being validated.
+ return false;
+ }
+ std::vector referenced_files = state.GetReferencedFiles();
+ std::set referenced_file_set(referenced_files.begin(),
+ referenced_files.end());
+ for (const base::FilePath& file : all_files) {
+ if (!referenced_file_set.contains(file)) {
+ // Found a file that was not in the list to be validated, so the renderer
+ // should be killed.
+ return false;
+ }
+ }
+
return ChildProcessSecurityPolicyImpl::GetInstance()->CanReadAllFiles(
- GetProcess()->GetDeprecatedID(), state.GetReferencedFiles());
+ GetProcess()->GetDeprecatedID(), referenced_files);
}
void RenderFrameHostImpl::GrantFileAccessFromPageState(
diff -Nru chromium-145.0.7632.116/content/browser/security_exploit_browsertest.cc chromium-145.0.7632.159/content/browser/security_exploit_browsertest.cc
--- chromium-145.0.7632.116/content/browser/security_exploit_browsertest.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/content/browser/security_exploit_browsertest.cc 2026-03-02 23:00:09.000000000 +0000
@@ -90,6 +90,7 @@
#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
#include "services/network/public/cpp/network_switches.h"
#include "services/network/public/cpp/resource_request.h"
+#include "services/network/public/cpp/resource_request_body.h"
#include "services/network/public/mojom/fetch_api.mojom.h"
#include "services/network/public/mojom/trust_tokens.mojom.h"
#include "services/network/public/mojom/url_loader.mojom.h"
@@ -102,6 +103,7 @@
#include "third_party/blink/public/common/fenced_frame/fenced_frame_utils.h"
#include "third_party/blink/public/common/frame/fenced_frame_sandbox_flags.h"
#include "third_party/blink/public/common/navigation/navigation_policy.h"
+#include "third_party/blink/public/common/page_state/page_state_serialization.h"
#include "third_party/blink/public/mojom/blob/blob_url_store.mojom.h"
#include "third_party/blink/public/mojom/choosers/file_chooser.mojom.h"
#include "third_party/blink/public/mojom/fenced_frame/fenced_frame.mojom.h"
@@ -1592,6 +1594,130 @@
EXPECT_EQ(bad_message::RFH_INVALID_WEB_UI_CONTROLLER, kill_waiter.Wait());
}
+namespace {
+
+// An interceptor class that allows replacing the PageState of the DidCommit IPC
+// from the renderer process to the browser process.
+class DidCommitPageStateReplacer : public DidCommitNavigationInterceptor {
+ public:
+ DidCommitPageStateReplacer(WebContents* web_contents,
+ const blink::PageState& page_state)
+ : DidCommitNavigationInterceptor(web_contents),
+ replacement_page_state_(page_state) {}
+
+ DidCommitPageStateReplacer(const DidCommitPageStateReplacer&) = delete;
+ DidCommitPageStateReplacer& operator=(const DidCommitPageStateReplacer&) =
+ delete;
+
+ ~DidCommitPageStateReplacer() override = default;
+
+ protected:
+ bool WillProcessDidCommitNavigation(
+ RenderFrameHost* render_frame_host,
+ NavigationRequest* navigation_request,
+ mojom::DidCommitProvisionalLoadParamsPtr* params,
+ mojom::DidCommitProvisionalLoadInterfaceParamsPtr* interface_params)
+ override {
+ (**params).page_state = replacement_page_state_;
+ return true;
+ }
+
+ private:
+ blink::PageState replacement_page_state_;
+};
+
+} // namespace
+
+// Test that committing a navigation with a PageState that does not list all of
+// its file paths in GetReferencedFiles will cause a renderer kill.
+IN_PROC_BROWSER_TEST_F(SecurityExploitBrowserTest, PageStateWithUnlistedFile) {
+ // Navigate to foo.com initially.
+ GURL foo_url(embedded_test_server()->GetURL("foo.com", "/title1.html"));
+ EXPECT_TRUE(NavigateToURL(shell(), foo_url));
+
+ // Create a PageState that contains a file path which isn't in the list of
+ // referenced files which are validated.
+ GURL foo_url2(embedded_test_server()->GetURL("foo.com", "/title2.html"));
+ blink::ExplodedPageState exploded_page_state;
+ ASSERT_TRUE(blink::DecodePageState(
+ blink::PageState::CreateFromURL(foo_url2).ToEncodedData(),
+ &exploded_page_state));
+ scoped_refptr request_body =
+ new network::ResourceRequestBody();
+ base::FilePath bad_file = base::FilePath::FromUTF8Unsafe("/tmp/offlimits");
+ request_body->AppendFileRange(
+ bad_file, 0, std::numeric_limits::max(), base::Time());
+ exploded_page_state.top.http_body.request_body = request_body;
+ exploded_page_state.top.http_body.http_content_type = u"text/plain";
+ std::string encoded_page_state;
+ blink::EncodePageState(exploded_page_state, &encoded_page_state);
+ blink::PageState page_state =
+ blink::PageState::CreateFromEncodedData(encoded_page_state);
+
+ // Create an interceptor which will put the modified PageState into the next
+ // navigation's DidCommit message.
+ DidCommitPageStateReplacer page_state_replacer(shell()->web_contents(),
+ page_state);
+
+ // Navigate in the same renderer process to send the bad PageState.
+ RenderFrameHostImpl* rfh = static_cast(
+ shell()->web_contents()->GetPrimaryMainFrame());
+ RenderProcessHostBadIpcMessageWaiter kill_waiter(rfh->GetProcess());
+ EXPECT_TRUE(NavigateToURLAndExpectNoCommit(shell(), foo_url2));
+
+ // Verify that the malicious renderer was killed, for the right reason.
+ EXPECT_EQ(bad_message::RFH_CAN_ACCESS_FILES_OF_PAGE_STATE_AT_COMMIT,
+ kill_waiter.Wait());
+}
+
+// Similar to the test above, but also uses a malformed DocumentState within the
+// corrupted PageState, to make it harder to find file paths that are present.
+IN_PROC_BROWSER_TEST_F(SecurityExploitBrowserTest,
+ PageStateWithUnlistedFileAndBadDocumentState) {
+ // Navigate to foo.com initially.
+ GURL foo_url(embedded_test_server()->GetURL("foo.com", "/title1.html"));
+ EXPECT_TRUE(NavigateToURL(shell(), foo_url));
+
+ // Create a PageState that contains a file path which isn't in the list of
+ // referenced files which are validated.
+ GURL foo_url2(embedded_test_server()->GetURL("foo.com", "/title2.html"));
+ blink::ExplodedPageState exploded_page_state;
+ ASSERT_TRUE(blink::DecodePageState(
+ blink::PageState::CreateFromURL(foo_url2).ToEncodedData(),
+ &exploded_page_state));
+ scoped_refptr request_body =
+ new network::ResourceRequestBody();
+ base::FilePath bad_file = base::FilePath::FromUTF8Unsafe("/tmp/offlimits");
+ request_body->AppendFileRange(
+ bad_file, 0, std::numeric_limits::max(), base::Time());
+ exploded_page_state.top.http_body.request_body = request_body;
+ exploded_page_state.top.http_body.http_content_type = u"text/plain";
+
+ // Also modify the DocumentState to force RecursivelyAppendReferencedFiles to
+ // return false.
+ exploded_page_state.top.document_state = {u"one", u"two"};
+
+ std::string encoded_page_state;
+ blink::EncodePageState(exploded_page_state, &encoded_page_state);
+ blink::PageState page_state =
+ blink::PageState::CreateFromEncodedData(encoded_page_state);
+
+ // Create an interceptor which will put the modified PageState into the next
+ // navigation's DidCommit message.
+ DidCommitPageStateReplacer page_state_replacer(shell()->web_contents(),
+ page_state);
+
+ // Navigate in the same renderer process to send the bad PageState.
+ RenderFrameHostImpl* rfh = static_cast(
+ shell()->web_contents()->GetPrimaryMainFrame());
+ RenderProcessHostBadIpcMessageWaiter kill_waiter(rfh->GetProcess());
+ EXPECT_TRUE(NavigateToURLAndExpectNoCommit(shell(), foo_url2));
+
+ // Verify that the malicious renderer was killed, for the right reason.
+ EXPECT_EQ(bad_message::RFH_CAN_ACCESS_FILES_OF_PAGE_STATE_AT_COMMIT,
+ kill_waiter.Wait());
+}
+
class BeginNavigationTransitionReplacer : public FrameHostInterceptor {
public:
BeginNavigationTransitionReplacer(WebContents* web_contents,
diff -Nru chromium-145.0.7632.116/debian/changelog chromium-145.0.7632.159/debian/changelog
--- chromium-145.0.7632.116/debian/changelog 2026-02-26 03:14:31.000000000 +0000
+++ chromium-145.0.7632.159/debian/changelog 2026-03-04 23:24:02.000000000 +0000
@@ -1,3 +1,33 @@
+chromium (145.0.7632.159-1~deb13u1) trixie-security; urgency=high
+
+ [ Andres Salomon ]
+ * New upstream security release.
+ - CVE-2026-3536: Integer overflow in ANGLE. Reported by cinzinga.
+ - CVE-2026-3537: Object lifecycle issue in PowerVR.
+ Reported by Zhihua Yao of KunLun Lab.
+ - CVE-2026-3538: Integer overflow in Skia.
+ Reported by Symeon Paraschoudis.
+ - CVE-2026-3539: Object lifecycle issue in DevTools.
+ Reported by Zhenpeng (Leo) Lin at depthfirst.
+ - CVE-2026-3540: Inappropriate implementation in WebAudio.
+ Reported by Davi Antônio Cruz.
+ - CVE-2026-3541: Inappropriate implementation in CSS. Reported by Syn4pse.
+ - CVE-2026-3542: Inappropriate implementation in WebAssembly.
+ Reported by qymag1c.
+ - CVE-2026-3543: Inappropriate implementation in V8. Reported by qymag1c.
+ - CVE-2026-3544: Heap buffer overflow in WebCodecs.
+ Reported by c6eed09fc8b174b0f3eebedcceb1e792.
+ - CVE-2026-3545: Insufficient data validation in Navigation.
+ Reported by Google.
+
+ [ Daniel Richard G. ]
+ * Re-bundle libxslt, to fix crashes due to an ABI incompatibility between
+ the bundled libxml2 and the system libxml2 used by the system libxslt.
+ - d/clean, d/control, d/copyright: Remove libxslt references.
+ - d/scripts/unbundle: Add entry for libxslt.
+
+ -- Andres Salomon Wed, 04 Mar 2026 18:24:02 -0500
+
chromium (145.0.7632.116-1~deb13u1) trixie-security; urgency=high
* New upstream security release.
diff -Nru chromium-145.0.7632.116/debian/clean chromium-145.0.7632.159/debian/clean
--- chromium-145.0.7632.116/debian/clean 2026-01-21 10:06:03.000000000 +0000
+++ chromium-145.0.7632.159/debian/clean 2026-03-04 19:10:49.000000000 +0000
@@ -13,7 +13,6 @@
third_party/opus/BUILD.gn
third_party/libpng/BUILD.gn
third_party/libjpeg/BUILD.gn
-third_party/libxslt/BUILD.gn
third_party/openh264/BUILD.gn
third_party/freetype/BUILD.gn
third_party/fontconfig/BUILD.gn
diff -Nru chromium-145.0.7632.116/debian/control chromium-145.0.7632.159/debian/control
--- chromium-145.0.7632.116/debian/control 2026-02-11 22:40:35.000000000 +0000
+++ chromium-145.0.7632.159/debian/control 2026-03-04 19:10:49.000000000 +0000
@@ -72,7 +72,6 @@
libxtst-dev,
libjpeg-dev,
libgtk-3-dev,
- libxslt1-dev,
liblcms2-dev,
libpulse-dev,
libpam0g-dev,
diff -Nru chromium-145.0.7632.116/debian/copyright chromium-145.0.7632.159/debian/copyright
--- chromium-145.0.7632.116/debian/copyright 2026-02-11 22:40:35.000000000 +0000
+++ chromium-145.0.7632.159/debian/copyright 2026-03-04 19:10:49.000000000 +0000
@@ -131,7 +131,6 @@
third_party/libusb
third_party/libxml/mac
third_party/libxml/win32
- third_party/libxslt
third_party/litert/src
third_party/llvm*
third_party/lzma_sdk/bin
diff -Nru chromium-145.0.7632.116/debian/scripts/unbundle chromium-145.0.7632.159/debian/scripts/unbundle
--- chromium-145.0.7632.116/debian/scripts/unbundle 2026-01-21 10:06:03.000000000 +0000
+++ chromium-145.0.7632.159/debian/scripts/unbundle 2026-03-04 19:10:49.000000000 +0000
@@ -50,6 +50,7 @@
'libyuv' ,
'libwebp', # libavif depends on libsharpyuv-dev; only in libwebp 1.3 (trixie)
'libxml', # trixie includes libxml2 2.9, which lacks security feature XML_PARSE_NO_XXE
+ 'libxslt', # avoid mismatched libxml2 via transitive dependency
're2', # experienced crashes Aug 2023 w/ 20230301-3; try >= 20240401.
'simdutf', # not packaged in debian
'snappy',
diff -Nru chromium-145.0.7632.116/gpu/command_buffer/service/context_group.cc chromium-145.0.7632.159/gpu/command_buffer/service/context_group.cc
--- chromium-145.0.7632.116/gpu/command_buffer/service/context_group.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/gpu/command_buffer/service/context_group.cc 2026-03-02 23:00:09.000000000 +0000
@@ -120,9 +120,17 @@
use_passthrough_cmd_decoder_ = gpu_preferences_.use_passthrough_cmd_decoder;
}
-
gpu::ContextResult ContextGroup::Initialize(DecoderContext* decoder,
ContextType context_type) {
+ return InitializeWithCompleteFramebufferForWorkarounds(decoder, context_type,
+ 0);
+}
+
+gpu::ContextResult
+ContextGroup::InitializeWithCompleteFramebufferForWorkarounds(
+ DecoderContext* decoder,
+ ContextType context_type,
+ uint32_t complete_fbo_for_workarounds) {
switch (context_type) {
case CONTEXT_TYPE_WEBGL1:
if (kGpuFeatureStatusBlocklisted ==
@@ -156,8 +164,9 @@
DisallowedFeatures adjusted_disallowed_features =
GetDisallowedFeatures(context_type);
- feature_info_->Initialize(context_type, use_passthrough_cmd_decoder_,
- adjusted_disallowed_features);
+ feature_info_->InitializeWithCompleteFramebufferForWorkarounds(
+ context_type, use_passthrough_cmd_decoder_, adjusted_disallowed_features,
+ complete_fbo_for_workarounds);
// Fail early if ES3 is requested and driver does not support it.
if ((context_type == CONTEXT_TYPE_WEBGL2 ||
diff -Nru chromium-145.0.7632.116/gpu/command_buffer/service/context_group.h chromium-145.0.7632.159/gpu/command_buffer/service/context_group.h
--- chromium-145.0.7632.116/gpu/command_buffer/service/context_group.h 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/gpu/command_buffer/service/context_group.h 2026-03-02 23:00:09.000000000 +0000
@@ -72,7 +72,10 @@
// call to destroy if it succeeds.
gpu::ContextResult Initialize(DecoderContext* decoder,
ContextType context_type);
-
+ gpu::ContextResult InitializeWithCompleteFramebufferForWorkarounds(
+ DecoderContext* decoder,
+ ContextType context_type,
+ uint32_t complete_fbo_for_workarounds);
// Destroys all the resources when called for the last context in the group.
// It should only be called by DecoderContext.
void Destroy(DecoderContext* decoder, bool have_context);
diff -Nru chromium-145.0.7632.116/gpu/command_buffer/service/decoder_context.h chromium-145.0.7632.159/gpu/command_buffer/service/decoder_context.h
--- chromium-145.0.7632.116/gpu/command_buffer/service/decoder_context.h 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/gpu/command_buffer/service/decoder_context.h 2026-03-02 23:00:09.000000000 +0000
@@ -140,6 +140,12 @@
virtual gles2::ErrorState* GetErrorState() = 0;
//
+ // Methods required by GLES2 Decoder helpers
+ //
+ // Bind the framebuffer `service_id` and perform any workarounds needed.
+ virtual void BindFramebuffer(unsigned target, uint32_t service_id) const = 0;
+
+ //
// Methods required by Texture.
//
// Indicates whether a given internal format is one for a compressed
diff -Nru chromium-145.0.7632.116/gpu/command_buffer/service/feature_info.cc chromium-145.0.7632.159/gpu/command_buffer/service/feature_info.cc
--- chromium-145.0.7632.116/gpu/command_buffer/service/feature_info.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/gpu/command_buffer/service/feature_info.cc 2026-03-02 23:00:09.000000000 +0000
@@ -63,7 +63,8 @@
bool IsWebGLDrawBuffersSupported(bool webglCompatibilityContext,
GLenum depth_texture_internal_format,
- GLenum depth_stencil_texture_internal_format) {
+ GLenum depth_stencil_texture_internal_format,
+ GLuint complete_fbo_for_workarounds) {
// This is called after we make sure GL_EXT_draw_buffers is supported.
GLint max_draw_buffers = 0;
GLint max_color_attachments = 0;
@@ -80,6 +81,9 @@
GLuint fbo;
glGenFramebuffersEXT(1, &fbo);
+ if (complete_fbo_for_workarounds) {
+ glBindFramebufferEXT(GL_FRAMEBUFFER, complete_fbo_for_workarounds);
+ }
glBindFramebufferEXT(GL_FRAMEBUFFER, fbo);
GLuint depth_stencil_texture = 0;
@@ -156,6 +160,9 @@
}
}
+ if (complete_fbo_for_workarounds) {
+ glBindFramebufferEXT(GL_FRAMEBUFFER, complete_fbo_for_workarounds);
+ }
glBindFramebufferEXT(GL_FRAMEBUFFER, static_cast(fb_binding));
glDeleteFramebuffersEXT(1, &fbo);
@@ -235,6 +242,15 @@
void FeatureInfo::Initialize(ContextType context_type,
bool is_passthrough_cmd_decoder,
const DisallowedFeatures& disallowed_features) {
+ InitializeWithCompleteFramebufferForWorkarounds(
+ context_type, is_passthrough_cmd_decoder, disallowed_features, 0);
+}
+
+void FeatureInfo::InitializeWithCompleteFramebufferForWorkarounds(
+ ContextType context_type,
+ bool is_passthrough_cmd_decoder,
+ const DisallowedFeatures& disallowed_features,
+ unsigned complete_fbo_for_workarounds) {
if (initialized_) {
DCHECK_EQ(context_type, context_type_);
DCHECK_EQ(is_passthrough_cmd_decoder, is_passthrough_cmd_decoder_);
@@ -245,14 +261,14 @@
disallowed_features_ = disallowed_features;
context_type_ = context_type;
is_passthrough_cmd_decoder_ = is_passthrough_cmd_decoder;
- InitializeFeatures();
+ InitializeFeatures(complete_fbo_for_workarounds);
initialized_ = true;
}
void FeatureInfo::ForceReinitialize() {
CHECK(initialized_);
CHECK(is_passthrough_cmd_decoder_);
- InitializeFeatures();
+ InitializeFeatures(0);
}
void FeatureInfo::InitializeForTesting(
@@ -274,7 +290,7 @@
DisallowedFeatures());
}
-bool IsGL_REDSupportedOnFBOs() {
+bool IsGL_REDSupportedOnFBOs(uint32_t complete_fbo_for_workarounds) {
#if BUILDFLAG(IS_MAC)
// The glTexImage2D call below can hang on Mac so skip this since it's only
// really needed to workaround a Mesa issue. See https://crbug.com/1158744.
@@ -308,6 +324,9 @@
GL_UNSIGNED_BYTE, nullptr);
GLuint textureFBOID = 0;
glGenFramebuffersEXT(1, &textureFBOID);
+ if (complete_fbo_for_workarounds) {
+ glBindFramebufferEXT(GL_FRAMEBUFFER, complete_fbo_for_workarounds);
+ }
glBindFramebufferEXT(GL_FRAMEBUFFER, textureFBOID);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
textureId, 0);
@@ -316,6 +335,9 @@
glDeleteFramebuffersEXT(1, &textureFBOID);
glDeleteTextures(1, &textureId);
+ if (complete_fbo_for_workarounds) {
+ glBindFramebufferEXT(GL_FRAMEBUFFER, complete_fbo_for_workarounds);
+ }
glBindFramebufferEXT(GL_FRAMEBUFFER, static_cast(fb_binding));
glBindTexture(GL_TEXTURE_2D, static_cast(tex_binding));
@@ -473,7 +495,7 @@
}
}
-void FeatureInfo::InitializeFeatures() {
+void FeatureInfo::InitializeFeatures(uint32_t complete_fbo_for_workarounds) {
// Figure out what extensions to turn on.
std::string extensions_string(gl::GetGLExtensionsFromCurrentContext());
gfx::ExtensionSet extensions(gfx::MakeExtensionSet(extensions_string));
@@ -1261,9 +1283,9 @@
can_emulate_es2_draw_buffers_on_es3_nv) &&
(context_type_ == CONTEXT_TYPE_OPENGLES2 ||
(context_type_ == CONTEXT_TYPE_WEBGL1 &&
- IsWebGLDrawBuffersSupported(is_webgl_compatibility_context,
- depth_texture_format,
- depth_stencil_texture_format)));
+ IsWebGLDrawBuffersSupported(
+ is_webgl_compatibility_context, depth_texture_format,
+ depth_stencil_texture_format, complete_fbo_for_workarounds)));
if (have_es2_draw_buffers) {
AddExtensionString("GL_EXT_draw_buffers");
feature_flags_.ext_draw_buffers = true;
@@ -1384,7 +1406,7 @@
if ((gl_version_info_->is_es3 ||
gfx::HasExtension(extensions, "GL_EXT_texture_rg")) &&
- IsGL_REDSupportedOnFBOs()) {
+ IsGL_REDSupportedOnFBOs(complete_fbo_for_workarounds)) {
feature_flags_.ext_texture_rg = true;
AddExtensionString("GL_EXT_texture_rg");
diff -Nru chromium-145.0.7632.116/gpu/command_buffer/service/feature_info.h chromium-145.0.7632.159/gpu/command_buffer/service/feature_info.h
--- chromium-145.0.7632.116/gpu/command_buffer/service/feature_info.h 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/gpu/command_buffer/service/feature_info.h 2026-03-02 23:00:09.000000000 +0000
@@ -163,6 +163,14 @@
bool is_passthrough_cmd_decoder,
const DisallowedFeatures& disallowed_features);
+ // Same as initialize but with a provided `complete_fbo_for_workarounds` to
+ // use with the ensure_previous_framebuffer_not_deleted driver bug workaround.
+ void InitializeWithCompleteFramebufferForWorkarounds(
+ ContextType context_type,
+ bool is_passthrough_cmd_decoder,
+ const DisallowedFeatures& disallowed_features,
+ uint32_t complete_fbo_for_workarounds);
+
// Same as above, but allows reinitialization.
void ForceReinitialize();
@@ -250,7 +258,7 @@
void AddExtensionString(std::string_view s);
void InitializeBasicState(const base::CommandLine* command_line);
- void InitializeFeatures();
+ void InitializeFeatures(uint32_t complete_fbo_for_workarounds);
void InitializeFloatAndHalfFloatFeatures(const gfx::ExtensionSet& extensions);
void EnableANGLEInstancedArrayIfPossible(const gfx::ExtensionSet& extensions);
diff -Nru chromium-145.0.7632.116/gpu/command_buffer/service/gles2_cmd_copy_tex_image.cc chromium-145.0.7632.159/gpu/command_buffer/service/gles2_cmd_copy_tex_image.cc
--- chromium-145.0.7632.116/gpu/command_buffer/service/gles2_cmd_copy_tex_image.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/gpu/command_buffer/service/gles2_cmd_copy_tex_image.cc 2026-03-02 23:00:09.000000000 +0000
@@ -185,7 +185,7 @@
// framebuffer is copying from a texture and sample directly from that texture
// instead of doing an extra copy
- glBindFramebufferEXT(GL_FRAMEBUFFER, source_framebuffer);
+ decoder->BindFramebuffer(GL_FRAMEBUFFER, source_framebuffer);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, scratch_textures_[0]);
glCopyTexImage2D(GL_TEXTURE_2D, 0, source_framebuffer_internal_format, x, y,
@@ -217,7 +217,7 @@
glTexImage2D(GL_TEXTURE_2D, 0, compatability_format, width, height, 0,
compatability_format, luma_type, nullptr);
- glBindFramebufferEXT(GL_FRAMEBUFFER, scratch_fbo_);
+ decoder->BindFramebuffer(GL_FRAMEBUFFER, scratch_fbo_);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D,
scratch_textures_[1], 0);
diff -Nru chromium-145.0.7632.116/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc chromium-145.0.7632.159/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc
--- chromium-145.0.7632.116/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/gpu/command_buffer/service/gles2_cmd_copy_texture_chromium.cc 2026-03-02 23:00:09.000000000 +0000
@@ -492,7 +492,8 @@
glDeleteShader(shader);
}
-bool BindFramebufferTexture2D(GLenum target,
+bool BindFramebufferTexture2D(DecoderContext* decoder,
+ GLenum target,
GLuint texture_id,
GLint level,
GLuint framebuffer) {
@@ -512,7 +513,7 @@
glTexParameterf(binding_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(binding_target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(binding_target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
- glBindFramebufferEXT(GL_FRAMEBUFFER, framebuffer);
+ decoder->BindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, target,
texture_id, level);
@@ -546,7 +547,7 @@
DCHECK(dest_binding_target == GL_TEXTURE_2D ||
dest_binding_target == GL_TEXTURE_CUBE_MAP);
DCHECK(source_level == 0 || decoder->GetFeatureInfo()->IsES3Capable());
- if (BindFramebufferTexture2D(source_target, source_id, source_level,
+ if (BindFramebufferTexture2D(decoder, source_target, source_id, source_level,
framebuffer)) {
glBindTexture(dest_binding_target, dest_id);
glTexParameterf(dest_binding_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
@@ -604,7 +605,7 @@
DCHECK(dest_binding_target == GL_TEXTURE_2D ||
dest_binding_target == GL_TEXTURE_CUBE_MAP);
DCHECK(source_level == 0 || decoder->GetFeatureInfo()->IsES3Capable());
- if (BindFramebufferTexture2D(source_target, source_id, source_level,
+ if (BindFramebufferTexture2D(decoder, source_target, source_id, source_level,
framebuffer)) {
glBindTexture(dest_binding_target, dest_id);
glTexParameterf(dest_binding_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
@@ -769,7 +770,7 @@
DCHECK(dest_binding_target == GL_TEXTURE_2D ||
dest_binding_target == GL_TEXTURE_CUBE_MAP);
DCHECK(source_level == 0 || decoder->GetFeatureInfo()->IsES3Capable());
- if (BindFramebufferTexture2D(source_target, source_id, source_level,
+ if (BindFramebufferTexture2D(decoder, source_target, source_id, source_level,
framebuffer)) {
glBindTexture(dest_binding_target, dest_id);
glTexParameterf(dest_binding_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
@@ -1343,7 +1344,7 @@
(y + height / 2.f) * m_y / source_height);
DCHECK(dest_level == 0 || decoder->GetFeatureInfo()->IsES3Capable());
- if (BindFramebufferTexture2D(dest_target, dest_id, dest_level,
+ if (BindFramebufferTexture2D(decoder, dest_target, dest_id, dest_level,
framebuffer_)) {
#ifndef NDEBUG
// glValidateProgram of MACOSX validates FBO unlike other platforms, so
diff -Nru chromium-145.0.7632.116/gpu/command_buffer/service/gles2_cmd_decoder.cc chromium-145.0.7632.159/gpu/command_buffer/service/gles2_cmd_decoder.cc
--- chromium-145.0.7632.116/gpu/command_buffer/service/gles2_cmd_decoder.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/gpu/command_buffer/service/gles2_cmd_decoder.cc 2026-03-02 23:00:09.000000000 +0000
@@ -674,6 +674,9 @@
// Implements GpuSwitchingObserver.
void OnGpuSwitched() override;
+ // Bind the framebuffer `fbo` and perform any workarounds needed.
+ void BindFramebuffer(unsigned target, uint32_t service_id) const override;
+
// Restores the current state to the user's settings.
void RestoreCurrentFramebufferBindings();
@@ -2417,6 +2420,10 @@
// Backbuffer attachments that are currently undefined.
uint32_t backbuffer_needs_clear_bits_;
+ // An always-complete FBO to use for workarounds
+ GLuint complete_fbo_ = 0;
+ GLuint complete_fbo_color_texture_ = 0;
+
// The current decoder error communicates the decoder error through command
// processing functions that do not return the error value. Should be set only
// if not returning an error.
@@ -2593,7 +2600,7 @@
: decoder_(decoder) {
ScopedGLErrorSuppressor suppressor("ScopedFramebufferBinder::ctor",
decoder_->error_state_.get());
- decoder->api()->glBindFramebufferEXTFn(GL_FRAMEBUFFER, id);
+ decoder->BindFramebuffer(GL_FRAMEBUFFER, id);
decoder->OnFboChanged();
}
@@ -2979,7 +2986,27 @@
return gpu::ContextResult::kFatalFailure;
}
- auto result = group_->Initialize(this, context_type);
+ if (workarounds().ensure_previous_framebuffer_not_deleted) {
+ // Use a 1x1 RGBA8 framebuffer as the "always complete" framebuffer to bind
+ // before binding other framebuffers
+ api()->glGenTexturesFn(1, &complete_fbo_color_texture_);
+ api()->glBindTextureFn(GL_TEXTURE_2D, complete_fbo_color_texture_);
+ api()->glTexImage2DFn(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA,
+ GL_UNSIGNED_BYTE, nullptr);
+
+ api()->glGenFramebuffersEXTFn(1, &complete_fbo_);
+ api()->glBindFramebufferEXTFn(GL_FRAMEBUFFER, complete_fbo_);
+ api()->glFramebufferTexture2DEXTFn(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+ GL_TEXTURE_2D,
+ complete_fbo_color_texture_, 0);
+ CHECK_EQ(api()->glCheckFramebufferStatusEXTFn(GL_FRAMEBUFFER),
+ static_cast(GL_FRAMEBUFFER_COMPLETE));
+ }
+ CHECK_GL_ERROR();
+
+ auto result = group_->InitializeWithCompleteFramebufferForWorkarounds(
+ this, context_type, complete_fbo_);
+
if (result != gpu::ContextResult::kSuccess) {
// Must not destroy ContextGroup if it is not initialized.
group_ = nullptr;
@@ -3115,7 +3142,7 @@
state_.viewport_width = initial_size.width();
state_.viewport_height = initial_size.height();
} else {
- api()->glBindFramebufferEXTFn(GL_FRAMEBUFFER, GetBackbufferServiceId());
+ BindFramebuffer(GL_FRAMEBUFFER, GetBackbufferServiceId());
// These are NOT if the back buffer has these proprorties. They are
// if we want the command buffer to enforce them regardless of what
// the real backbuffer is assuming the real back buffer gives us more than
@@ -3807,7 +3834,7 @@
if (workarounds().unbind_attachments_on_bound_render_fbo_delete)
framebuffer->DoUnbindGLAttachmentsForWorkaround(target);
- api()->glBindFramebufferEXTFn(target, GetBackbufferServiceId());
+ BindFramebuffer(target, GetBackbufferServiceId());
state_.UpdateWindowRectanglesForBoundDrawFramebufferClientID(0);
framebuffer_state_.bound_draw_framebuffer = nullptr;
framebuffer_state_.clear_state_dirty = true;
@@ -3815,7 +3842,7 @@
if (framebuffer == framebuffer_state_.bound_read_framebuffer.get()) {
framebuffer_state_.bound_read_framebuffer = nullptr;
GLenum target = GetReadFramebufferTarget();
- api()->glBindFramebufferEXTFn(target, GetBackbufferServiceId());
+ BindFramebuffer(target, GetBackbufferServiceId());
}
OnFboChanged();
RemoveFramebuffer(client_id);
@@ -3963,33 +3990,32 @@
ProcessPendingReadPixels(false);
}
-static void RebindCurrentFramebuffer(gl::GLApi* api,
- GLenum target,
- Framebuffer* framebuffer,
- GLuint back_buffer_service_id) {
- GLuint framebuffer_id = framebuffer ? framebuffer->service_id() : 0;
+void GLES2DecoderImpl::RestoreCurrentFramebufferBindings() {
+ framebuffer_state_.clear_state_dirty = true;
- if (framebuffer_id == 0) {
- framebuffer_id = back_buffer_service_id;
- }
+ auto rebind_current_framebuffer = [this](GLenum target,
+ Framebuffer* framebuffer,
+ GLuint back_buffer_service_id) {
+ GLuint framebuffer_id = framebuffer ? framebuffer->service_id() : 0;
- api->glBindFramebufferEXTFn(target, framebuffer_id);
-}
+ if (framebuffer_id == 0) {
+ framebuffer_id = back_buffer_service_id;
+ }
-void GLES2DecoderImpl::RestoreCurrentFramebufferBindings() {
- framebuffer_state_.clear_state_dirty = true;
+ BindFramebuffer(target, framebuffer_id);
+ };
if (!SupportsSeparateFramebufferBinds()) {
- RebindCurrentFramebuffer(api(), GL_FRAMEBUFFER,
- framebuffer_state_.bound_draw_framebuffer.get(),
- GetBackbufferServiceId());
- } else {
- RebindCurrentFramebuffer(api(), GL_READ_FRAMEBUFFER,
- framebuffer_state_.bound_read_framebuffer.get(),
- GetBackbufferServiceId());
- RebindCurrentFramebuffer(api(), GL_DRAW_FRAMEBUFFER,
- framebuffer_state_.bound_draw_framebuffer.get(),
- GetBackbufferServiceId());
+ rebind_current_framebuffer(GL_FRAMEBUFFER,
+ framebuffer_state_.bound_draw_framebuffer.get(),
+ GetBackbufferServiceId());
+ } else {
+ rebind_current_framebuffer(GL_READ_FRAMEBUFFER,
+ framebuffer_state_.bound_read_framebuffer.get(),
+ GetBackbufferServiceId());
+ rebind_current_framebuffer(GL_DRAW_FRAMEBUFFER,
+ framebuffer_state_.bound_draw_framebuffer.get(),
+ GetBackbufferServiceId());
}
OnFboChanged();
}
@@ -4378,6 +4404,16 @@
client()->OnGpuSwitched();
}
+void GLES2DecoderImpl::BindFramebuffer(unsigned target,
+ uint32_t service_id) const {
+ if (workarounds().ensure_previous_framebuffer_not_deleted) {
+ DCHECK(complete_fbo_);
+ api()->glBindFramebufferEXTFn(target, complete_fbo_);
+ }
+
+ api()->glBindFramebufferEXTFn(target, service_id);
+}
+
void GLES2DecoderImpl::Destroy(bool have_context) {
if (!initialized())
return;
@@ -4427,6 +4463,13 @@
offscreen_target_frame_buffer_->Destroy();
if (offscreen_target_color_texture_.get())
offscreen_target_color_texture_->Destroy();
+
+ if (complete_fbo_color_texture_) {
+ api()->glDeleteTexturesFn(1, &complete_fbo_color_texture_);
+ }
+ if (complete_fbo_) {
+ api()->glDeleteFramebuffersEXTFn(1, &complete_fbo_);
+ }
} else {
if (offscreen_target_frame_buffer_.get())
offscreen_target_frame_buffer_->Invalidate();
@@ -5056,13 +5099,13 @@
? framebuffer_state_.bound_draw_framebuffer->service_id()
: GetBackbufferServiceId();
if (!SupportsSeparateFramebufferBinds()) {
- api()->glBindFramebufferEXTFn(GL_FRAMEBUFFER, service_id);
+ BindFramebuffer(GL_FRAMEBUFFER, service_id);
} else {
- api()->glBindFramebufferEXTFn(GL_DRAW_FRAMEBUFFER, service_id);
+ BindFramebuffer(GL_DRAW_FRAMEBUFFER, service_id);
service_id = framebuffer_state_.bound_read_framebuffer.get()
? framebuffer_state_.bound_read_framebuffer->service_id()
: GetBackbufferServiceId();
- api()->glBindFramebufferEXTFn(GL_READ_FRAMEBUFFER, service_id);
+ BindFramebuffer(GL_READ_FRAMEBUFFER, service_id);
}
OnFboChanged();
}
@@ -5203,7 +5246,7 @@
service_id = GetBackbufferServiceId();
}
- api()->glBindFramebufferEXTFn(target, service_id);
+ BindFramebuffer(target, service_id);
OnFboChanged();
}
@@ -6978,8 +7021,7 @@
if (target == GL_READ_FRAMEBUFFER && draw_framebuffer != framebuffer) {
// TODO(zmo): There is no guarantee that an FBO that is complete on the
// READ attachment will be complete as a DRAW attachment.
- api()->glBindFramebufferEXTFn(GL_DRAW_FRAMEBUFFER,
- framebuffer->service_id());
+ BindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer->service_id());
}
state_.SetDeviceColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false);
@@ -7026,8 +7068,7 @@
target == GL_READ_FRAMEBUFFER && draw_framebuffer != framebuffer) {
// TODO(zmo): There is no guarantee that an FBO that is complete on the
// READ attachment will be complete as a DRAW attachment.
- api()->glBindFramebufferEXTFn(GL_DRAW_FRAMEBUFFER,
- framebuffer->service_id());
+ BindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffer->service_id());
}
state_.SetDeviceCapabilityState(GL_SCISSOR_TEST, false);
ClearDeviceWindowRectangles();
@@ -7045,7 +7086,7 @@
if (target == GL_READ_FRAMEBUFFER && draw_framebuffer != framebuffer) {
GLuint service_id = draw_framebuffer ? draw_framebuffer->service_id() :
GetBackbufferServiceId();
- api()->glBindFramebufferEXTFn(GL_DRAW_FRAMEBUFFER, service_id);
+ BindFramebuffer(GL_DRAW_FRAMEBUFFER, service_id);
}
}
@@ -7902,7 +7943,8 @@
bool GLES2DecoderImpl::RegenerateRenderbufferIfNeeded(
Renderbuffer* renderbuffer) {
- if (!renderbuffer->RegenerateAndBindBackingObjectIfNeeded(workarounds())) {
+ if (!renderbuffer->RegenerateAndBindBackingObjectIfNeeded(this,
+ workarounds())) {
return false;
}
@@ -12060,7 +12102,7 @@
GLenum fb_target = GetDrawFramebufferTarget();
GLuint fb = 0;
api()->glGenFramebuffersEXTFn(1, &fb);
- api()->glBindFramebufferEXTFn(fb_target, fb);
+ BindFramebuffer(fb_target, fb);
bool have_color = (channels & GLES2Util::kRGBA) != 0;
if (have_color) {
@@ -12103,7 +12145,7 @@
Framebuffer* framebuffer = GetFramebufferInfoForTarget(fb_target);
GLuint fb_service_id =
framebuffer ? framebuffer->service_id() : GetBackbufferServiceId();
- api()->glBindFramebufferEXTFn(fb_target, fb_service_id);
+ BindFramebuffer(fb_target, fb_service_id);
return result;
}
@@ -14582,8 +14624,9 @@
new FeatureInfo(workarounds(), group_->gpu_feature_info()));
DisallowedFeatures disallowed_features = feature_info_->disallowed_features();
disallowed_features.AllowExtensions();
- info->Initialize(feature_info_->context_type(),
- false /* is_passthrough_cmd_decoder */, disallowed_features);
+ info->InitializeWithCompleteFramebufferForWorkarounds(
+ feature_info_->context_type(), false /* is_passthrough_cmd_decoder */,
+ disallowed_features, complete_fbo_);
bucket->SetFromString(gfx::MakeExtensionString(info->extensions()).c_str());
return error::kNoError;
}
diff -Nru chromium-145.0.7632.116/gpu/command_buffer/service/gles2_cmd_decoder_mock.h chromium-145.0.7632.159/gpu/command_buffer/service/gles2_cmd_decoder_mock.h
--- chromium-145.0.7632.116/gpu/command_buffer/service/gles2_cmd_decoder_mock.h 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/gpu/command_buffer/service/gles2_cmd_decoder_mock.h 2026-03-02 23:00:09.000000000 +0000
@@ -147,6 +147,8 @@
int height,
int depth));
MOCK_METHOD0(GetErrorState, ErrorState *());
+ MOCK_CONST_METHOD2(BindFramebuffer,
+ void(unsigned target, uint32_t service_id));
MOCK_METHOD0(GetLogger, Logger*());
diff -Nru chromium-145.0.7632.116/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc chromium-145.0.7632.159/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
--- chromium-145.0.7632.116/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc 2026-03-02 23:00:09.000000000 +0000
@@ -1541,6 +1541,11 @@
return nullptr;
}
+void GLES2DecoderPassthroughImpl::BindFramebuffer(unsigned target,
+ uint32_t service_id) const {
+ NOTREACHED();
+}
+
void GLES2DecoderPassthroughImpl::WaitForReadPixels(
base::OnceClosure callback) {}
diff -Nru chromium-145.0.7632.116/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h chromium-145.0.7632.159/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h
--- chromium-145.0.7632.116/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h 2026-03-02 23:00:09.000000000 +0000
@@ -315,6 +315,8 @@
ErrorState* GetErrorState() override;
+ void BindFramebuffer(unsigned target, uint32_t service_id) const override;
+
void WaitForReadPixels(base::OnceClosure callback) override;
// Returns true if the context was lost either by GL_ARB_robustness, forced
diff -Nru chromium-145.0.7632.116/gpu/command_buffer/service/raster_decoder.cc chromium-145.0.7632.159/gpu/command_buffer/service/raster_decoder.cc
--- chromium-145.0.7632.116/gpu/command_buffer/service/raster_decoder.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/gpu/command_buffer/service/raster_decoder.cc 2026-03-02 23:00:09.000000000 +0000
@@ -559,6 +559,7 @@
gles2::ContextGroup* GetContextGroup() override;
gles2::ErrorState* GetErrorState() override;
+ void BindFramebuffer(unsigned target, uint32_t service_id) const override;
bool IsCompressedTextureFormat(unsigned format) override;
bool ClearLevel(gles2::Texture* texture,
@@ -1596,6 +1597,11 @@
return error_state_.get();
}
+void RasterDecoderImpl::BindFramebuffer(unsigned target,
+ uint32_t service_id) const {
+ NOTREACHED();
+}
+
bool RasterDecoderImpl::IsCompressedTextureFormat(unsigned format) {
return feature_info()->validators()->compressed_texture_format.IsValid(
format);
diff -Nru chromium-145.0.7632.116/gpu/command_buffer/service/renderbuffer_manager.cc chromium-145.0.7632.159/gpu/command_buffer/service/renderbuffer_manager.cc
--- chromium-145.0.7632.116/gpu/command_buffer/service/renderbuffer_manager.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/gpu/command_buffer/service/renderbuffer_manager.cc 2026-03-02 23:00:09.000000000 +0000
@@ -15,6 +15,7 @@
#include "base/trace_event/memory_dump_manager.h"
#include "base/trace_event/trace_event.h"
#include "gpu/command_buffer/common/gles2_cmd_utils.h"
+#include "gpu/command_buffer/service/decoder_context.h"
#include "gpu/command_buffer/service/feature_info.h"
#include "gpu/command_buffer/service/framebuffer_manager.h"
#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
@@ -141,6 +142,7 @@
}
bool Renderbuffer::RegenerateAndBindBackingObjectIfNeeded(
+ const DecoderContext* decoder,
const GpuDriverBugWorkarounds& workarounds) {
bool multisample_workaround =
workarounds.multisample_renderbuffer_resize_emulation;
@@ -167,7 +169,7 @@
// Attach new renderbuffer to all framebuffers
for (auto& point : framebuffer_attachment_points_) {
- glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER, point.first->service_id());
+ decoder->BindFramebuffer(GL_DRAW_FRAMEBUFFER, point.first->service_id());
glFramebufferRenderbufferEXT(GL_DRAW_FRAMEBUFFER, point.second,
GL_RENDERBUFFER, service_id_);
}
diff -Nru chromium-145.0.7632.116/gpu/command_buffer/service/renderbuffer_manager.h chromium-145.0.7632.159/gpu/command_buffer/service/renderbuffer_manager.h
--- chromium-145.0.7632.116/gpu/command_buffer/service/renderbuffer_manager.h 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/gpu/command_buffer/service/renderbuffer_manager.h 2026-03-02 23:00:09.000000000 +0000
@@ -22,6 +22,7 @@
namespace gpu {
class GpuDriverBugWorkarounds;
+class DecoderContext;
namespace gles2 {
@@ -79,6 +80,7 @@
// Regenerates the object backing this client_id, creating a new service_id.
// Also reattaches any framebuffers using this renderbuffer.
bool RegenerateAndBindBackingObjectIfNeeded(
+ const DecoderContext* decoder,
const GpuDriverBugWorkarounds& workarounds);
void AddFramebufferAttachmentPoint(Framebuffer* framebuffer,
diff -Nru chromium-145.0.7632.116/gpu/command_buffer/service/webgpu_decoder_impl.cc chromium-145.0.7632.159/gpu/command_buffer/service/webgpu_decoder_impl.cc
--- chromium-145.0.7632.116/gpu/command_buffer/service/webgpu_decoder_impl.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/gpu/command_buffer/service/webgpu_decoder_impl.cc 2026-03-02 23:00:09.000000000 +0000
@@ -306,6 +306,9 @@
std::string_view GetLogPrefix() override { return "WebGPUDecoderImpl"; }
gles2::ContextGroup* GetContextGroup() override { return nullptr; }
gles2::ErrorState* GetErrorState() override { NOTREACHED(); }
+ void BindFramebuffer(unsigned target, uint32_t service_id) const override {
+ NOTREACHED();
+ }
bool IsCompressedTextureFormat(unsigned format) override { NOTREACHED(); }
bool ClearLevel(gles2::Texture* texture,
unsigned target,
diff -Nru chromium-145.0.7632.116/gpu/config/gpu_driver_bug_list.json chromium-145.0.7632.159/gpu/config/gpu_driver_bug_list.json
--- chromium-145.0.7632.116/gpu/config/gpu_driver_bug_list.json 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/gpu/config/gpu_driver_bug_list.json 2026-03-02 23:00:09.000000000 +0000
@@ -3817,6 +3817,17 @@
"features": [
"disable_d3d12_video_encoder"
]
+ },
+ {
+ "id": 471,
+ "description": "IMG drivers can sometimes reference previously bound complete framebuffers.",
+ "os": {
+ "type": "android"
+ },
+ "gl_vendor": "Imagination.*",
+ "features": [
+ "ensure_previous_framebuffer_not_deleted"
+ ]
}
]
}
diff -Nru chromium-145.0.7632.116/gpu/config/gpu_lists_version.h chromium-145.0.7632.159/gpu/config/gpu_lists_version.h
--- chromium-145.0.7632.116/gpu/config/gpu_lists_version.h 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/gpu/config/gpu_lists_version.h 2026-03-02 23:00:09.000000000 +0000
@@ -3,6 +3,6 @@
#ifndef GPU_CONFIG_GPU_LISTS_VERSION_H_
#define GPU_CONFIG_GPU_LISTS_VERSION_H_
-#define GPU_LISTS_VERSION "7d28075c6a9ba147e6df449209001258bb82a122"
+#define GPU_LISTS_VERSION "838c69b2e5b8cd00a916e35097249bc20eb25a0a"
#endif // GPU_CONFIG_GPU_LISTS_VERSION_H_
diff -Nru chromium-145.0.7632.116/gpu/config/gpu_workaround_list.txt chromium-145.0.7632.159/gpu/config/gpu_workaround_list.txt
--- chromium-145.0.7632.116/gpu/config/gpu_workaround_list.txt 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/gpu/config/gpu_workaround_list.txt 2026-03-02 23:00:09.000000000 +0000
@@ -77,6 +77,7 @@
dont_use_loops_to_initialize_variables
enable_bgra8_overlays_with_yuv_overlay_support
enable_webgl_timer_query_extensions
+ensure_previous_framebuffer_not_deleted
etc1_power_of_two_only
exit_on_context_lost
flush_before_create_fence
diff -Nru chromium-145.0.7632.116/infra/config/dev.star chromium-145.0.7632.159/infra/config/dev.star
--- chromium-145.0.7632.116/infra/config/dev.star 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/infra/config/dev.star 2026-03-02 23:00:09.000000000 +0000
@@ -77,7 +77,7 @@
default = os.LINUX_JAMMY,
overrides = json.decode(io.read_file("//lib/linux-default.json")),
),
- os.MAC_DEFAULT: os.MAC_15,
+ os.MAC_DEFAULT: "Mac-15|Mac-26",
os.MAC_BETA: "Mac-15|Mac-26",
os.WINDOWS_DEFAULT: os.WINDOWS_10,
},
diff -Nru chromium-145.0.7632.116/infra/config/generated/luci/cr-buildbucket.cfg chromium-145.0.7632.159/infra/config/generated/luci/cr-buildbucket.cfg
--- chromium-145.0.7632.116/infra/config/generated/luci/cr-buildbucket.cfg 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/infra/config/generated/luci/cr-buildbucket.cfg 2026-03-02 23:00:09.000000000 +0000
@@ -4876,7 +4876,7 @@
swarming_host: "chromium-swarm.appspot.com"
dimensions: "builder:Mac Builder"
dimensions: "cpu:arm64"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.ci"
exe {
cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -10882,7 +10882,7 @@
swarming_host: "chromium-swarm.appspot.com"
dimensions: "builder:ios-simulator"
dimensions: "cpu:arm64"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.ci"
exe {
cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -11002,7 +11002,7 @@
swarming_host: "chromium-swarm.appspot.com"
dimensions: "builder:ios-simulator-full-configs"
dimensions: "cpu:arm64"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.ci"
exe {
cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -12177,7 +12177,7 @@
dimensions: "builderless:1"
dimensions: "cpu:arm64"
dimensions: "free_space:standard"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.ci"
exe {
cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -12293,7 +12293,7 @@
swarming_host: "chromium-swarm.appspot.com"
dimensions: "builder:mac-arm64-rel"
dimensions: "cpu:arm64"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.ci"
exe {
cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -20951,7 +20951,7 @@
swarming_host: "chromium-swarm.appspot.com"
dimensions: "builderless:1"
dimensions: "cpu:arm64"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.gpu.try"
exe {
cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -21184,7 +21184,7 @@
swarming_host: "chromium-swarm.appspot.com"
dimensions: "builder:ios-simulator-compilator"
dimensions: "cpu:arm64"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.try"
exe {
cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -21292,7 +21292,7 @@
swarming_host: "chromium-swarm.appspot.com"
dimensions: "builder:ios-simulator-full-configs"
dimensions: "cpu:arm64"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.try"
exe {
cipd_package: "infra/chromium/bootstrapper/${platform}"
@@ -24502,7 +24502,7 @@
dimensions: "builderless:1"
dimensions: "cpu:arm64"
dimensions: "free_space:standard"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.try"
dimensions: "ssd:1"
exe {
@@ -24608,7 +24608,7 @@
dimensions: "builderless:1"
dimensions: "cpu:arm64"
dimensions: "free_space:standard"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.try"
dimensions: "ssd:1"
exe {
@@ -24725,7 +24725,7 @@
dimensions: "builderless:1"
dimensions: "cpu:arm64"
dimensions: "free_space:standard"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.try"
dimensions: "ssd:1"
exe {
@@ -24837,7 +24837,7 @@
dimensions: "builderless:1"
dimensions: "cpu:arm64"
dimensions: "free_space:standard"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.try"
dimensions: "ssd:1"
exe {
@@ -24949,7 +24949,7 @@
dimensions: "builderless:1"
dimensions: "cpu:arm64"
dimensions: "free_space:standard"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.try"
dimensions: "ssd:1"
exe {
@@ -25056,7 +25056,7 @@
dimensions: "builderless:1"
dimensions: "cpu:arm64"
dimensions: "free_space:standard"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.try"
dimensions: "ssd:1"
exe {
@@ -25163,7 +25163,7 @@
dimensions: "builderless:1"
dimensions: "cpu:arm64"
dimensions: "free_space:standard"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.try"
dimensions: "ssd:1"
exe {
@@ -25275,7 +25275,7 @@
dimensions: "builderless:1"
dimensions: "cpu:arm64"
dimensions: "free_space:standard"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.try"
dimensions: "ssd:1"
exe {
@@ -25382,7 +25382,7 @@
dimensions: "builderless:1"
dimensions: "cpu:arm64"
dimensions: "free_space:standard"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.try"
dimensions: "ssd:1"
exe {
@@ -25494,7 +25494,7 @@
dimensions: "builderless:1"
dimensions: "cpu:arm64"
dimensions: "free_space:standard"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.try"
dimensions: "ssd:1"
exe {
@@ -25601,7 +25601,7 @@
dimensions: "builderless:1"
dimensions: "cpu:arm64"
dimensions: "free_space:standard"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.try"
dimensions: "ssd:1"
exe {
@@ -25714,7 +25714,7 @@
dimensions: "builderless:1"
dimensions: "cpu:arm64"
dimensions: "free_space:standard"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.try"
dimensions: "ssd:1"
exe {
@@ -25821,7 +25821,7 @@
dimensions: "builderless:1"
dimensions: "cpu:arm64"
dimensions: "free_space:standard"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.try"
dimensions: "ssd:1"
exe {
@@ -25934,7 +25934,7 @@
dimensions: "builderless:1"
dimensions: "cpu:arm64"
dimensions: "free_space:standard"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.try"
dimensions: "ssd:1"
exe {
@@ -26159,7 +26159,7 @@
dimensions: "builderless:1"
dimensions: "cpu:arm64"
dimensions: "free_space:standard"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.try"
dimensions: "ssd:1"
exe {
@@ -26266,7 +26266,7 @@
dimensions: "builderless:1"
dimensions: "cpu:arm64"
dimensions: "free_space:standard"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.try"
dimensions: "ssd:1"
exe {
@@ -26373,7 +26373,7 @@
dimensions: "builderless:1"
dimensions: "cpu:arm64"
dimensions: "free_space:standard"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.try"
dimensions: "ssd:1"
exe {
@@ -26486,7 +26486,7 @@
dimensions: "builderless:1"
dimensions: "cpu:arm64"
dimensions: "free_space:standard"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.try"
dimensions: "ssd:1"
exe {
@@ -26593,7 +26593,7 @@
dimensions: "builderless:1"
dimensions: "cpu:arm64"
dimensions: "free_space:standard"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.try"
dimensions: "ssd:1"
exe {
@@ -26709,7 +26709,7 @@
swarming_host: "chromium-swarm.appspot.com"
dimensions: "builderless:1"
dimensions: "cpu:arm64"
- dimensions: "os:Mac-15"
+ dimensions: "os:Mac-15|Mac-26"
dimensions: "pool:luci.chromium.gpu.try"
exe {
cipd_package: "infra/chromium/bootstrapper/${platform}"
diff -Nru chromium-145.0.7632.116/infra/config/main.star chromium-145.0.7632.159/infra/config/main.star
--- chromium-145.0.7632.116/infra/config/main.star 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/infra/config/main.star 2026-03-02 23:00:09.000000000 +0000
@@ -203,7 +203,7 @@
default = os.LINUX_JAMMY,
overrides = json.decode(io.read_file("//lib/linux-default.json")),
),
- os.MAC_DEFAULT: os.MAC_15,
+ os.MAC_DEFAULT: "Mac-15|Mac-26",
os.MAC_BETA: "Mac-15|Mac-26",
os.WINDOWS_DEFAULT: os.WINDOWS_10,
},
diff -Nru chromium-145.0.7632.116/net/data/ssl/chrome_root_store/root_store.certs chromium-145.0.7632.159/net/data/ssl/chrome_root_store/root_store.certs
--- chromium-145.0.7632.116/net/data/ssl/chrome_root_store/root_store.certs 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/net/data/ssl/chrome_root_store/root_store.certs 2026-03-02 23:00:09.000000000 +0000
@@ -509,130 +509,6 @@
03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
-----END CERTIFICATE-----
-# b676f2eddae8775cd36cb0f63cd1d4603961f49e6265ba013a2f0307b6d0b804
-Certificate:
- Data:
- Version: 3 (0x2)
- Serial Number:
- 21:d6:d0:4a:4f:25:0f:c9:32:37:fc:aa:5e:12:8d:e9
- Signature Algorithm: sha512WithRSAEncryption
- Issuer: C = PL, O = Unizeto Technologies S.A., OU = Certum Certification Authority, CN = Certum Trusted Network CA 2
- Validity
- Not Before: Oct 6 08:39:56 2011 GMT
- Not After : Oct 6 08:39:56 2046 GMT
- Subject: C = PL, O = Unizeto Technologies S.A., OU = Certum Certification Authority, CN = Certum Trusted Network CA 2
- Subject Public Key Info:
- Public Key Algorithm: rsaEncryption
- RSA Public-Key: (4096 bit)
- Modulus:
- 00:bd:f9:78:f8:e6:d5:80:0c:64:9d:86:1b:96:64:
- 67:3f:22:3a:1e:75:01:7d:ef:fb:5c:67:8c:c9:cc:
- 5c:6b:a9:91:e6:b9:42:e5:20:4b:9b:da:9b:7b:b9:
- 99:5d:d9:9b:80:4b:d7:84:40:2b:27:d3:e8:ba:30:
- bb:3e:09:1a:a7:49:95:ef:2b:40:24:c2:97:c7:a7:
- ee:9b:25:ef:a8:0a:00:97:85:5a:aa:9d:dc:29:c9:
- e2:35:07:eb:70:4d:4a:d6:c1:b3:56:b8:a1:41:38:
- 9b:d1:fb:31:7f:8f:e0:5f:e1:b1:3f:0f:8e:16:49:
- 60:d7:06:8d:18:f9:aa:26:10:ab:2a:d3:d0:d1:67:
- 8d:1b:46:be:47:30:d5:2e:72:d1:c5:63:da:e7:63:
- 79:44:7e:4b:63:24:89:86:2e:34:3f:29:4c:52:8b:
- 2a:a7:c0:e2:91:28:89:b9:c0:5b:f9:1d:d9:e7:27:
- ad:ff:9a:02:97:c1:c6:50:92:9b:02:2c:bd:a9:b9:
- 34:59:0a:bf:84:4a:ff:df:fe:b3:9f:eb:d9:9e:e0:
- 98:23:ec:a6:6b:77:16:2a:db:cc:ad:3b:1c:a4:87:
- dc:46:73:5e:19:62:68:45:57:e4:90:82:42:bb:42:
- d6:f0:61:e0:c1:a3:3d:66:a3:5d:f4:18:ee:88:c9:
- 8d:17:45:29:99:32:75:02:31:ee:29:26:c8:6b:02:
- e6:b5:62:45:7f:37:15:5a:23:68:89:d4:3e:de:4e:
- 27:b0:f0:40:0c:bc:4d:17:cb:4d:a2:b3:1e:d0:06:
- 5a:dd:f6:93:cf:57:75:99:f5:fa:86:1a:67:78:b3:
- bf:96:fe:34:dc:bd:e7:52:56:e5:b3:e5:75:7b:d7:
- 41:91:05:dc:5d:69:e3:95:0d:43:b9:fc:83:96:39:
- 95:7b:6c:80:5a:4f:13:72:c6:d7:7d:29:7a:44:ba:
- 52:a4:2a:d5:41:46:09:20:fe:22:a0:b6:5b:30:8d:
- bc:89:0c:d5:d7:70:f8:87:52:fd:da:ef:ac:51:2e:
- 07:b3:4e:fe:d0:09:da:70:ef:98:fa:56:e6:6d:db:
- b5:57:4b:dc:e5:2c:25:15:c8:9e:2e:78:4e:f8:da:
- 9c:9e:86:2c:ca:57:f3:1a:e5:c8:92:8b:1a:82:96:
- 7a:c3:bc:50:12:69:d8:0e:5a:46:8b:3a:eb:26:fa:
- 23:c9:b6:b0:81:be:42:00:a4:f8:d6:fe:30:2e:c7:
- d2:46:f6:e5:8e:75:fd:f2:cc:b9:d0:87:5b:cc:06:
- 10:60:bb:83:35:b7:5e:67:de:47:ec:99:48:f1:a4:
- a1:15:fe:ad:8c:62:8e:39:55:4f:39:16:b9:b1:63:
- 9d:ff:b7
- Exponent: 65537 (0x10001)
- X509v3 extensions:
- X509v3 Basic Constraints: critical
- CA:TRUE
- X509v3 Subject Key Identifier:
- B6:A1:54:39:02:C3:A0:3F:8E:8A:BC:FA:D4:F8:1C:A6:D1:3A:0E:FD
- X509v3 Key Usage: critical
- Certificate Sign, CRL Sign
- Signature Algorithm: sha512WithRSAEncryption
- 71:a5:0e:ce:e4:e9:bf:3f:38:d5:89:5a:c4:02:61:fb:4c:c5:
- 14:17:2d:8b:4f:53:6b:10:17:fc:65:84:c7:10:49:90:de:db:
- c7:26:93:88:26:6f:70:d6:02:5e:39:a0:f7:8f:ab:96:b5:a5:
- 13:5c:81:14:6d:0e:81:82:11:1b:8a:4e:c6:4f:a5:dd:62:1e:
- 44:df:09:59:f4:5b:77:0b:37:e9:8b:20:c6:f8:0a:4e:2e:58:
- 1c:eb:33:d0:cf:86:60:c9:da:fb:80:2f:9e:4c:60:84:78:3d:
- 21:64:d6:fb:41:1f:18:0f:e7:c9:75:71:bd:bd:5c:de:34:87:
- 3e:41:b0:0e:f6:b9:d6:3f:09:13:96:14:2f:de:9a:1d:5a:b9:
- 56:ce:35:3a:b0:5f:70:4d:5e:e3:29:f1:23:28:72:59:b6:ab:
- c2:8c:66:26:1c:77:2c:26:76:35:8b:28:a7:69:a0:f9:3b:f5:
- 23:dd:85:10:74:c9:90:03:56:91:e7:af:ba:47:d4:12:97:11:
- 22:e3:a2:49:94:6c:e7:b7:94:4b:ba:2d:a4:da:33:8b:4c:a6:
- 44:ff:5a:3c:c6:1d:64:d8:b5:31:e4:a6:3c:7a:a8:57:0b:db:
- ed:61:1a:cb:f1:ce:73:77:63:a4:87:6f:4c:51:38:d6:e4:5f:
- c7:9f:b6:81:2a:e4:85:48:79:58:5e:3b:f8:db:02:82:67:c1:
- 39:db:c3:74:4b:3d:36:1e:f9:29:93:88:68:5b:a8:44:19:21:
- f0:a7:e8:81:0d:2c:e8:93:36:b4:37:b2:ca:b0:1b:26:7a:9a:
- 25:1f:9a:9a:80:9e:4b:2a:3f:fb:a3:9a:fe:73:32:71:c2:9e:
- c6:72:e1:8a:68:27:f1:e4:0f:b4:c4:4c:a5:61:93:f8:97:10:
- 07:2a:30:25:a9:b9:c8:71:b8:ef:68:cc:2d:7e:f5:e0:7e:0f:
- 82:a8:6f:b6:ba:6c:83:43:77:cd:8a:92:17:a1:9e:5b:78:16:
- 3d:45:e2:33:72:dd:e1:66:ca:99:d3:c9:c5:26:fd:0d:68:04:
- 46:ae:b6:d9:9b:8c:be:19:be:b1:c6:f2:19:e3:5c:02:ca:2c:
- d8:6f:4a:07:d9:c9:35:da:40:75:f2:c4:a7:19:6f:9e:42:10:
- 98:75:e6:95:8b:60:bc:ed:c5:12:d7:8a:ce:d5:98:5c:56:96:
- 03:c5:ee:77:06:35:ff:cf:e4:ee:3f:13:61:ee:db:da:2d:85:
- f0:cd:ae:9d:b2:18:09:45:c3:92:a1:72:17:fc:47:b6:a0:0b:
- 2c:f1:c4:de:43:68:08:6a:5f:3b:f0:76:63:fb:cc:06:2c:a6:
- c6:e2:0e:b5:b9:be:24:8f
------BEGIN CERTIFICATE-----
-MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCB
-gDELMAkGA1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMu
-QS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIG
-A1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMCIYDzIwMTExMDA2MDgz
-OTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UEChMZ
-VW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRp
-ZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3
-b3JrIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWA
-DGSdhhuWZGc/IjoedQF97/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn
-0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+oCgCXhVqqndwpyeI1B+twTUrWwbNWuKFB
-OJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40bRr5HMNUuctHFY9rnY3lE
-fktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2puTRZCr+E
-Sv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1m
-o130GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02i
-sx7QBlrd9pPPV3WZ9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOW
-OZV7bIBaTxNyxtd9KXpEulKkKtVBRgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgez
-Tv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pyehizKV/Ma5ciSixqClnrDvFAS
-adgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vMBhBgu4M1t15n
-3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
-AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMC
-AQYwDQYJKoZIhvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQ
-F/xlhMcQSZDe28cmk4gmb3DWAl45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTf
-CVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuAL55MYIR4PSFk1vtBHxgP58l1cb29
-XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMoclm2q8KMZiYcdywm
-djWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tMpkT/
-WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jb
-AoJnwTnbw3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksq
-P/ujmv5zMnHCnsZy4YpoJ/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Ko
-b7a6bINDd82Kkhehnlt4Fj1F4jNy3eFmypnTycUm/Q1oBEauttmbjL4ZvrHG8hnj
-XALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLXis7VmFxWlgPF7ncGNf/P
-5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7zAYspsbi
-DrW5viSP
------END CERTIFICATE-----
-
# f356bea244b7a91eb35d53ca9ad7864ace018e2d35d5f8f96ddf68a6f41aa474
Certificate:
Data:
@@ -10565,4 +10441,442 @@
Ao9QAwKxuDdollDruF/UKIqlIgyKhPBZLtU30WHlQnNYKoH3dtvi4k0NX/a3vgW0
rk4N3hY9A4GzJl5LuEsAz/+MF7psYC0nhzck5npgL7XTgwSqT0N1osGDsieYK7EO
gLrAhV5Cud+xYJHT6xh+cHiudoO+cVrQkOPKwRYlZ0rwtnu64ZzZ
+-----END CERTIFICATE-----
+
+# 0552e6f83fdf65e8fa9670e666df28a4e21340b510cbe52566f97c4fb94b2bd1
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number:
+ 73:3b:30:04:48:5b:d9:4d:78:2e:73:4b:c9:a1:dc:66
+ Signature Algorithm: sha512WithRSAEncryption
+ Issuer: C=DE, O=D-Trust GmbH, CN=D-TRUST BR Root CA 2 2023
+ Validity
+ Not Before: May 9 08:56:31 2023 GMT
+ Not After : May 9 08:56:30 2038 GMT
+ Subject: C=DE, O=D-Trust GmbH, CN=D-TRUST BR Root CA 2 2023
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (4096 bit)
+ Modulus:
+ 00:ae:ff:09:59:91:80:0a:4a:68:e6:24:3f:b8:a7:
+ e4:c8:3a:0a:3a:16:cd:c9:23:61:a0:93:71:f2:ab:
+ 8b:73:8f:a0:67:65:60:d2:54:6b:63:51:6f:49:33:
+ e0:72:07:13:7d:38:cd:06:92:07:29:52:6b:4e:77:
+ 6c:04:d3:95:fa:dd:4c:8c:d9:5d:c1:61:7d:4b:e7:
+ 28:b3:44:81:7b:51:af:dd:33:b1:68:7c:d6:4e:4c:
+ fe:2b:68:b9:ca:66:69:c4:ec:5e:57:7f:f7:0d:c7:
+ 9c:36:36:e5:07:60:ac:c0:4c:ea:08:6c:ef:06:7c:
+ 4f:5b:28:7a:08:fc:93:5d:9b:f6:9c:b4:8b:86:ba:
+ 21:b9:f4:f0:e8:59:5a:28:a1:34:84:1a:25:91:b6:
+ b5:8f:ef:b2:f9:80:fa:f9:3d:3c:11:72:d8:e3:2f:
+ 86:76:c5:79:2c:c1:a9:90:93:46:98:67:cb:83:6a:
+ a0:50:23:a7:3b:f6:81:39:e0:ed:f0:b9:bf:65:f1:
+ d8:cb:7a:fb:ef:73:03:ce:00:f4:7d:d7:e0:5d:3b:
+ 66:b8:dc:8e:ba:83:cb:87:76:03:fc:25:d9:e7:23:
+ 6f:06:fd:67:f3:e0:ff:84:bc:47:bf:b5:16:18:46:
+ 69:14:cc:05:f7:db:d3:49:ac:6b:cc:ab:e4:b5:0b:
+ 43:24:5e:4b:6b:4d:67:df:d6:b5:3e:4f:78:1f:94:
+ 71:24:ea:de:70:fc:f1:93:fe:9e:93:5a:e4:94:5a:
+ 97:54:0c:35:7b:5f:6c:ee:00:1f:24:ec:03:ba:02:
+ f5:76:f4:9f:d4:9a:ed:85:2c:38:22:2f:c7:d8:2f:
+ 76:11:4f:fd:6c:5c:e8:f5:8e:27:87:7f:19:4a:21:
+ 47:90:1d:79:8d:1c:5b:f8:cf:4a:85:e4:ed:b3:5b:
+ 8d:be:c4:64:28:5d:41:c4:6e:ac:38:5a:4f:23:74:
+ 74:a9:12:c3:f6:d2:b9:11:15:33:07:91:d8:3b:37:
+ 3a:63:30:06:d1:c5:22:36:28:62:23:10:e0:46:cc:
+ 97:ac:d6:2b:5d:64:24:d5:ee:1c:0e:de:fb:08:5a:
+ 75:2a:f6:63:6d:ce:0b:42:be:d1:ba:70:1c:9c:21:
+ e5:0f:31:69:17:d7:fc:0a:b4:de:ed:80:9c:cb:92:
+ b4:8b:f5:de:59:a2:58:09:a5:63:47:0b:e1:41:32:
+ 34:41:d9:9a:b1:d9:a8:b0:1b:5a:de:0d:0d:f4:e2:
+ b2:5d:35:80:b9:81:d4:84:69:91:02:cb:75:d0:8d:
+ c5:b5:3d:09:91:09:8f:14:a1:14:74:79:3e:d6:c9:
+ 15:1d:a4:59:59:22:dc:f6:8a:45:3d:3c:12:d6:3e:
+ 5d:32:2f
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Basic Constraints: critical
+ CA:TRUE
+ X509v3 Subject Key Identifier:
+ 67:90:F0:D6:DE:B5:18:D5:46:29:7E:5C:AB:F8:9E:08:BC:64:95:10
+ X509v3 Key Usage: critical
+ Certificate Sign, CRL Sign
+ X509v3 CRL Distribution Points:
+ Full Name:
+ URI:http://crl.d-trust.net/crl/d-trust_br_root_ca_2_2023.crl
+
+ Signature Algorithm: sha512WithRSAEncryption
+ Signature Value:
+ 34:f7:b3:77:53:db:30:16:b9:2d:a5:21:f1:40:21:75:eb:eb:
+ 48:16:81:3d:73:e0:9e:27:2a:eb:77:a9:13:a4:6a:0a:5a:5a:
+ 14:33:3d:68:1f:81:ae:69:fd:8c:9f:65:6c:34:42:d9:2d:d0:
+ 7f:78:16:b1:3a:ac:23:31:ad:5e:7f:ae:e7:ae:2b:fa:ba:fc:
+ 3c:97:95:40:93:5f:c3:2d:03:a3:ed:a4:6f:53:d7:fa:40:0e:
+ 30:f5:00:20:2c:00:4c:8c:3b:b4:a3:1f:b6:bf:91:32:ab:af:
+ 92:98:d3:16:e6:d4:d1:54:5c:43:5b:2e:ae:ef:57:2a:a8:b4:
+ 6f:a4:ef:0d:56:14:da:21:ab:20:76:9e:03:fc:26:b8:9e:3f:
+ 3e:03:26:e6:4c:db:9d:5f:42:84:3d:45:03:03:1c:59:88:ca:
+ dc:2e:61:24:5a:a4:ea:27:0b:73:12:be:52:b3:0a:cf:32:17:
+ e2:1e:87:1a:16:95:48:6d:5a:e0:d0:cf:09:92:26:66:91:d8:
+ a3:61:0e:aa:81:81:7f:e8:52:82:d1:42:e7:e0:1d:18:fa:a4:
+ 85:36:e7:86:e0:0d:eb:bc:d4:c9:d6:3c:43:f1:5d:49:6e:7e:
+ 81:9b:69:b5:89:62:8f:88:52:d8:d7:fe:27:c1:23:c5:cb:2b:
+ 02:bb:b1:5f:fe:fb:43:85:03:46:be:5d:c6:ca:21:26:ff:d7:
+ 02:9e:74:4a:dc:f8:13:15:b1:81:57:36:cb:65:5c:d1:1d:31:
+ 77:e9:25:c3:c3:b2:32:37:d5:f1:98:09:e4:6d:63:80:08:ab:
+ 06:92:81:d4:e9:70:8f:a7:3f:b2:ed:86:8c:82:6a:35:c8:42:
+ 5a:82:d1:52:1a:45:0f:15:a5:00:f0:94:7b:65:27:57:39:43:
+ cf:7c:7f:e6:bd:35:b3:7b:f1:19:4c:de:3a:96:cf:e9:76:ee:
+ 03:e7:c2:43:52:3c:6a:81:e8:c1:5a:80:bd:11:5d:93:6b:fb:
+ c7:e6:64:3f:bb:69:1c:e9:dd:25:8b:af:74:c9:54:40:ca:cb:
+ 93:13:0a:ed:fb:66:92:11:ca:f5:c0:fa:d8:83:55:03:7c:d3:
+ c5:22:46:75:70:6b:79:48:06:2a:82:9a:bf:e6:eb:16:0e:22:
+ 45:01:bc:dd:36:94:34:a9:35:26:8a:d7:97:b9:ee:08:72:bf:
+ 34:92:70:83:80:ab:38:aa:59:68:dd:40:a4:18:90:b2:f3:d5:
+ 03:ca:26:ca:ef:d5:c7:e0:8f:53:8e:f0:00:e3:a8:ed:9f:f9:
+ ad:77:e0:2b:63:4f:9e:c3:ee:37:bb:78:09:84:9e:b9:6e:fb:
+ 29:99:90:e8:80:d3:9f:24
+-----BEGIN CERTIFICATE-----
+MIIFqTCCA5GgAwIBAgIQczswBEhb2U14LnNLyaHcZjANBgkqhkiG9w0BAQ0FADBI
+MQswCQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlE
+LVRSVVNUIEJSIFJvb3QgQ0EgMiAyMDIzMB4XDTIzMDUwOTA4NTYzMVoXDTM4MDUw
+OTA4NTYzMFowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEi
+MCAGA1UEAxMZRC1UUlVTVCBCUiBSb290IENBIDIgMjAyMzCCAiIwDQYJKoZIhvcN
+AQEBBQADggIPADCCAgoCggIBAK7/CVmRgApKaOYkP7in5Mg6CjoWzckjYaCTcfKr
+i3OPoGdlYNJUa2NRb0kz4HIHE304zQaSBylSa053bATTlfrdTIzZXcFhfUvnKLNE
+gXtRr90zsWh81k5M/itoucpmacTsXld/9w3HnDY25QdgrMBM6ghs7wZ8T1soegj8
+k12b9py0i4a6Ibn08OhZWiihNIQaJZG2tY/vsvmA+vk9PBFy2OMvhnbFeSzBqZCT
+Rphny4NqoFAjpzv2gTng7fC5v2Xx2Mt6++9zA84A9H3X4F07ZrjcjrqDy4d2A/wl
+2ecjbwb9Z/Pg/4S8R7+1FhhGaRTMBffb00msa8yr5LULQyReS2tNZ9/WtT5PeB+U
+cSTq3nD88ZP+npNa5JRal1QMNXtfbO4AHyTsA7oC9Xb0n9Sa7YUsOCIvx9gvdhFP
+/Wxc6PWOJ4d/GUohR5AdeY0cW/jPSoXk7bNbjb7EZChdQcRurDhaTyN0dKkSw/bS
+uREVMweR2Ds3OmMwBtHFIjYoYiMQ4EbMl6zWK11kJNXuHA7e+whadSr2Y23OC0K+
+0bpwHJwh5Q8xaRfX/Aq03u2AnMuStIv13lmiWAmlY0cL4UEyNEHZmrHZqLAbWt4N
+DfTisl01gLmB1IRpkQLLddCNxbU9CZEJjxShFHR5PtbJFR2kWVki3PaKRT08EtY+
+XTIvAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUZ5Dw1t61
+GNVGKX5cq/ieCLxklRAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRCMEAwPqA8oDqG
+OGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfYnJfcm9vdF9jYV8y
+XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQA097N3U9swFrktpSHxQCF16+tI
+FoE9c+CeJyrrd6kTpGoKWloUMz1oH4Guaf2Mn2VsNELZLdB/eBaxOqwjMa1ef67n
+riv6uvw8l5VAk1/DLQOj7aRvU9f6QA4w9QAgLABMjDu0ox+2v5Eyq6+SmNMW5tTR
+VFxDWy6u71cqqLRvpO8NVhTaIasgdp4D/Ca4nj8+AybmTNudX0KEPUUDAxxZiMrc
+LmEkWqTqJwtzEr5SswrPMhfiHocaFpVIbVrg0M8JkiZmkdijYQ6qgYF/6FKC0ULn
+4B0Y+qSFNueG4A3rvNTJ1jxD8V1Jbn6Bm2m1iWKPiFLY1/4nwSPFyysCu7Ff/vtD
+hQNGvl3GyiEm/9cCnnRK3PgTFbGBVzbLZVzRHTF36SXDw7IyN9XxmAnkbWOACKsG
+koHU6XCPpz+y7YaMgmo1yEJagtFSGkUPFaUA8JR7ZSdXOUPPfH/mvTWze/EZTN46
+ls/pdu4D58JDUjxqgejBWoC9EV2Ta/vH5mQ/u2kc6d0li690yVRAysuTEwrt+2aS
+Ecr1wPrYg1UDfNPFIkZ1cGt5SAYqgpq/5usWDiJFAbzdNpQ0qTUmiteXue4Icr80
+knCDgKs4qllo3UCkGJCy89UDyibK79XH4I9TjvAA46jtn/mtd+ArY0+ew+43u3gJ
+hJ65bvspmZDogNOfJA==
+-----END CERTIFICATE-----
+
+# 8e8221b2e7d4007836a1672f0dcc299c33bc07d316f132fa1a206d587150f1ce
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number:
+ 69:26:09:7e:80:4b:4c:a0:a7:8c:78:62:53:5f:5a:6f
+ Signature Algorithm: sha512WithRSAEncryption
+ Issuer: C=DE, O=D-Trust GmbH, CN=D-TRUST EV Root CA 2 2023
+ Validity
+ Not Before: May 9 09:10:33 2023 GMT
+ Not After : May 9 09:10:32 2038 GMT
+ Subject: C=DE, O=D-Trust GmbH, CN=D-TRUST EV Root CA 2 2023
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (4096 bit)
+ Modulus:
+ 00:d8:8e:a3:89:80:0b:b2:57:52:dc:a9:53:4c:37:
+ b9:7f:63:17:13:ef:a7:5b:23:5b:69:75:b0:99:0a:
+ 17:c1:8b:c4:db:a8:e0:cc:31:ba:c2:f2:cd:5d:e9:
+ b7:f8:1d:af:6a:c4:95:87:d7:47:c9:95:d8:82:04:
+ 50:3d:81:08:ff:e4:3d:b3:b1:d6:c5:b2:fd:88:09:
+ db:9c:84:ec:25:17:14:87:7f:30:78:9b:6a:58:c9:
+ b6:73:28:3c:34:f7:99:f7:7f:d3:a6:f8:1c:45:7c:
+ ad:2c:8c:94:3f:d8:67:10:53:7e:22:cd:4e:25:51:
+ f0:25:24:35:11:5e:10:c6:ec:87:66:89:81:68:ba:
+ cc:2b:9d:47:73:1f:bd:cd:91:a4:72:6a:9c:a2:1b:
+ 18:a0:6f:ec:50:f4:7d:40:c2:a8:30:cf:bd:73:c8:
+ 13:2b:10:13:1e:8b:9a:a8:3a:94:73:d3:18:69:0a:
+ 4a:ff:c1:01:03:ff:79:7f:b5:48:7f:7b:ee:e8:29:
+ 6f:36:4c:95:61:86:d8:f9:a2:73:8a:ee:ae:2f:96:
+ ee:68:cd:3d:4d:28:42:f9:45:2b:32:1b:46:55:16:
+ 6a:a6:4b:29:f9:bb:95:56:bf:46:1d:ec:1d:93:1d:
+ c0:65:b2:1f:a1:43:ae:56:9e:a0:b1:8f:6b:12:b7:
+ 60:6d:78:0b:ca:8a:5c:ed:1e:96:0e:83:a6:48:95:
+ 8d:3b:a3:21:c4:ae:58:c6:00:b2:84:b4:23:a4:96:
+ 86:35:b8:d8:9e:d8:ac:34:49:98:63:95:c5:cb:6d:
+ 48:47:e2:f2:2e:18:1e:d0:31:ab:dd:74:ec:f9:dc:
+ 8c:b8:1c:8e:68:23:ba:d0:f3:50:dc:cf:65:8f:73:
+ 3a:32:c7:7c:fe:ca:82:22:4f:be:8e:62:47:66:e5:
+ cd:87:e2:e8:d5:0f:18:9f:e5:04:72:4b:46:3c:10:
+ f2:44:c2:64:56:71:4e:75:e8:9c:c9:26:74:c5:7d:
+ 59:d1:0a:5b:0f:6d:fe:9e:75:1c:18:c6:1a:3a:7c:
+ d8:0d:04:cc:cd:b7:45:65:7a:b1:8f:b8:ae:84:48:
+ 3e:b3:7a:4d:a8:03:e2:e2:7e:01:16:59:68:18:43:
+ 33:b0:d2:dc:b0:1a:43:35:ee:a5:da:a9:46:5c:ae:
+ 86:81:41:01:4a:74:26:ec:9f:06:bf:c2:05:37:64:
+ 75:78:29:68:fd:c5:f5:eb:fe:47:f9:e4:85:b0:e1:
+ 7b:31:9d:a6:7f:72:a3:b9:c4:2c:2e:cc:99:57:0e:
+ 21:0c:45:01:94:65:eb:65:09:c6:63:22:0b:33:49:
+ 92:48:3c:fc:cd:ce:b0:3e:8e:9e:8b:f8:fe:49:c5:
+ 35:72:47
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Basic Constraints: critical
+ CA:TRUE
+ X509v3 Subject Key Identifier:
+ AA:FC:91:10:1B:87:91:5F:16:B9:BF:4F:4B:91:5E:00:1C:B1:32:80
+ X509v3 Key Usage: critical
+ Certificate Sign, CRL Sign
+ X509v3 CRL Distribution Points:
+ Full Name:
+ URI:http://crl.d-trust.net/crl/d-trust_ev_root_ca_2_2023.crl
+
+ Signature Algorithm: sha512WithRSAEncryption
+ Signature Value:
+ 93:cb:a5:1f:99:11:ec:9a:0d:5f:2c:15:93:c6:3f:be:10:8d:
+ 78:42:f0:6e:90:47:47:8e:a3:92:32:8d:70:8f:f6:5b:8d:be:
+ 89:ce:47:01:6a:1b:20:20:89:5b:c8:82:10:6c:e0:e7:99:aa:
+ 6b:c6:2a:a0:63:35:91:6a:85:25:ad:17:38:a5:9b:7e:50:f2:
+ 76:ea:85:05:2a:27:41:2b:b1:81:d1:a2:f6:40:75:a9:0e:cb:
+ f1:55:48:d8:ec:d1:ec:b3:e8:ce:14:a1:35:ec:c2:5e:35:1a:
+ ab:a6:16:01:06:8e:ea:dc:2f:a3:8a:ca:2c:91:eb:52:8e:5f:
+ 0c:9b:17:cf:cb:73:07:19:c4:6a:c2:73:54:ef:7c:43:52:63:
+ c1:11:ca:c2:45:b1:f4:3b:53:f5:69:ae:3c:e3:a5:de:ac:e8:
+ 54:b7:b2:91:fd:ac:a9:1f:f2:87:e4:17:c6:49:a8:7c:d8:0a:
+ 41:f4:f2:3e:e7:77:34:04:52:dd:e8:81:f2:4d:2f:54:45:9d:
+ 15:e1:4f:cc:e5:de:34:57:10:c9:23:72:17:70:8d:50:70:1f:
+ 56:6c:cc:b9:ff:3a:5a:4f:63:7a:c3:6e:65:07:1d:84:a1:ff:
+ a9:0c:63:89:6d:b2:40:88:39:d7:1f:77:68:b5:fc:9c:d5:d6:
+ 67:69:5b:a8:74:db:fc:89:f6:1b:32:f7:a4:24:a6:76:b7:47:
+ 53:ef:8d:49:8f:a9:b6:83:5a:a5:96:90:45:61:f5:de:03:4f:
+ 26:0f:a8:8b:f0:03:96:b0:ac:15:d0:71:5a:6a:7b:94:e6:70:
+ 93:da:f1:69:e0:b2:62:4d:9e:8f:ff:89:9d:9b:5d:cd:45:e9:
+ 94:02:22:8d:e0:35:7f:e8:f1:04:79:71:6c:54:83:f8:33:b9:
+ 05:32:1b:58:55:11:4f:d0:e5:27:47:71:ec:ed:da:67:d6:62:
+ a6:4b:4d:0f:69:a2:c9:bc:ec:22:4b:94:c7:68:94:17:7e:e2:
+ 8e:28:3e:b6:c6:ea:f5:34:6c:9f:37:88:07:38:db:86:71:fa:
+ cd:95:48:43:6e:a3:4f:82:87:d7:34:98:6e:4b:93:79:60:75:
+ 69:0f:f0:1a:d5:53:fa:21:0c:c2:3f:e9:3f:1f:18:8c:92:5d:
+ 78:a7:76:67:19:bb:b2:ea:7f:e9:70:09:56:56:a3:b0:0c:0b:
+ 2d:36:5e:c5:e9:c4:d5:83:cb:86:17:97:2c:6c:13:6f:87:5a:
+ af:49:a6:1d:db:cd:38:04:2e:5f:e2:4a:35:0e:2d:4b:f8:a2:
+ 24:04:8d:d8:e1:63:5e:02:92:34:da:98:61:5c:1c:6f:58:76:
+ 64:b3:fc:02:b8:f5:9d:0a
+-----BEGIN CERTIFICATE-----
+MIIFqTCCA5GgAwIBAgIQaSYJfoBLTKCnjHhiU19abzANBgkqhkiG9w0BAQ0FADBI
+MQswCQYDVQQGEwJERTEVMBMGA1UEChMMRC1UcnVzdCBHbWJIMSIwIAYDVQQDExlE
+LVRSVVNUIEVWIFJvb3QgQ0EgMiAyMDIzMB4XDTIzMDUwOTA5MTAzM1oXDTM4MDUw
+OTA5MTAzMlowSDELMAkGA1UEBhMCREUxFTATBgNVBAoTDEQtVHJ1c3QgR21iSDEi
+MCAGA1UEAxMZRC1UUlVTVCBFViBSb290IENBIDIgMjAyMzCCAiIwDQYJKoZIhvcN
+AQEBBQADggIPADCCAgoCggIBANiOo4mAC7JXUtypU0w3uX9jFxPvp1sjW2l1sJkK
+F8GLxNuo4MwxusLyzV3pt/gdr2rElYfXR8mV2IIEUD2BCP/kPbOx1sWy/YgJ25yE
+7CUXFId/MHibaljJtnMoPDT3mfd/06b4HEV8rSyMlD/YZxBTfiLNTiVR8CUkNRFe
+EMbsh2aJgWi6zCudR3Mfvc2RpHJqnKIbGKBv7FD0fUDCqDDPvXPIEysQEx6Lmqg6
+lHPTGGkKSv/BAQP/eX+1SH977ugpbzZMlWGG2Pmic4ruri+W7mjNPU0oQvlFKzIb
+RlUWaqZLKfm7lVa/Rh3sHZMdwGWyH6FDrlaeoLGPaxK3YG14C8qKXO0elg6DpkiV
+jTujIcSuWMYAsoS0I6SWhjW42J7YrDRJmGOVxcttSEfi8i4YHtAxq9107PncjLgc
+jmgjutDzUNzPZY9zOjLHfP7KgiJPvo5iR2blzYfi6NUPGJ/lBHJLRjwQ8kTCZFZx
+TnXonMkmdMV9WdEKWw9t/p51HBjGGjp82A0EzM23RWV6sY+4roRIPrN6TagD4uJ+
+ARZZaBhDM7DS3LAaQzXupdqpRlyuhoFBAUp0JuyfBr/CBTdkdXgpaP3F9ev+R/nk
+hbDhezGdpn9yo7nELC7MmVcOIQxFAZRl62UJxmMiCzNJkkg8/M3OsD6Onov4/knF
+NXJHAgMBAAGjgY4wgYswDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqvyREBuH
+kV8Wub9PS5FeAByxMoAwDgYDVR0PAQH/BAQDAgEGMEkGA1UdHwRCMEAwPqA8oDqG
+OGh0dHA6Ly9jcmwuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3RfZXZfcm9vdF9jYV8y
+XzIwMjMuY3JsMA0GCSqGSIb3DQEBDQUAA4ICAQCTy6UfmRHsmg1fLBWTxj++EI14
+QvBukEdHjqOSMo1wj/Zbjb6JzkcBahsgIIlbyIIQbODnmaprxiqgYzWRaoUlrRc4
+pZt+UPJ26oUFKidBK7GB0aL2QHWpDsvxVUjY7NHss+jOFKE17MJeNRqrphYBBo7q
+3C+jisosketSjl8MmxfPy3MHGcRqwnNU73xDUmPBEcrCRbH0O1P1aa4846XerOhU
+t7KR/aypH/KH5BfGSah82ApB9PI+53c0BFLd6IHyTS9URZ0V4U/M5d40VxDJI3IX
+cI1QcB9WbMy5/zpaT2N6w25lBx2Eof+pDGOJbbJAiDnXH3dotfyc1dZnaVuodNv8
+ifYbMvekJKZ2t0dT741Jj6m2g1qllpBFYfXeA08mD6iL8AOWsKwV0HFaanuU5nCT
+2vFp4LJiTZ6P/4mdm13NRemUAiKN4DV/6PEEeXFsVIP4M7kFMhtYVRFP0OUnR3Hs
+7dpn1mKmS00PaaLJvOwiS5THaJQXfuKOKD62xur1NGyfN4gHONuGcfrNlUhDbqNP
+gofXNJhuS5N5YHVpD/Aa1VP6IQzCP+k/HxiMkl14p3ZnGbuy6n/pcAlWVqOwDAst
+Nl7F6cTVg8uGF5csbBNvh1qvSaYd2804BC5f4ko1Di1L+KIkBI3Y4WNeApI02phh
+XBxvWHZks/wCuPWdCg==
+-----END CERTIFICATE-----
+
+# 578af4ded0853f4e5998db4aeaf9cbea8d945f60b620a38d1a3c13b2bc7ba8e1
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number:
+ 36:3a:96:8c:c9:5c:b2:58:cd:d0:01:5d:c5:e5:57:00
+ Signature Algorithm: ecdsa-with-SHA384
+ Issuer: C=DE, O=Deutsche Telekom Security GmbH, CN=Telekom Security TLS ECC Root 2020
+ Validity
+ Not Before: Aug 25 07:48:20 2020 GMT
+ Not After : Aug 25 23:59:59 2045 GMT
+ Subject: C=DE, O=Deutsche Telekom Security GmbH, CN=Telekom Security TLS ECC Root 2020
+ Subject Public Key Info:
+ Public Key Algorithm: id-ecPublicKey
+ Public-Key: (384 bit)
+ pub:
+ 04:ce:bf:fe:57:a8:bf:d5:aa:f7:10:9a:cd:bc:d1:
+ 11:a2:bd:67:42:cc:90:eb:15:18:90:d9:a2:cd:0c:
+ 2a:25:eb:3e:4f:ce:b5:d2:8f:0f:f3:35:da:43:8b:
+ 02:80:be:6f:51:24:1d:0f:6b:2b:ca:9f:c2:6f:50:
+ 32:e5:37:20:b6:20:ff:88:0d:0f:6d:49:bb:db:06:
+ a4:87:90:92:94:f4:09:d0:cf:7f:c8:80:0b:c1:97:
+ b3:bb:35:27:c9:c2:1b
+ ASN1 OID: secp384r1
+ NIST CURVE: P-384
+ X509v3 extensions:
+ X509v3 Subject Key Identifier:
+ E3:72:CC:6E:95:99:47:B1:E6:B3:61:4C:D1:CB:AB:E3:BA:CD:DE:9F
+ X509v3 Basic Constraints: critical
+ CA:TRUE
+ X509v3 Key Usage: critical
+ Certificate Sign, CRL Sign
+ Signature Algorithm: ecdsa-with-SHA384
+ Signature Value:
+ 30:64:02:30:75:52:8b:b7:a4:10:4f:ae:4a:10:8b:b2:84:5b:
+ 42:e1:e6:2a:36:02:da:a0:6e:19:3f:25:bf:da:59:32:8e:e4:
+ fb:90:dc:93:64:ce:ad:b4:41:47:60:e2:cf:a7:cb:1e:02:30:
+ 37:41:8c:66:df:41:6b:d6:83:00:41:fd:2f:5a:f7:50:b4:67:
+ d1:2c:a8:71:d7:43:ca:9c:27:24:91:83:48:0d:cf:cd:f7:54:
+ 81:af:ec:7f:e4:67:db:b8:90:ee:dd:25
+-----BEGIN CERTIFICATE-----
+MIICQjCCAcmgAwIBAgIQNjqWjMlcsljN0AFdxeVXADAKBggqhkjOPQQDAzBjMQsw
+CQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0eSBH
+bWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBFQ0MgUm9vdCAyMDIw
+MB4XDTIwMDgyNTA3NDgyMFoXDTQ1MDgyNTIzNTk1OVowYzELMAkGA1UEBhMCREUx
+JzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkGA1UE
+AwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgRUNDIFJvb3QgMjAyMDB2MBAGByqGSM49
+AgEGBSuBBAAiA2IABM6//leov9Wq9xCazbzREaK9Z0LMkOsVGJDZos0MKiXrPk/O
+tdKPD/M12kOLAoC+b1EkHQ9rK8qfwm9QMuU3ILYg/4gND21Ju9sGpIeQkpT0CdDP
+f8iAC8GXs7s1J8nCG6NCMEAwHQYDVR0OBBYEFONyzG6VmUex5rNhTNHLq+O6zd6f
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cA
+MGQCMHVSi7ekEE+uShCLsoRbQuHmKjYC2qBuGT8lv9pZMo7k+5Dck2TOrbRBR2Di
+z6fLHgIwN0GMZt9Ba9aDAEH9L1r3ULRn0SyocddDypwnJJGDSA3PzfdUga/sf+Rn
+27iQ7t0l
+-----END CERTIFICATE-----
+
+# efc65cadbb59adb6efe84da22311b35624b71b3b1ea0da8b6655174ec8978646
+Certificate:
+ Data:
+ Version: 3 (0x2)
+ Serial Number:
+ 21:9c:54:2d:e8:f6:ec:71:77:fa:4e:e8:c3:70:57:97
+ Signature Algorithm: sha384WithRSAEncryption
+ Issuer: C=DE, O=Deutsche Telekom Security GmbH, CN=Telekom Security TLS RSA Root 2023
+ Validity
+ Not Before: Mar 28 12:16:45 2023 GMT
+ Not After : Mar 27 23:59:59 2048 GMT
+ Subject: C=DE, O=Deutsche Telekom Security GmbH, CN=Telekom Security TLS RSA Root 2023
+ Subject Public Key Info:
+ Public Key Algorithm: rsaEncryption
+ Public-Key: (4096 bit)
+ Modulus:
+ 00:ed:35:a1:81:80:f3:cb:4a:69:5b:c2:fb:51:83:
+ ae:26:fd:e1:6e:f3:81:12:7d:71:40:ff:87:75:42:
+ 29:21:ed:81:52:2c:df:12:c1:19:84:89:c1:bd:c5:
+ 28:d5:d5:4b:6c:44:d6:4c:db:07:96:4a:55:7a:ca:
+ 36:82:04:36:a8:a5:fc:27:f6:49:f1:d5:72:9e:91:
+ f9:23:d6:70:7b:bb:f5:9b:c1:ec:93:cf:19:ea:65:
+ 7e:88:70:a0:73:fc:f6:ff:b5:56:62:e1:73:6a:34:
+ 98:3e:82:b8:ac:95:53:f4:01:a0:27:07:72:a3:00:
+ 53:a0:e4:b2:ab:83:38:57:33:25:94:9f:be:48:1d:
+ 98:e1:a3:ba:9e:5c:cd:04:71:51:7d:75:78:ab:f3:
+ 59:aa:c4:e0:60:be:8f:83:52:b8:75:1a:41:35:ed:
+ bc:f3:3a:63:e9:a9:14:45:d7:e6:52:d1:6e:d2:de:
+ bc:e3:f5:0b:3b:e6:e0:c4:bd:43:64:13:a6:ce:f4:
+ 98:37:6c:8a:95:a8:97:c8:47:0f:f0:5e:10:8b:e7:
+ 1d:1c:fe:b1:3b:a0:05:33:68:05:41:82:c1:03:2b:
+ 01:c8:e7:8f:4d:ab:e8:b5:f6:cd:6b:44:b5:e7:dd:
+ 8b:ec:ea:25:b4:00:22:57:4d:b0:b1:b2:31:c1:16:
+ ce:ff:fd:14:84:b7:47:fa:b2:f1:70:de:db:8b:6c:
+ 36:58:a4:7c:b3:11:d1:c3:77:7f:5f:b6:25:e0:0d:
+ c5:d2:b3:f9:b8:b8:77:db:37:71:71:47:e3:60:18:
+ 4f:24:b6:75:37:78:b9:a3:62:af:bd:c9:72:8e:2f:
+ cc:bb:ae:db:e4:15:52:19:07:33:fb:6a:b7:2d:4b:
+ 90:28:82:73:fe:18:8b:35:8d:db:a7:04:6a:be:ea:
+ c1:4d:36:3b:16:36:91:32:ef:b6:40:89:91:43:e0:
+ f2:a2:ab:04:2e:e6:f2:4c:0e:16:34:20:ac:87:c1:
+ 2d:7e:c9:66:47:17:14:11:a4:f3:f7:a1:24:89:ab:
+ d8:1a:c8:a1:5c:b1:a3:f7:8c:6d:c8:01:c9:4f:c9:
+ ec:c4:fc:ac:51:33:d1:c8:83:d1:c9:9f:1d:d4:47:
+ 34:29:3e:cb:b0:0e:fa:83:0b:28:58:e5:29:dc:3f:
+ 7c:a8:9f:c9:b6:0a:bb:a6:e8:46:16:0f:96:e5:7b:
+ e4:6a:7a:48:6d:76:98:05:a5:dc:6d:1e:42:1e:42:
+ da:1a:e0:52:f7:b5:83:c0:1a:7b:78:35:2c:38:f5:
+ 1f:fd:49:a3:2e:d2:59:63:bf:80:b0:8c:93:73:cb:
+ 35:a6:99:95:22:61:65:03:60:fb:2f:93:4b:fa:9a:
+ 9c:80:3b
+ Exponent: 65537 (0x10001)
+ X509v3 extensions:
+ X509v3 Key Usage: critical
+ Certificate Sign, CRL Sign
+ X509v3 Subject Key Identifier:
+ B6:A7:97:82:3D:74:85:9B:F7:3C:9F:93:9A:95:79:75:52:8C:6D:47
+ X509v3 Basic Constraints: critical
+ CA:TRUE
+ X509v3 Authority Key Identifier:
+ B6:A7:97:82:3D:74:85:9B:F7:3C:9F:93:9A:95:79:75:52:8C:6D:47
+ Signature Algorithm: sha384WithRSAEncryption
+ Signature Value:
+ a8:cc:61:a6:be:75:9e:15:50:a4:6b:fb:a8:70:45:7c:ba:7e:
+ b1:5a:fc:5b:23:fa:0a:77:f8:98:71:82:0c:6d:e0:5e:46:aa:
+ 93:f4:1e:a0:c3:e1:93:db:4b:ad:b2:a6:5d:ab:b0:d4:62:cb:
+ 5e:bb:66:f5:2d:ee:97:40:3c:62:eb:5e:d6:14:d6:8c:e2:96:
+ 8b:41:69:93:35:e6:b9:99:6b:62:b4:a1:17:66:34:a6:6b:63:
+ c6:b9:4e:f2:22:e9:58:0d:56:41:d1:fa:0c:4a:f0:33:cd:3b:
+ bb:6d:21:3a:ae:8e:72:b5:c3:4a:fb:e9:7d:e5:b1:9b:86:ee:
+ e2:e0:7d:b4:f7:32:fd:22:84:f1:85:c9:37:79:e9:b5:3f:bf:
+ 5c:e4:74:b2:8f:11:62:00:dd:18:66:a1:d9:7b:23:5f:f1:8e:
+ d5:67:e8:54:da:5b:3a:6b:36:6f:f9:81:b1:33:47:33:77:40:
+ f9:52:aa:dd:d4:83:cf:85:78:99:9a:93:b9:73:67:42:46:11:
+ 21:ea:fe:0a:a9:1b:1a:65:69:b3:8f:ae:16:b6:f6:4b:56:b2:
+ 2d:f9:a5:c8:ec:3b:62:a3:ed:6b:d0:4e:d5:40:09:a4:1f:98:
+ d7:3a:a5:92:59:20:e4:b0:7d:cd:5b:73:68:bd:6d:c4:a2:13:
+ 0e:67:19:b8:8d:42:7e:6c:0c:9a:6e:a0:24:2d:d5:45:1b:dc:
+ c4:02:14:fe:85:5b:65:97:ca:4e:90:50:08:7a:42:35:f9:ea:
+ c2:66:d4:f8:01:ae:1e:b4:be:c3:a8:ef:fe:76:9a:a2:a6:1f:
+ 46:f6:84:ed:fc:db:ce:c4:02:ce:77:48:2c:8c:b2:ec:c3:00:
+ a3:ec:2c:55:18:c1:7e:19:ee:e1:2f:f2:ad:83:9b:9e:ab:19:
+ df:c6:8a:2f:8c:77:e5:b7:05:ec:3b:c1:ec:be:86:b3:86:bc:
+ c0:f7:dc:e7:ea:5b:ae:b2:cc:b5:35:86:4b:d0:e2:3f:b6:d8:
+ f8:0e:00:ee:5d:e3:f7:8d:58:ff:cf:8b:37:e9:63:5f:6e:f7:
+ 09:71:36:c2:12:5d:57:f2:c8:b4:cd:f3:ee:02:df:11:dc:6a:
+ b9:57:84:1d:59:4d:8c:ce:c8:0e:23:c2:b7:26:9a:10:14:71:
+ fe:93:b2:8a:b8:80:f0:0e:10:9e:d3:a8:50:0c:37:82:2f:ea:
+ e0:8a:9d:e1:2c:39:ff:b5:b4:73:00:e4:f7:48:a6:73:ac:bf:
+ b2:de:77:04:87:b4:a3:cd:9b:35:24:37:fa:90:93:13:81:42:
+ c6:98:26:75:37:66:41:10:ac:bb:f5:94:e3:c2:31:2b:ad:e7:
+ 23:56:cc:35:25:92:b3:50
+-----BEGIN CERTIFICATE-----
+MIIFszCCA5ugAwIBAgIQIZxULej27HF3+k7ow3BXlzANBgkqhkiG9w0BAQwFADBj
+MQswCQYDVQQGEwJERTEnMCUGA1UECgweRGV1dHNjaGUgVGVsZWtvbSBTZWN1cml0
+eSBHbWJIMSswKQYDVQQDDCJUZWxla29tIFNlY3VyaXR5IFRMUyBSU0EgUm9vdCAy
+MDIzMB4XDTIzMDMyODEyMTY0NVoXDTQ4MDMyNzIzNTk1OVowYzELMAkGA1UEBhMC
+REUxJzAlBgNVBAoMHkRldXRzY2hlIFRlbGVrb20gU2VjdXJpdHkgR21iSDErMCkG
+A1UEAwwiVGVsZWtvbSBTZWN1cml0eSBUTFMgUlNBIFJvb3QgMjAyMzCCAiIwDQYJ
+KoZIhvcNAQEBBQADggIPADCCAgoCggIBAO01oYGA88tKaVvC+1GDrib94W7zgRJ9
+cUD/h3VCKSHtgVIs3xLBGYSJwb3FKNXVS2xE1kzbB5ZKVXrKNoIENqil/Cf2SfHV
+cp6R+SPWcHu79ZvB7JPPGeplfohwoHP89v+1VmLhc2o0mD6CuKyVU/QBoCcHcqMA
+U6DksquDOFczJZSfvkgdmOGjup5czQRxUX11eKvzWarE4GC+j4NSuHUaQTXtvPM6
+Y+mpFEXX5lLRbtLevOP1Czvm4MS9Q2QTps70mDdsipWol8hHD/BeEIvnHRz+sTug
+BTNoBUGCwQMrAcjnj02r6LX2zWtEtefdi+zqJbQAIldNsLGyMcEWzv/9FIS3R/qy
+8XDe24tsNlikfLMR0cN3f1+2JeANxdKz+bi4d9s3cXFH42AYTyS2dTd4uaNir73J
+co4vzLuu2+QVUhkHM/tqty1LkCiCc/4YizWN26cEar7qwU02OxY2kTLvtkCJkUPg
+8qKrBC7m8kwOFjQgrIfBLX7JZkcXFBGk8/ehJImr2BrIoVyxo/eMbcgByU/J7MT8
+rFEz0ciD0cmfHdRHNCk+y7AO+oMLKFjlKdw/fKifybYKu6boRhYPluV75Gp6SG12
+mAWl3G0eQh5C2hrgUve1g8Aae3g1LDj1H/1Joy7SWWO/gLCMk3PLNaaZlSJhZQNg
++y+TS/qanIA7AgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtqeX
+gj10hZv3PJ+TmpV5dVKMbUcwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS2
+p5eCPXSFm/c8n5OalXl1UoxtRzANBgkqhkiG9w0BAQwFAAOCAgEAqMxhpr51nhVQ
+pGv7qHBFfLp+sVr8WyP6Cnf4mHGCDG3gXkaqk/QeoMPhk9tLrbKmXauw1GLLXrtm
+9S3ul0A8Yute1hTWjOKWi0FpkzXmuZlrYrShF2Y0pmtjxrlO8iLpWA1WQdH6DErw
+M807u20hOq6OcrXDSvvpfeWxm4bu4uB9tPcy/SKE8YXJN3nptT+/XOR0so8RYgDd
+GGah2XsjX/GO1WfoVNpbOms2b/mBsTNHM3dA+VKq3dSDz4V4mZqTuXNnQkYRIer+
+CqkbGmVps4+uFrb2S1ayLfmlyOw7YqPta9BO1UAJpB+Y1zqlklkg5LB9zVtzaL1t
+xKITDmcZuI1CfmwMmm6gJC3VRRvcxAIU/oVbZZfKTpBQCHpCNfnqwmbU+AGuHrS+
+w6jv/naaoqYfRvaE7fzbzsQCzndILIyy7MMAo+wsVRjBfhnu4S/yrYObnqsZ38aK
+L4x35bcF7DvB7L6Gs4a8wPfc5+pbrrLMtTWGS9DiP7bY+A4A7l3j941Y/8+LN+lj
+X273CXE2whJdV/LItM3z7gLfEdxquVeEHVlNjM7IDiPCtyaaEBRx/pOyiriA8A4Q
+ntOoUAw3gi/q4Iqd4Sw5/7W0cwDk90imc6y/st53BIe0o82bNSQ3+pCTE4FCxpgm
+dTdmQRCsu/WU48IxK63nI1bMNSWSs1A=
-----END CERTIFICATE-----
\ No newline at end of file
diff -Nru chromium-145.0.7632.116/net/data/ssl/chrome_root_store/root_store.md chromium-145.0.7632.159/net/data/ssl/chrome_root_store/root_store.md
--- chromium-145.0.7632.116/net/data/ssl/chrome_root_store/root_store.md 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/net/data/ssl/chrome_root_store/root_store.md 2026-03-02 23:00:09.000000000 +0000
@@ -1,7 +1,7 @@
# Chrome Root Store
-Version: 29
+Version: 30
[TOC]
@@ -14,7 +14,6 @@
8ecde6884f3d87b1125ba31ac3fcb13d7016de7f57cc904fe1cb97c6ae98196e | CN=Amazon Root CA 1,O=Amazon,C=US | 2015-05-26 | 2038-01-17
e35d28419ed02025cfa69038cd623962458da5c695fbdea3c22b0bfb25897092 | CN=Amazon Root CA 4,O=Amazon,C=US | 2015-05-26 | 2040-05-26
5c58468d55f58e497e743982d2b50010b6d165374acf83a7d4a32db768c4408e | CN=Certum Trusted Network CA,OU=Certum Certification Authority,O=Unizeto Technologies S.A.,C=PL | 2008-10-22 | 2029-12-31
-b676f2eddae8775cd36cb0f63cd1d4603961f49e6265ba013a2f0307b6d0b804 | CN=Certum Trusted Network CA 2,OU=Certum Certification Authority,O=Unizeto Technologies S.A.,C=PL | 2011-10-06 | 2046-10-06
f356bea244b7a91eb35d53ca9ad7864ace018e2d35d5f8f96ddf68a6f41aa474 | CN=Atos TrustedRoot 2011,O=Atos,C=DE | 2011-07-07 | 2030-12-31
57de0583efd2b26e0361da99da9df4648def7ee8441c3b728afa9bcde0f9b26a | CN=Autoridad de Certificacion Firmaprofesional CIF A62634068,C=ES | 2014-09-23 | 2036-05-05
657cfe2fa73faa38462571f332a2363a46fce7020951710702cdfbb6eeda3305 | OU=certSIGN ROOT CA G2,O=CERTSIGN SA,C=RO | 2017-02-06 | 2042-02-06
@@ -24,7 +23,6 @@
eec5496b988ce98625b934092eec2908bed0b0f316c2d4730c84eaf1f3d34881 | CN=D-TRUST Root Class 3 CA 2 EV 2009,O=D-Trust GmbH,C=DE | 2009-11-05 | 2029-11-05
91e2f5788d5810eba7ba58737de1548a8ecacd014598bc0b143e041b17052552 | CN=T-TeleSec GlobalRoot Class 2,OU=T-Systems Trust Center,O=T-Systems Enterprise Services GmbH,C=DE | 2008-10-01 | 2033-10-01
fd73dad31c644ff1b43bef0ccdda96710b9cd9875eca7e31707af3e96d522bbd | CN=T-TeleSec GlobalRoot Class 3,OU=T-Systems Trust Center,O=T-Systems Enterprise Services GmbH,C=DE | 2008-10-01 | 2033-10-01
-d48d3d23eedb50a459e55197601c27774b9d7b18c94d5a059511a10250b93168 | CN=Certigna Root CA,OU=0002 48146308100036,O=Dhimyotis,C=FR | 2013-10-01 | 2033-10-01
e3b6a2db2ed7ce48842f7ac53241c7b71d54144bfb40c11f3f1d0b42f5eea12d | CN=Certigna,O=Dhimyotis,C=FR | 2007-06-29 | 2027-06-29
31ad6648f8104138c738f39ea4320133393e3a18cc02296ef97c2ac9ef6731d0 | CN=DigiCert Global Root G3,OU=www.digicert.com,O=DigiCert Inc,C=US | 2013-08-01 | 2038-01-15
3e9099b5015e8f486c00bcea9d111ee721faba355a89bcf1df69561e3dc6325c | CN=DigiCert Assured ID Root CA,OU=www.digicert.com,O=DigiCert Inc,C=US | 2006-11-10 | 2031-11-10
@@ -77,12 +75,7 @@
f1c1b50ae5a20dd8030ec9f6bc24823dd367b5255759b4e71b61fce9f7375d73 | CN=SecureTrust CA,O=SecureTrust Corporation,C=US | 2006-11-07 | 2029-12-31
9bea11c976fe014764c1be56a6f914b5a560317abd9988393382e5161aa0493c | CN=UCA Global G2 Root,O=UniTrust,C=CN | 2016-03-11 | 2040-12-31
d43af9b35473755c9684fc06d7d8cb70ee5c28e773fb294eb41ee71722924d24 | CN=UCA Extended Validation Root,O=UniTrust,C=CN | 2015-03-13 | 2038-12-31
-22a2c1f7bded704cc1e701b5f408c310880fe956b5de2a4a44f99c873a25a7c8 | CN=SSL.com EV Root Certification Authority ECC,O=SSL Corporation,L=Houston,ST=Texas,C=US | 2016-02-12 | 2041-02-12
-2e7bf16cc22485a7bbe2aa8696750761b0ae39be3b2fe9d0cc6d4ef73491425c | CN=SSL.com EV Root Certification Authority RSA R2,O=SSL Corporation,L=Houston,ST=Texas,C=US | 2017-05-31 | 2042-05-30
-3417bb06cc6007da1b961c920b8ab4ce3fad820e4aa30b9acbc4a74ebdcebc65 | CN=SSL.com Root Certification Authority ECC,O=SSL Corporation,L=Houston,ST=Texas,C=US | 2016-02-12 | 2041-02-12
-85666a562ee0be5ce925c1d8890a6f76a87ec16d4d7d5f29ea7419cf20123b69 | CN=SSL.com Root Certification Authority RSA,O=SSL Corporation,L=Houston,ST=Texas,C=US | 2016-02-12 | 2041-02-12
62dd0be9b9f50a163ea0f8e75c053b1eca57ea55c8688f647c6881f2c8357b95 | CN=SwissSign Gold CA - G2,O=SwissSign AG,C=CH | 2006-10-25 | 2036-10-25
-59769007f7685d0fcd50872f9f95d5755a5b2b457d81f3692b610a98672f0e1b | CN=TWCA Global Root CA,OU=Root CA,O=TAIWAN-CA,C=TW | 2012-06-27 | 2030-12-31
dd6936fe21f8f077c123a1a521c12224f72255b73e03a7260693e8a24b0fa389 | CN=TeliaSonera Root CA v1,O=TeliaSonera | 2007-10-18 | 2032-10-18
6b328085625318aa50d173c98d8bda09d57e27413d114cf787a0f5d06c030cf6 | CN=Certum EC-384 CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL | 2018-03-26 | 2043-03-26
fe7696573855773e37a95e7ad4d9cc96c30157c15d31765ba9b15704e1ae78fd | CN=Certum Trusted Root CA,OU=Certum Certification Authority,O=Asseco Data Systems S.A.,C=PL | 2018-03-16 | 2043-03-16
@@ -122,6 +115,16 @@
9a114025197c5bb95d94e63d55cd43790847b646b23cdf11ada4a00eff15fb48 | CN=Buypass Class 2 Root CA,O=Buypass AS-983163327,C=NO | 2010-10-26 | 2040-10-26
edf7ebbca27a2a384d387b7d4010c666e2edb4843e4c29b4ae1d5b9332e6b24d | CN=Buypass Class 3 Root CA,O=Buypass AS-983163327,C=NO | 2010-10-26 | 2040-10-26
c0a6f4dc63a24bfdcf54ef2a6a082a0a72de35803e2ff5ff527ae5d87206dfd5 | OU=ePKI Root Certification Authority,O=Chunghwa Telecom Co.\, Ltd.,C=TW | 2004-12-20 | 2034-12-20
+d48d3d23eedb50a459e55197601c27774b9d7b18c94d5a059511a10250b93168 | CN=Certigna Root CA,OU=0002 48146308100036,O=Dhimyotis,C=FR | 2013-10-01 | 2033-10-01
6c61dac3a2def031506be036d2a6fe401994fbd13df9c8d466599274c446ec98 | CN=NetLock Arany (Class Gold) Főtanúsítvány,OU=Tanúsítványkiadók (Certification Services),O=NetLock Kft.,L=Budapest,C=HU | 2008-12-11 | 2028-12-06
+22a2c1f7bded704cc1e701b5f408c310880fe956b5de2a4a44f99c873a25a7c8 | CN=SSL.com EV Root Certification Authority ECC,O=SSL Corporation,L=Houston,ST=Texas,C=US | 2016-02-12 | 2041-02-12
+2e7bf16cc22485a7bbe2aa8696750761b0ae39be3b2fe9d0cc6d4ef73491425c | CN=SSL.com EV Root Certification Authority RSA R2,O=SSL Corporation,L=Houston,ST=Texas,C=US | 2017-05-31 | 2042-05-30
+3417bb06cc6007da1b961c920b8ab4ce3fad820e4aa30b9acbc4a74ebdcebc65 | CN=SSL.com Root Certification Authority ECC,O=SSL Corporation,L=Houston,ST=Texas,C=US | 2016-02-12 | 2041-02-12
+85666a562ee0be5ce925c1d8890a6f76a87ec16d4d7d5f29ea7419cf20123b69 | CN=SSL.com Root Certification Authority RSA,O=SSL Corporation,L=Houston,ST=Texas,C=US | 2016-02-12 | 2041-02-12
+59769007f7685d0fcd50872f9f95d5755a5b2b457d81f3692b610a98672f0e1b | CN=TWCA Global Root CA,OU=Root CA,O=TAIWAN-CA,C=TW | 2012-06-27 | 2030-12-31
f015ce3cc239bfef064be9f1d2c417e1a0264a0a94be1f0c8d121864eb6949cc | CN=HiPKI Root CA - G1,O=Chunghwa Telecom Co.\, Ltd.,C=TW | 2019-02-22 | 2037-12-31
193144f431e0fddb740717d4de926a571133884b4360d30e272913cbe660ce41 | CN=SwissSign RSA TLS Root CA 2022 - 1,O=SwissSign AG,C=CH | 2022-06-08 | 2047-06-08
+0552e6f83fdf65e8fa9670e666df28a4e21340b510cbe52566f97c4fb94b2bd1 | CN=D-TRUST BR Root CA 2 2023,O=D-Trust GmbH,C=DE | 2023-05-09 | 2038-05-09
+8e8221b2e7d4007836a1672f0dcc299c33bc07d316f132fa1a206d587150f1ce | CN=D-TRUST EV Root CA 2 2023,O=D-Trust GmbH,C=DE | 2023-05-09 | 2038-05-09
+578af4ded0853f4e5998db4aeaf9cbea8d945f60b620a38d1a3c13b2bc7ba8e1 | CN=Telekom Security TLS ECC Root 2020,O=Deutsche Telekom Security GmbH,C=DE | 2020-08-25 | 2045-08-25
+efc65cadbb59adb6efe84da22311b35624b71b3b1ea0da8b6655174ec8978646 | CN=Telekom Security TLS RSA Root 2023,O=Deutsche Telekom Security GmbH,C=DE | 2023-03-28 | 2048-03-27
diff -Nru chromium-145.0.7632.116/net/data/ssl/chrome_root_store/root_store.textproto chromium-145.0.7632.159/net/data/ssl/chrome_root_store/root_store.textproto
--- chromium-145.0.7632.116/net/data/ssl/chrome_root_store/root_store.textproto 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/net/data/ssl/chrome_root_store/root_store.textproto 2026-03-02 23:00:09.000000000 +0000
@@ -8,7 +8,7 @@
# Version # should always be incremented up whenever this (or any pem file that
# it references) is changed.
-version_major: 29
+version_major: 30
# CN=Actalis Authentication Root CA, O=Actalis S.p.A./03358520967, L=Milan, C=IT
# https://ssltest-a.actalis.it:8443
@@ -53,11 +53,6 @@
ev_policy_oids: "2.23.140.1.1"
}
-# CN=Certum Trusted Network CA 2, OU=Certum Certification Authority, O=Unizeto Technologies S.A., C=PL
-trust_anchors {
- sha256_hex: "b676f2eddae8775cd36cb0f63cd1d4603961f49e6265ba013a2f0307b6d0b804"
-}
-
# C=DE, O=Atos, CN=Atos TrustedRoot 2011
trust_anchors {
sha256_hex: "f356bea244b7a91eb35d53ca9ad7864ace018e2d35d5f8f96ddf68a6f41aa474"
@@ -149,8 +144,12 @@
}
# CN=Certigna Root CA, OU=0002 48146308100036, O=Dhimyotis, C=FR
+# Constraint date: Sun, Jun 14, 2026 23:59:59 GMT+0000
trust_anchors {
sha256_hex: "d48d3d23eedb50a459e55197601c27774b9d7b18c94d5a059511a10250b93168"
+ constraints: {
+ sct_not_after_sec: 1781481599
+ }
}
# CN=Certigna, O=Dhimyotis, C=FR
@@ -506,26 +505,42 @@
# CN=SSL.com EV Root Certification Authority ECC, O=SSL Corporation, L=Houston, ST=Texas, C=US
# https://test-ev-ecc.ssl.com/
+# Constraint date: Sun, Jun 14, 2026 23:59:59 GMT+0000
trust_anchors {
sha256_hex: "22a2c1f7bded704cc1e701b5f408c310880fe956b5de2a4a44f99c873a25a7c8"
ev_policy_oids: "2.23.140.1.1"
+ constraints: {
+ sct_not_after_sec: 1781481599
+ }
}
# CN=SSL.com EV Root Certification Authority RSA R2, O=SSL Corporation, L=Houston, ST=Texas, C=US
# https://test-ev-rsa.ssl.com/
+# Constraint date: Sun, Jun 14, 2026 23:59:59 GMT+0000
trust_anchors {
sha256_hex: "2e7bf16cc22485a7bbe2aa8696750761b0ae39be3b2fe9d0cc6d4ef73491425c"
ev_policy_oids: "2.23.140.1.1"
+ constraints: {
+ sct_not_after_sec: 1781481599
+ }
}
# CN=SSL.com Root Certification Authority ECC, O=SSL Corporation, L=Houston, ST=Texas, C=US
+# Constraint date: Sun, Jun 14, 2026 23:59:59 GMT+0000
trust_anchors {
sha256_hex: "3417bb06cc6007da1b961c920b8ab4ce3fad820e4aa30b9acbc4a74ebdcebc65"
+ constraints: {
+ sct_not_after_sec: 1781481599
+ }
}
# CN=SSL.com Root Certification Authority RSA, O=SSL Corporation, L=Houston, ST=Texas, C=US
+# Constraint date: Sun, Jun 14, 2026 23:59:59 GMT+0000
trust_anchors {
sha256_hex: "85666a562ee0be5ce925c1d8890a6f76a87ec16d4d7d5f29ea7419cf20123b69"
+ constraints: {
+ sct_not_after_sec: 1781481599
+ }
}
# CN=SwissSign Gold CA - G2, O=SwissSign AG, C=CH
@@ -537,9 +552,13 @@
# CN=TWCA Global Root CA, OU=Root CA, O=TAIWAN-CA, C=TW
# https://evssldemo3.twca.com.tw/index.html
+# Constraint date: Mon, Sep 14, 2026 23:59:59 GMT+0000
trust_anchors {
sha256_hex: "59769007f7685d0fcd50872f9f95d5755a5b2b457d81f3692b610a98672f0e1b"
ev_policy_oids: "2.23.140.1.1"
+ constraints: {
+ sct_not_after_sec: 1789430399
+ }
}
# CN=TeliaSonera Root CA v1, O=TeliaSonera
@@ -751,6 +770,44 @@
}
}
+# CN=D-TRUST BR Root CA 2 2023, O=D-Trust GmbH, C=DE
+# Constraint date: Mon Aug 30, 2027 23:59:59 GMT+0000
+trust_anchors {
+ sha256_hex: "0552e6f83fdf65e8fa9670e666df28a4e21340b510cbe52566f97c4fb94b2bd1"
+ constraints: {
+ sct_not_after_sec: 1819670399
+ }
+}
+
+# CN=D-TRUST EV Root CA 2 2023, O=D-Trust GmbH, C=DE
+# https://certdemo-ev-valid-rsa.tls.d-trust.net/
+# Constraint date: Mon Aug 30, 2027 23:59:59 GMT+0000
+trust_anchors {
+ sha256_hex: "8e8221b2e7d4007836a1672f0dcc299c33bc07d316f132fa1a206d587150f1ce"
+ ev_policy_oids: "2.23.140.1.1"
+ constraints: {
+ sct_not_after_sec: 1819670399
+ }
+}
+
+# CN=Telekom Security TLS ECC Root 2020, O=Deutsche Telekom Security GmbH, C=DE
+# Constraint date: Mon Aug 30, 2027 23:59:59 GMT+0000
+trust_anchors {
+ sha256_hex: "578af4ded0853f4e5998db4aeaf9cbea8d945f60b620a38d1a3c13b2bc7ba8e1"
+ constraints: {
+ sct_not_after_sec: 1819670399
+ }
+}
+
+# CN=Telekom Security TLS RSA Root 2023, O=Deutsche Telekom Security GmbH, C=DE
+# Constraint date: Mon Aug 30, 2027 23:59:59 GMT+0000
+trust_anchors {
+ sha256_hex: "efc65cadbb59adb6efe84da22311b35624b71b3b1ea0da8b6655174ec8978646"
+ constraints: {
+ sct_not_after_sec: 1819670399
+ }
+}
+
# Cloudflare MTC experiment log shard3.
# See https://bootstrap-mtca.cloudflareresearch.com/logs/shard3/metadata
mtc_anchors {
diff -Nru chromium-145.0.7632.116/net/http/transport_security_state_static.pins chromium-145.0.7632.159/net/http/transport_security_state_static.pins
--- chromium-145.0.7632.116/net/http/transport_security_state_static.pins 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/net/http/transport_security_state_static.pins 2026-03-02 23:00:09.000000000 +0000
@@ -43,9 +43,9 @@
# hash function for preloaded entries again (we have already done so once).
#
-# Last updated: 2026-02-20 12:57 UTC
+# Last updated: 2026-03-02 12:53 UTC
PinsListTimestamp
-1771592260
+1772456018
TestSPKI
sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff -Nru chromium-145.0.7632.116/net/http/transport_security_state_static_pins.json chromium-145.0.7632.159/net/http/transport_security_state_static_pins.json
--- chromium-145.0.7632.116/net/http/transport_security_state_static_pins.json 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/net/http/transport_security_state_static_pins.json 2026-03-02 23:00:09.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: 2026-02-20 12:57 UTC
+// Last updated: 2026-03-02 12:53 UTC
//
{
"pinsets": [
diff -Nru chromium-145.0.7632.116/remoting/resources/remoting_strings_el.xtb chromium-145.0.7632.159/remoting/resources/remoting_strings_el.xtb
--- chromium-145.0.7632.116/remoting/resources/remoting_strings_el.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/remoting/resources/remoting_strings_el.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -71,7 +71,7 @@
Πρόγραμμα απεγκατάστασης κεντρικού υπολογιστή Chromoting
Εφαρμογή προώθησης URL
Ο κωδικός πρόσβασης δεν είναι έγκυρος. Δοκιμάστε ξανά.
-Όροι Παροχής Υπηρεσιών
+Όροι παροχής υπηρεσιών
Βασική βιβλιοθήκη
Άνοιγμα προτιμήσεων προσβασιμότητας
Να μην εμφανιστεί ξανά
diff -Nru chromium-145.0.7632.116/remoting/resources/remoting_strings_fa.xtb chromium-145.0.7632.159/remoting/resources/remoting_strings_fa.xtb
--- chromium-145.0.7632.116/remoting/resources/remoting_strings_fa.xtb 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/remoting/resources/remoting_strings_fa.xtb 2026-03-02 23:00:09.000000000 +0000
@@ -137,7 +137,7 @@
با دنبال کردن دستورالعملها، رایانهتان را برای دسترسی از راه دور تنظیم کنید
صفحه نمایش مانند صفحه لمسی عمل میکند
به «کنترل رایانه ازراهدور Chrome» خوشآمدید
-سعی مجدد
+امتحان مجدد
حق نشر ۲۰۲۵ Chromium Authors. کلیه حقوق محفوظ است.
میزبان آفلاین است.
توقف همرسانی
diff -Nru chromium-145.0.7632.116/skia/ext/skia_commit_hash.h chromium-145.0.7632.159/skia/ext/skia_commit_hash.h
--- chromium-145.0.7632.116/skia/ext/skia_commit_hash.h 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/skia/ext/skia_commit_hash.h 2026-03-02 23:00:09.000000000 +0000
@@ -3,6 +3,6 @@
#ifndef SKIA_EXT_SKIA_COMMIT_HASH_H_
#define SKIA_EXT_SKIA_COMMIT_HASH_H_
-#define SKIA_COMMIT_HASH "2ab8add5be2c46eb6238f4c217f6d6dbc9bccd23"
+#define SKIA_COMMIT_HASH "fba326b8829e469ac02e5a68a0d36982ef1975bc"
#endif // SKIA_EXT_SKIA_COMMIT_HASH_H_
diff -Nru chromium-145.0.7632.116/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp chromium-145.0.7632.159/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp
--- chromium-145.0.7632.116/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/third_party/angle/src/libANGLE/renderer/vulkan/TextureVk.cpp 2026-03-02 23:00:09.000000000 +0000
@@ -3156,8 +3156,17 @@
// invalidate must be called after wait for finish.
ANGLE_TRY(srcBuffer->invalidate(renderer));
- size_t dstBufferSize = sourceBox.width * sourceBox.height * sourceBox.depth *
- dstFormat.pixelBytes * layerCount;
+ // Use size_t calculations to avoid 32-bit overflows. Note that the dimensions are bound by
+ // the maximums specified in Constants.h, and that gl::Box members are signed 32-bit
+ // integers.
+ static_assert(gl::IMPLEMENTATION_MAX_2D_TEXTURE_SIZE *
+ gl::IMPLEMENTATION_MAX_2D_TEXTURE_SIZE <
+ std::numeric_limits::max());
+ size_t dstBufferSize = sourceBox.width * sourceBox.height;
+ static_assert(gl::IMPLEMENTATION_MAX_3D_TEXTURE_SIZE *
+ gl::IMPLEMENTATION_MAX_2D_ARRAY_TEXTURE_LAYERS * 16 <
+ std::numeric_limits::max());
+ dstBufferSize *= sourceBox.depth * dstFormat.pixelBytes * layerCount;
// Allocate memory in the destination texture for the copy/conversion.
uint8_t *dstData = nullptr;
diff -Nru chromium-145.0.7632.116/third_party/blink/common/page_state/page_state_serialization.cc chromium-145.0.7632.159/third_party/blink/common/page_state/page_state_serialization.cc
--- chromium-145.0.7632.116/third_party/blink/common/page_state/page_state_serialization.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/third_party/blink/common/page_state/page_state_serialization.cc 2026-03-02 23:00:09.000000000 +0000
@@ -83,6 +83,9 @@
//
// For reference, see FormController::formStatesFromStateVector in
// third_party/WebKit/Source/core/html/forms/FormController.cpp.
+ //
+ // Support for PageState version 14 was added to allow validation of the file
+ // list.
size_t index = 0;
@@ -117,11 +120,37 @@
return false;
if (type && base::EqualsASCII(*type, "file")) {
- if (value_size != 2)
+ // `value_size` is expected to be either:
+ // - 0 for an empty file form field
+ // - 2 for legacy PageState versions that only contain file path and
+ // display name.
+ // - A multiple of 3 for modern PageStates, which contain a list of
+ // (file path, name, relative path) triples within a single item.
+ // (See File::AppendToControlState.)
+ //
+ // Extract the file path(s) for sizes 2 and 3, and continue with
+ // validation for the zero-size empty file case. Any other values of
+ // `value_size` should be considered invalid.
+ if (value_size == 2) {
+ // PageState version < 14.
+ referenced_files->emplace_back(document_state[index++]);
+ index++; // Skip over display name.
+ } else if (value_size > 2 && value_size % 3 == 0) {
+ // PageState version >= 14.
+ // Add the file path from each group of three.
+ for (size_t i = 0; i < value_size / 3; ++i) {
+ // Double-check bounds for the 3 elements we will look at.
+ if (index + 2 >= document_state.size()) {
+ return false;
+ }
+ referenced_files->emplace_back(document_state[index++]);
+ index++; // Skip over name.
+ index++; // Skip over relative path.
+ }
+ } else if (value_size != 0) {
return false;
-
- referenced_files->emplace_back(document_state[index++]);
- index++; // Skip over display name.
+ }
+ // If value_size is 0, the file form field is empty, so continue.
} else {
index += value_size;
}
@@ -1033,6 +1062,37 @@
*encoded = obj.GetAsString();
}
+bool GetAllFilesInPageState(const std::string& encoded,
+ std::vector* files) {
+ ExplodedPageState exploded;
+ if (!DecodePageState(encoded, &exploded)) {
+ // If the PageState can't be decoded at all, then there are no usable files
+ // in it and it is safe to leave the `files` set empty and return true.
+ return true;
+ }
+
+ // TODO(crbug.com/40241973): Refactor to avoid sending PageState objects to
+ // the browser process, so that this use of RecursivelyAppendReferencedFiles
+ // is not needed.
+ std::vector> referenced_files;
+ if (!RecursivelyAppendReferencedFiles(exploded.top, &referenced_files)) {
+ // If the PageState can be decoded but this function failed due to an issue
+ // parsing the DocumentState, it is important to return false to indicate
+ // that the PageState is not safe to use. Some files could otherwise be
+ // present and usable without showing up in the list.
+ return false;
+ }
+
+ // Copy all of the files found into the output parameter.
+ files->reserve(referenced_files.size());
+ for (const auto& file : referenced_files) {
+ if (file) {
+ files->push_back(base::FilePath::FromUTF16Unsafe(*file));
+ }
+ }
+ return true;
+}
+
#if BUILDFLAG(IS_ANDROID)
bool DecodePageStateWithDeviceScaleFactorForTesting(
const std::string& encoded,
diff -Nru chromium-145.0.7632.116/third_party/blink/public/common/page_state/page_state_serialization.h chromium-145.0.7632.159/third_party/blink/public/common/page_state/page_state_serialization.h
--- chromium-145.0.7632.116/third_party/blink/public/common/page_state/page_state_serialization.h 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/third_party/blink/public/common/page_state/page_state_serialization.h 2026-03-02 23:00:09.000000000 +0000
@@ -96,6 +96,13 @@
int version,
std::string* encoded);
+// Similar to `PageState::GetReferencedFiles`, but returns all FilePaths within
+// the entire PageState by traversing its frame tree. Used to validate that the
+// list returned by `GetReferencedFiles` is complete.
+BLINK_COMMON_EXPORT bool GetAllFilesInPageState(
+ const std::string& encoded,
+ std::vector* files);
+
#if BUILDFLAG(IS_ANDROID)
BLINK_COMMON_EXPORT bool DecodePageStateWithDeviceScaleFactorForTesting(
const std::string& encoded,
diff -Nru chromium-145.0.7632.116/third_party/blink/renderer/core/css/css_math_expression_node.cc chromium-145.0.7632.159/third_party/blink/renderer/core/css/css_math_expression_node.cc
--- chromium-145.0.7632.116/third_party/blink/renderer/core/css/css_math_expression_node.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/third_party/blink/renderer/core/css/css_math_expression_node.cc 2026-03-02 23:00:09.000000000 +0000
@@ -2108,7 +2108,7 @@
CSSValueID function_id) {
const CSSMathExpressionNode* operand = operands.front();
- if (operand->IsCalcSize()) {
+ if (operand->IsCalcSize() || CSSMathType(*operand).IsIntermediateResult()) {
return nullptr;
}
diff -Nru chromium-145.0.7632.116/third_party/blink/renderer/core/css/cssom/css_unparsed_value.cc chromium-145.0.7632.159/third_party/blink/renderer/core/css/cssom/css_unparsed_value.cc
--- chromium-145.0.7632.116/third_party/blink/renderer/core/css/cssom/css_unparsed_value.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/third_party/blink/renderer/core/css/cssom/css_unparsed_value.cc 2026-03-02 23:00:09.000000000 +0000
@@ -19,7 +19,11 @@
String FindVariableName(CSSParserTokenStream& stream) {
stream.ConsumeWhitespace();
- return stream.Consume().Value().ToString();
+ if (stream.Peek().GetType() == CSSParserTokenType::kIdentToken) {
+ return stream.Consume().Value().ToString();
+ } else {
+ return {};
+ }
}
V8CSSUnparsedSegment* VariableReferenceValue(
@@ -35,6 +39,11 @@
CSSStyleVariableReferenceValue* variable_reference =
CSSStyleVariableReferenceValue::Create(variable_name.ToString(),
unparsed_value);
+ if (!variable_reference) {
+ // TODO(sesse): Plumb the ExceptionState here so that we can use
+ // the Create() variant that properly throws an exception.
+ return nullptr;
+ }
return MakeGarbageCollected(variable_reference);
}
@@ -57,8 +66,12 @@
if (stream.Peek().GetType() == CSSParserTokenType::kCommaToken) {
stream.Consume();
}
- tokens.push_back(VariableReferenceValue(
- variable_name, ParserTokenStreamToTokens(stream)));
+ V8CSSUnparsedSegment* ref = VariableReferenceValue(
+ variable_name, ParserTokenStreamToTokens(stream));
+ if (!ref) {
+ break;
+ }
+ tokens.push_back(ref);
} else {
if (stream.Peek().GetBlockType() == CSSParserToken::kBlockStart) {
++nesting_level;
diff -Nru chromium-145.0.7632.116/third_party/blink/renderer/core/css/parser/css_parser_token.h chromium-145.0.7632.159/third_party/blink/renderer/core/css/parser/css_parser_token.h
--- chromium-145.0.7632.116/third_party/blink/renderer/core/css/parser/css_parser_token.h 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/third_party/blink/renderer/core/css/parser/css_parser_token.h 2026-03-02 23:00:09.000000000 +0000
@@ -93,7 +93,8 @@
unit_(0), // Don't care.
value_is_inline_(false),
value_is_8bit_(false), // Don't care.
- padding_(0) // Don't care.
+ padding_(0), // Don't care.
+ value_length_(0) // For security.
{}
// The resulting CSSParserToken may hold a reference to the data in value.
@@ -128,6 +129,9 @@
return static_cast(type_);
}
StringView Value() const {
+#if DCHECK_IS_ON()
+ DCHECK(has_value_);
+#endif
return value_is_8bit_ ? StringView(Span8()) : StringView(Span16());
}
@@ -221,6 +225,9 @@
value_data_char_raw_ = string.Bytes();
value_is_inline_ = false;
}
+#if DCHECK_IS_ON()
+ has_value_ = true;
+#endif
}
bool ValueDataCharRawEqual(const CSSParserToken& other) const;
const void* ValueDataCharRaw() const {
@@ -268,8 +275,15 @@
// tightly with the rest of this object for a smaller object size.
unsigned value_is_8bit_ : 1;
+#if DCHECK_IS_ON()
+ unsigned has_value_ : 1 = false;
+
+ // These are free bits. You may take from them if you need.
+ [[maybe_unused]] unsigned padding_ : 11;
+#else
// These are free bits. You may take from them if you need.
[[maybe_unused]] unsigned padding_ : 12;
+#endif
unsigned value_length_;
union {
diff -Nru chromium-145.0.7632.116/third_party/blink/renderer/core/inspector/devtools_session.cc chromium-145.0.7632.159/third_party/blink/renderer/core/inspector/devtools_session.cc
--- chromium-145.0.7632.116/third_party/blink/renderer/core/inspector/devtools_session.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/third_party/blink/renderer/core/inspector/devtools_session.cc 2026-03-02 23:00:09.000000000 +0000
@@ -401,6 +401,7 @@
}
void DevToolsSession::Trace(Visitor* visitor) const {
+ v8_inspector::V8Inspector::ManagedChannel::Trace(visitor);
visitor->Trace(receiver_);
visitor->Trace(host_remote_);
visitor->Trace(agent_);
diff -Nru chromium-145.0.7632.116/third_party/blink/renderer/core/inspector/devtools_session.h chromium-145.0.7632.159/third_party/blink/renderer/core/inspector/devtools_session.h
--- chromium-145.0.7632.116/third_party/blink/renderer/core/inspector/devtools_session.h 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/third_party/blink/renderer/core/inspector/devtools_session.h 2026-03-02 23:00:09.000000000 +0000
@@ -50,10 +50,10 @@
class InspectorPerformanceAgent;
class InspectorWebAudioAgent;
-class CORE_EXPORT DevToolsSession : public GarbageCollected,
- public mojom::blink::DevToolsSession,
- public protocol::FrontendChannel,
- public v8_inspector::V8Inspector::Channel {
+class CORE_EXPORT DevToolsSession
+ : public v8_inspector::V8Inspector::ManagedChannel,
+ public mojom::blink::DevToolsSession,
+ public protocol::FrontendChannel {
public:
DevToolsSession(
DevToolsAgent*,
@@ -87,7 +87,7 @@
}
void Detach();
void DetachFromV8();
- void Trace(Visitor*) const;
+ void Trace(Visitor*) const override;
// protocol::FrontendChannel implementation.
void FlushProtocolNotifications() override;
diff -Nru chromium-145.0.7632.116/third_party/blink/renderer/core/inspector/inspector_trace_events.cc chromium-145.0.7632.159/third_party/blink/renderer/core/inspector/inspector_trace_events.cc
--- chromium-145.0.7632.116/third_party/blink/renderer/core/inspector/inspector_trace_events.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/third_party/blink/renderer/core/inspector/inspector_trace_events.cc 2026-03-02 23:00:09.000000000 +0000
@@ -1321,6 +1321,7 @@
ExecutionContext* context,
const v8::Local& function) {
auto dict = std::move(trace_context).WriteDictionary();
+
if (LocalFrame* frame = FrameForExecutionContext(context))
dict.Add("frame", IdentifiersFactory::FrameId(frame));
@@ -1348,6 +1349,7 @@
dict.Add("columnNumber", location->ColumnNumber());
uint64_t sample_trace_id = InspectorTraceEvents::GetNextSampleTraceId();
dict.Add("sampleTraceId", sample_trace_id);
+ v8::CpuProfiler::CollectSample(context->GetIsolate(), sample_trace_id);
}
void inspector_paint_image_event::Data(perfetto::TracedValue context,
diff -Nru chromium-145.0.7632.116/third_party/blink/renderer/modules/clipboard/clipboard_change_event_controller.cc chromium-145.0.7632.159/third_party/blink/renderer/modules/clipboard/clipboard_change_event_controller.cc
--- chromium-145.0.7632.116/third_party/blink/renderer/modules/clipboard/clipboard_change_event_controller.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/third_party/blink/renderer/modules/clipboard/clipboard_change_event_controller.cc 2026-03-02 23:00:09.000000000 +0000
@@ -26,6 +26,9 @@
void ClipboardChangeEventController::FocusedFrameChanged() {
if (fire_clipboardchange_on_focus_) {
+ if (!GetExecutionContext()) {
+ return;
+ }
UseCounter::Count(GetExecutionContext(),
WebFeature::kClipboardChangeEventFiredAfterFocusGain);
fire_clipboardchange_on_focus_ = false;
@@ -61,7 +64,13 @@
SystemClipboard* ClipboardChangeEventController::GetSystemClipboard() const {
ExecutionContext* context = GetExecutionContext();
+ if (!context) {
+ return nullptr;
+ }
LocalFrame* local_frame = To(context)->GetFrame();
+ if (!local_frame) {
+ return nullptr;
+ }
return local_frame->GetSystemClipboard();
}
@@ -74,7 +83,6 @@
void ClipboardChangeEventController::OnClipboardChanged() {
ExecutionContext* context = GetExecutionContext();
- // TODO(roraja): revisit if this null check is really required
if (!context) {
return;
}
@@ -101,6 +109,9 @@
void ClipboardChangeEventController::MaybeDispatchClipboardChangeEvent() {
ExecutionContext* context = GetExecutionContext();
+ if (!context) {
+ return;
+ }
LocalDOMWindow& window = *To(context);
// Check if document has focus
@@ -114,6 +125,9 @@
// Check for sticky activation first
LocalFrame* frame = window.GetFrame();
+ if (!frame) {
+ return;
+ }
if (frame->HasStickyUserActivation()) {
DispatchClipboardChangeEvent();
return;
@@ -136,7 +150,6 @@
void ClipboardChangeEventController::DispatchClipboardChangeEvent() {
SystemClipboard* clipboard = GetSystemClipboard();
- // TODO(roraja): revisit if this null check
if (!clipboard) {
return;
}
diff -Nru chromium-145.0.7632.116/third_party/blink/renderer/modules/clipboard/clipboard_change_event_controller_unittest.cc chromium-145.0.7632.159/third_party/blink/renderer/modules/clipboard/clipboard_change_event_controller_unittest.cc
--- chromium-145.0.7632.116/third_party/blink/renderer/modules/clipboard/clipboard_change_event_controller_unittest.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/third_party/blink/renderer/modules/clipboard/clipboard_change_event_controller_unittest.cc 2026-03-02 23:00:09.000000000 +0000
@@ -246,4 +246,104 @@
clipboard_change_event_handler, false);
}
+// Regression test: FocusedFrameChanged() must not crash when the execution
+// context has been destroyed (e.g. during frame detachment). This reproduces
+// the null dereference crash in MaybeDispatchClipboardChangeEvent() reported
+// in crbug.com/1771962050.
+//
+// The real crash path is: Frame::Detach() -> DomWindow()->FrameDestroyed()
+// (which calls NotifyContextDestroyed(), making GetExecutionContext() return
+// null) -> FocusController::FrameDetached() -> SetFocusedFrame(nullptr) ->
+// NotifyFocusChangedObservers() -> FocusedFrameChanged() ->
+// MaybeDispatchClipboardChangeEvent() -> null dereference.
+TEST_F(ClipboardChangeEventTest, NoCrashWhenFocusChangedAfterContextDestroyed) {
+ ExecutionContext* execution_context = GetFrame().DomWindow();
+ GetFrame().GetSystemClipboard()->OnClipboardDataChanged({"text/plain"}, 1);
+
+ SetSecureOrigin(execution_context);
+ // Page is not focused so that DidUpdateData() sets
+ // fire_clipboardchange_on_focus_ = true.
+ SetPageFocus(false);
+
+ auto* clipboard_change_event_controller =
+ MakeGarbageCollected(
+ *GetFrame().DomWindow()->navigator(), &GetDocument());
+
+ // Trigger clipboard change while unfocused. OnClipboardChanged() calls
+ // MaybeDispatchClipboardChangeEvent() which sees no focus and sets
+ // fire_clipboardchange_on_focus_ = true.
+ clipboard_change_event_controller->DidUpdateData();
+ test::RunPendingTasks();
+
+ // Simulate frame detachment by calling FrameDestroyed() directly on the
+ // DomWindow. This calls NotifyContextDestroyed(), making
+ // GetExecutionContext() return null (unit tests may call FrameDestroyed()
+ // manually per the code comments in LocalDOMWindow).
+ GetFrame().DomWindow()->FrameDestroyed();
+
+ // Calling FocusedFrameChanged() with a destroyed context must not crash.
+ // Before the fix: null dereference at *To(context) in
+ // MaybeDispatchClipboardChangeEvent() because fire_clipboardchange_on_focus_
+ // is true and GetExecutionContext() returns null.
+ clipboard_change_event_controller->FocusedFrameChanged();
+}
+
+// Regression test: DidUpdateData() (via OnClipboardChanged) must not crash
+// when the execution context has been destroyed during frame detachment.
+TEST_F(ClipboardChangeEventTest,
+ NoCrashWhenClipboardChangedAfterContextDestroyed) {
+ ExecutionContext* execution_context = GetFrame().DomWindow();
+ GetFrame().GetSystemClipboard()->OnClipboardDataChanged({"text/plain"}, 1);
+
+ SetSecureOrigin(execution_context);
+ SetPageFocus(true);
+
+ auto* clipboard_change_event_controller =
+ MakeGarbageCollected(
+ *GetFrame().DomWindow()->navigator(), &GetDocument());
+
+ // Simulate frame detachment.
+ GetFrame().DomWindow()->FrameDestroyed();
+
+ // OnClipboardChanged() already has a null check, so this should not crash.
+ clipboard_change_event_controller->DidUpdateData();
+ test::RunPendingTasks();
+}
+
+// Regression test: MaybeDispatchClipboardChangeEvent must not crash during
+// page teardown when fire_clipboardchange_on_focus_ is true. This simulates
+// the exact crash path through Page::WillBeDestroyed() -> Frame::Detach() ->
+// FocusController::FrameDetached() -> NotifyFocusChangedObservers().
+TEST_F(ClipboardChangeEventTest,
+ NoCrashDuringTeardownWithPendingFocusDispatch) {
+ ExecutionContext* execution_context = GetFrame().DomWindow();
+ GetFrame().GetSystemClipboard()->OnClipboardDataChanged({"text/plain"}, 1);
+
+ SetSecureOrigin(execution_context);
+ // First set page focused to establish the focused frame in FocusController
+ // (FocusHasChanged sets focused_frame_ = main_frame when focused is true).
+ SetPageFocus(true);
+
+ auto* clipboard_change_event_controller =
+ MakeGarbageCollected(
+ *GetFrame().DomWindow()->navigator(), &GetDocument());
+
+ // Unfocus the page. This does NOT clear focused_frame_ (only updates
+ // is_active_ and is_focused_ flags). hasFocus() will now return false.
+ SetPageFocus(false);
+
+ // Trigger clipboard change while unfocused to set
+ // fire_clipboardchange_on_focus_ = true.
+ clipboard_change_event_controller->DidUpdateData();
+ test::RunPendingTasks();
+
+ // Do NOT call FrameDestroyed() — let PageTestBase::TearDown() destroy the
+ // page naturally. During teardown: Page::WillBeDestroyed() -> Frame::Detach()
+ // -> DomWindow()->FrameDestroyed() (context destroyed) ->
+ // FocusController::FrameDetached() -> SetFocusedFrame(nullptr) (because
+ // focused_frame_ == main_frame) -> NotifyFocusChangedObservers() ->
+ // FocusedFrameChanged() -> MaybeDispatchClipboardChangeEvent().
+ // Before the fix: crashes with null dereference.
+}
+
} // namespace blink
diff -Nru chromium-145.0.7632.116/third_party/blink/renderer/modules/webcodecs/background_readback.cc chromium-145.0.7632.159/third_party/blink/renderer/modules/webcodecs/background_readback.cc
--- chromium-145.0.7632.116/third_party/blink/renderer/modules/webcodecs/background_readback.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/third_party/blink/renderer/modules/webcodecs/background_readback.cc 2026-03-02 23:00:09.000000000 +0000
@@ -164,7 +164,8 @@
ReadbackToFrameDoneCallback result_cb) {
DCHECK(CanUseRgbReadback(*txt_frame));
- SkImageInfo info = GetImageInfoForFrame(*txt_frame, txt_frame->coded_size());
+ SkImageInfo info =
+ GetImageInfoForFrame(*txt_frame, txt_frame->visible_rect().size());
const auto format = media::VideoPixelFormatFromSkColorType(
info.colorType(), media::IsOpaque(txt_frame->format()));
@@ -188,7 +189,7 @@
int rgba_stide = result->stride(media::VideoFrame::Plane::kARGB);
DCHECK_GT(rgba_stide, 0);
- gfx::Point src_point;
+ gfx::Point src_point = txt_frame->visible_rect().origin();
auto shared_image = txt_frame->shared_image();
auto origin = shared_image->surface_origin();
std::unique_ptr ri_access =
@@ -250,7 +251,7 @@
base::span dst_pixels = dest_buffer.subspan(offset);
size_t max_bytes_written = stride * src_rect.height();
- if (stride <= 0 || max_bytes_written > dest_buffer.size()) {
+ if (stride <= 0 || max_bytes_written > dst_pixels.size()) {
DLOG(ERROR) << "Buffer is not sufficiently large for readback";
base::BindPostTaskToCurrentDefault(std::move(std::move(done_cb)))
.Run(false);
diff -Nru chromium-145.0.7632.116/third_party/blink/renderer/platform/audio/mac/fft_frame_mac.cc chromium-145.0.7632.159/third_party/blink/renderer/platform/audio/mac/fft_frame_mac.cc
--- chromium-145.0.7632.116/third_party/blink/renderer/platform/audio/mac/fft_frame_mac.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/third_party/blink/renderer/platform/audio/mac/fft_frame_mac.cc 2026-03-02 23:00:09.000000000 +0000
@@ -46,11 +46,11 @@
FFTFrame::FFTSetupDatum::FFTSetupDatum(unsigned log2fft_size) {
// We only need power-of-two sized FFTS, so FFT_RADIX2.
setup_ = vDSP_create_fftsetup(log2fft_size, FFT_RADIX2);
- DCHECK(setup_);
+ CHECK(setup_);
}
FFTFrame::FFTSetupDatum::~FFTSetupDatum() {
- DCHECK(setup_);
+ CHECK(setup_);
vDSP_destroy_fftsetup(setup_);
}
@@ -63,7 +63,7 @@
if (first_call) {
// Make sure we construct the fft_setups vector below on the main thread.
// Once constructed, we can access it from any thread.
- DCHECK(IsMainThread());
+ CHECK(IsMainThread());
first_call = false;
}
@@ -82,7 +82,7 @@
// Make sure allocation of a new setup only occurs on the main thread so we
// don't have a race condition with multiple threads trying to write to the
// same element of the vector.
- DCHECK(IsMainThread());
+ CHECK(IsMainThread());
setup[log2fft_size] = std::make_unique(log2fft_size);
}
@@ -94,8 +94,10 @@
log2fft_size_(static_cast(log2(fft_size))),
real_data_(fft_size),
imag_data_(fft_size) {
+ CHECK_GE(fft_size, MinFFTSize());
+ CHECK_LE(fft_size, MaxFFTSize());
// We only allow power of two
- DCHECK_EQ(1UL << log2fft_size_, fft_size_);
+ CHECK_EQ(1UL << log2fft_size_, fft_size_);
// Initialize the PFFFT_Setup object here so that it will be ready when we
// compute FFTs.
diff -Nru chromium-145.0.7632.116/third_party/blink/renderer/platform/audio/pffft/fft_frame_pffft.cc chromium-145.0.7632.159/third_party/blink/renderer/platform/audio/pffft/fft_frame_pffft.cc
--- chromium-145.0.7632.116/third_party/blink/renderer/platform/audio/pffft/fft_frame_pffft.cc 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/third_party/blink/renderer/platform/audio/pffft/fft_frame_pffft.cc 2026-03-02 23:00:09.000000000 +0000
@@ -24,17 +24,17 @@
const unsigned kMinFFTPow2Size = 5;
FFTFrame::FFTSetup::FFTSetup(unsigned fft_size) {
- DCHECK_LE(fft_size, 1U << kMaxFFTPow2Size);
- DCHECK_GE(fft_size, 1U << kMinFFTPow2Size);
+ CHECK_LE(fft_size, 1U << kMaxFFTPow2Size);
+ CHECK_GE(fft_size, 1U << kMinFFTPow2Size);
// All FFTs we need are FFTs of real signals, and the inverse FFTs produce
// real signals. Hence |PFFFT_REAL|.
setup_ = pffft_new_setup(fft_size, PFFFT_REAL);
- DCHECK(setup_);
+ CHECK(setup_);
}
FFTFrame::FFTSetup::~FFTSetup() {
- DCHECK(setup_);
+ CHECK(setup_);
pffft_destroy_setup(setup_);
}
@@ -56,14 +56,14 @@
// Make sure we construct the fft_setups vector below on the main thread.
// Once constructed, we can access it from any thread.
- DCHECK(IsMainThread());
+ CHECK(IsMainThread());
first_call = false;
base::AutoLock locker(setup_lock);
// Initialize the hash map with all the possible keys (FFT sizes), with a
// value of nullptr because we want to initialize the setup data lazily. The
- // set of valid FFT sizes for PFFFT are of the form 2^k*3^m*5*n where k >=
+ // set of valid FFT sizes for PFFFT are of the form 2^k*3^m*5^n where k >=
// 5, m >= 0, n >= 0. We only go up to a max size of 32768, because we need
// at least an FFT size of 32768 for the convolver node.
@@ -82,7 +82,7 @@
}
// There should be 87 entries when we're done.
- DCHECK_EQ(fft_setups.size(), 87u);
+ CHECK_EQ(fft_setups.size(), 87u);
}
return fft_setups;
@@ -91,7 +91,7 @@
void FFTFrame::InitializeFFTSetupForSize(wtf_size_t fft_size) {
auto& setup = FFTSetups();
- DCHECK(setup.Contains(fft_size));
+ CHECK(setup.Contains(fft_size));
if (setup.find(fft_size)->value == nullptr) {
DEFINE_STATIC_LOCAL(base::Lock, setup_lock, ());
@@ -99,7 +99,7 @@
// Make sure allocation of a new setup only occurs on the main thread so we
// don't have a race condition with multiple threads trying to write to the
// same element of the vector.
- DCHECK(IsMainThread());
+ CHECK(IsMainThread());
auto fft_data = std::make_unique(fft_size);
base::AutoLock locker(setup_lock);
@@ -110,8 +110,8 @@
PFFFT_Setup* FFTFrame::FFTSetupForSize(wtf_size_t fft_size) {
auto& setup = FFTSetups();
- DCHECK(setup.Contains(fft_size));
- DCHECK(setup.find(fft_size)->value);
+ CHECK(setup.Contains(fft_size));
+ CHECK(setup.find(fft_size)->value);
return setup.find(fft_size)->value->GetSetup();
}
@@ -123,6 +123,8 @@
imag_data_(fft_size / 2),
complex_data_(fft_size),
pffft_work_(fft_size) {
+ CHECK_GE(fft_size, MinFFTSize());
+ CHECK_LE(fft_size, MaxFFTSize());
// Initialize the PFFFT_Setup object here so that it will be ready when we
// compute FFTs.
@@ -172,8 +174,8 @@
unsigned hrtf_fft_size =
static_cast(HRTFPanner::FftSizeForSampleRate(sample_rate));
- DCHECK_GT(hrtf_fft_size, 1U << kMinFFTPow2Size);
- DCHECK_LE(hrtf_fft_size, 1U << kMaxFFTPow2Size);
+ CHECK_GT(hrtf_fft_size, 1U << kMinFFTPow2Size);
+ CHECK_LE(hrtf_fft_size, 1U << kMaxFFTPow2Size);
InitializeFFTSetupForSize(hrtf_fft_size);
InitializeFFTSetupForSize(hrtf_fft_size / 2);
diff -Nru chromium-145.0.7632.116/third_party/devtools-frontend/src/front_end/models/stack_trace/StackTraceImpl.test.ts chromium-145.0.7632.159/third_party/devtools-frontend/src/front_end/models/stack_trace/StackTraceImpl.test.ts
--- chromium-145.0.7632.116/third_party/devtools-frontend/src/front_end/models/stack_trace/StackTraceImpl.test.ts 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/third_party/devtools-frontend/src/front_end/models/stack_trace/StackTraceImpl.test.ts 2026-03-02 23:00:09.000000000 +0000
@@ -72,5 +72,9 @@
assert.strictEqual(stringifyFragment(fragment), 'at foo (foo.ts:1:0)');
});
+
+ it('handles empty fragments correctly', () => {
+ assert.lengthOf(FragmentImpl.EMPTY_FRAGMENT.frames, 0);
+ });
});
});
diff -Nru chromium-145.0.7632.116/third_party/devtools-frontend/src/front_end/models/stack_trace/StackTraceImpl.ts chromium-145.0.7632.159/third_party/devtools-frontend/src/front_end/models/stack_trace/StackTraceImpl.ts
--- chromium-145.0.7632.116/third_party/devtools-frontend/src/front_end/models/stack_trace/StackTraceImpl.ts 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/third_party/devtools-frontend/src/front_end/models/stack_trace/StackTraceImpl.ts 2026-03-02 23:00:09.000000000 +0000
@@ -31,7 +31,9 @@
}
export class FragmentImpl implements StackTrace.StackTrace.Fragment {
- readonly node: FrameNode;
+ static readonly EMPTY_FRAGMENT = new FragmentImpl();
+
+ readonly node?: FrameNode;
readonly stackTraces = new Set();
/**
@@ -46,11 +48,15 @@
return node.fragment;
}
- private constructor(node: FrameNode) {
+ private constructor(node?: FrameNode) {
this.node = node;
}
get frames(): FrameImpl[] {
+ if (!this.node) {
+ return [];
+ }
+
const frames: FrameImpl[] = [];
for (const node of this.node.getCallStack()) {
@@ -101,6 +107,10 @@
}
get frames(): DebuggableFrameImpl[] {
+ if (!this.fragment.node) {
+ return [];
+ }
+
const frames: DebuggableFrameImpl[] = [];
let index = 0;
diff -Nru chromium-145.0.7632.116/third_party/devtools-frontend/src/front_end/models/stack_trace/StackTraceModel.test.ts chromium-145.0.7632.159/third_party/devtools-frontend/src/front_end/models/stack_trace/StackTraceModel.test.ts
--- chromium-145.0.7632.116/third_party/devtools-frontend/src/front_end/models/stack_trace/StackTraceModel.test.ts 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/third_party/devtools-frontend/src/front_end/models/stack_trace/StackTraceModel.test.ts 2026-03-02 23:00:09.000000000 +0000
@@ -177,6 +177,15 @@
].join('\n'));
});
+ it('allows empty sync fragments', async () => {
+ const {model} = setup();
+
+ const stackTrace = await model.createFromProtocolRuntime({callFrames: []}, identityTranslateFn);
+
+ assert.lengthOf(stackTrace.syncFragment.frames, 0);
+ assert.lengthOf(stackTrace.asyncFragments, 0);
+ });
+
it('calls the translate function with the correct raw frames', async () => {
const {model, translateSpy} = setup();
const callFrames = [
diff -Nru chromium-145.0.7632.116/third_party/devtools-frontend/src/front_end/models/stack_trace/StackTraceModel.ts chromium-145.0.7632.159/third_party/devtools-frontend/src/front_end/models/stack_trace/StackTraceModel.ts
--- chromium-145.0.7632.116/third_party/devtools-frontend/src/front_end/models/stack_trace/StackTraceModel.ts 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/third_party/devtools-frontend/src/front_end/models/stack_trace/StackTraceModel.ts 2026-03-02 23:00:09.000000000 +0000
@@ -77,7 +77,7 @@
// is re-translated as a side-effect.
// We just need to remember the stack traces of the skipped over fragments, so we can send the
// UPDATED event also to them.
- if (fragment.node.children.length === 0) {
+ if (fragment.node?.children.length === 0) {
translatePromises.push(this.#translateFragment(fragment, translateRawFrames));
}
stackTracesToUpdate = stackTracesToUpdate.union(fragment.stackTraces);
@@ -133,6 +133,10 @@
}
async #createFragment(frames: RawFrame[], rawFramesToUIFrames: TranslateRawFrames): Promise {
+ if (frames.length === 0) {
+ return FragmentImpl.EMPTY_FRAGMENT;
+ }
+
const release = await this.#mutex.acquire();
try {
const node = this.#trie.insert(frames);
@@ -150,6 +154,10 @@
}
async #translateFragment(fragment: FragmentImpl, rawFramesToUIFrames: TranslateRawFrames): Promise {
+ if (!fragment.node) {
+ return;
+ }
+
const rawFrames = fragment.node.getCallStack().map(node => node.rawFrame).toArray();
const uiFrames = await rawFramesToUIFrames(rawFrames, this.target());
console.assert(rawFrames.length === uiFrames.length, 'Broken rawFramesToUIFrames implementation');
diff -Nru chromium-145.0.7632.116/third_party/devtools-frontend/src/front_end/panels/timeline/BUILD.gn chromium-145.0.7632.159/third_party/devtools-frontend/src/front_end/panels/timeline/BUILD.gn
--- chromium-145.0.7632.116/third_party/devtools-frontend/src/front_end/panels/timeline/BUILD.gn 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/third_party/devtools-frontend/src/front_end/panels/timeline/BUILD.gn 2026-03-02 23:00:09.000000000 +0000
@@ -230,8 +230,11 @@
"../../core/sdk:bundle",
"../../models/bindings:bundle",
"../../models/trace:bundle",
+ "../../models/trace_source_maps_resolver:bundle",
"../../models/workspace:bundle",
"../../testing",
+ "../../ui/legacy/components/utils:bundle",
+ "../../ui/legacy/theme_support:bundle",
"./components:bundle",
]
}
diff -Nru chromium-145.0.7632.116/third_party/devtools-frontend/src/front_end/panels/timeline/TimelineUIUtils.ts chromium-145.0.7632.159/third_party/devtools-frontend/src/front_end/panels/timeline/TimelineUIUtils.ts
--- chromium-145.0.7632.116/third_party/devtools-frontend/src/front_end/panels/timeline/TimelineUIUtils.ts 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/third_party/devtools-frontend/src/front_end/panels/timeline/TimelineUIUtils.ts 2026-03-02 23:00:09.000000000 +0000
@@ -313,18 +313,10 @@
*/
idleCallbackRequested: 'Idle callback requested',
/**
- * @description Stack label in Timeline UIUtils of the Performance panel
- */
- recalculationForced: 'Recalculation forced',
- /**
* @description Call site stack label in Timeline UIUtils of the Performance panel
*/
firstLayoutInvalidation: 'First layout invalidation',
/**
- * @description Stack label in Timeline UIUtils of the Performance panel
- */
- layoutForced: 'Layout forced',
- /**
* @description Label in front of CSS property (eg `opacity`) being animated or a CSS animation name (eg `layer-4-fade-in-out`)
*/
animating: 'Animating',
@@ -1725,20 +1717,8 @@
parsedTrace: Trace.TraceModel.ParsedTrace): Promise {
const {startTime} = Trace.Helpers.Timing.eventTimingsMilliSeconds(event);
let initiatorStackLabel = i18nString(UIStrings.initiatorStackTrace);
- let stackLabel = i18nString(UIStrings.functionStack);
- const stackTraceForEvent = Trace.Extras.StackTraceForEvent.get(event, parsedTrace.data);
- if (stackTraceForEvent?.callFrames.length || stackTraceForEvent?.description || stackTraceForEvent?.parent) {
- contentHelper.addSection(i18nString(UIStrings.functionStack));
- await contentHelper.createChildStackTraceElement(stackTraceForEvent);
- // TODO(andoli): also build stack trace component for other events
- // that have a stack trace using the StackTraceForEvent helper.
- } else {
- const stackTrace = Trace.Helpers.Trace.getZeroIndexedStackTraceInEventPayload(event);
- if (stackTrace?.length) {
- contentHelper.addSection(stackLabel);
- await contentHelper.createChildStackTraceElement(TimelineUIUtils.stackTraceFromCallFrames(stackTrace));
- }
- }
+ await contentHelper.appendFunctionStackTraceSection(event, parsedTrace);
+
switch (event.name) {
case Trace.Types.Events.Name.TIMER_FIRE:
initiatorStackLabel = i18nString(UIStrings.timerInstalled);
@@ -1751,11 +1731,9 @@
break;
case Trace.Types.Events.Name.RECALC_STYLE:
initiatorStackLabel = i18nString(UIStrings.firstInvalidated);
- stackLabel = i18nString(UIStrings.recalculationForced);
break;
case Trace.Types.Events.Name.LAYOUT:
initiatorStackLabel = i18nString(UIStrings.firstLayoutInvalidation);
- stackLabel = i18nString(UIStrings.layoutForced);
break;
}
@@ -1768,8 +1746,9 @@
// and the time since the initiator (Pending For).
const stackTrace = Trace.Helpers.Trace.getZeroIndexedStackTraceInEventPayload(initiator);
if (stackTrace) {
- contentHelper.addSection(initiatorStackLabel);
- await contentHelper.createChildStackTraceElement(TimelineUIUtils.stackTraceFromCallFrames(stackTrace));
+ const traceElement =
+ await contentHelper.createChildStackTraceElement(TimelineUIUtils.stackTraceFromCallFrames(stackTrace));
+ contentHelper.appendSectionWithBodyIfExists(initiatorStackLabel, {body: traceElement});
}
const link = this.createEntryLink(initiator);
@@ -2414,6 +2393,39 @@
this.fragment.appendChild(this.element);
}
+ /**
+ * Creates a new section, but only if the provided `body` element is present,
+ * otherwise it does nothing.
+ */
+ appendSectionWithBodyIfExists(title: string, options: {
+ body: HTMLElement|null,
+ swatchColor?: string,
+ event?: Trace.Types.Events.Event,
+ }): void {
+ if (!options.body) {
+ return;
+ }
+ this.addSection(title, options.swatchColor, options.event);
+ this.tableElement.appendChild(options.body);
+ }
+
+ /**
+ * Generates a stack trace for the given event. If there is no stack data,
+ * nothing is appended; you can safely call this without fearing that it will
+ * create an empty section.
+ */
+ async appendFunctionStackTraceSection(
+ event: Trace.Types.Events.Event,
+ parsedTrace: Trace.TraceModel.ParsedTrace,
+ ): Promise {
+ const stackTraceForEvent = Trace.Extras.StackTraceForEvent.get(event, parsedTrace.data);
+ if (!stackTraceForEvent) {
+ return;
+ }
+ const traceElement = await this.createChildStackTraceElement(stackTraceForEvent);
+ this.appendSectionWithBodyIfExists(i18nString(UIStrings.functionStack), {body: traceElement});
+ }
+
linkifier(): LegacyComponents.Linkifier.Linkifier|null {
return this.#linkifier;
}
@@ -2481,9 +2493,13 @@
this.appendElementRow(title, locationContent);
}
- async createChildStackTraceElement(runtimeStackTrace: Protocol.Runtime.StackTrace): Promise {
+ /**
+ * Creates a stack trace element for the given trace, but checks if it
+ * contains any entries, and discards it if it's empty.
+ */
+ async createChildStackTraceElement(runtimeStackTrace: Protocol.Runtime.StackTrace): Promise {
if (!this.#linkifier) {
- return;
+ return null;
}
let callFrameContents;
@@ -2493,7 +2509,6 @@
callFrameContents = new LegacyComponents.JSPresentationUtils.StackTracePreviewContent(
undefined, this.target ?? undefined, this.#linkifier, {tabStops: true, showColumnNumber: true});
callFrameContents.stackTrace = stackTrace;
- await callFrameContents.updateComplete;
} else {
// I _think_ this only happens during tests.
// See "TimelineFlameChartView > shows the details for a selected main thread event".
@@ -2505,10 +2520,16 @@
{runtimeStackTrace, tabStops: true, showColumnNumber: true});
}
- const stackTraceElement =
- this.tableElement.createChild('div', 'timeline-details-view-row timeline-details-stack-values');
+ await callFrameContents.updateComplete;
+ if (!callFrameContents.hasContent()) {
+ return null;
+ }
+
+ const stackTraceElement = document.createElement('div');
+ stackTraceElement.classList.add('timeline-details-view-row', 'timeline-details-stack-values');
callFrameContents.markAsRoot();
callFrameContents.show(stackTraceElement);
+ return stackTraceElement;
}
}
diff -Nru chromium-145.0.7632.116/third_party/devtools-frontend/src/front_end/ui/legacy/components/utils/JSPresentationUtils.test.ts chromium-145.0.7632.159/third_party/devtools-frontend/src/front_end/ui/legacy/components/utils/JSPresentationUtils.test.ts
--- chromium-145.0.7632.116/third_party/devtools-frontend/src/front_end/ui/legacy/components/utils/JSPresentationUtils.test.ts 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/third_party/devtools-frontend/src/front_end/ui/legacy/components/utils/JSPresentationUtils.test.ts 2026-03-02 23:00:09.000000000 +0000
@@ -126,6 +126,7 @@
const component =
new Components.JSPresentationUtils.StackTracePreviewContent(undefined, target, linkifier, options);
renderElementIntoDOM(component);
+ assert.isFalse(component.hasContent());
component.stackTrace = stackTrace;
await component.updateComplete;
assert.deepEqual(component.contentElement.deepInnerText().split('\n'), ['\tfoo\t@\twww.google.com/script.js:1']);
@@ -133,6 +134,7 @@
assert.exists(expandButton);
expandButton.click();
await component.updateComplete;
+ assert.isTrue(component.hasContent());
assert.deepEqual(component.contentElement.deepInnerText().split('\n'), [
'\tfoo\t@\twww.google.com/script.js:1',
'\tbar\t@\tbar.js:2',
diff -Nru chromium-145.0.7632.116/third_party/devtools-frontend/src/front_end/ui/legacy/components/utils/JSPresentationUtils.ts chromium-145.0.7632.159/third_party/devtools-frontend/src/front_end/ui/legacy/components/utils/JSPresentationUtils.ts
--- chromium-145.0.7632.116/third_party/devtools-frontend/src/front_end/ui/legacy/components/utils/JSPresentationUtils.ts 2026-02-20 20:20:04.000000000 +0000
+++ chromium-145.0.7632.159/third_party/devtools-frontend/src/front_end/ui/legacy/components/utils/JSPresentationUtils.ts 2026-03-02 23:00:09.000000000 +0000
@@ -324,6 +324,11 @@
#links: HTMLElement[] = [];
readonly #table: HTMLElement;
+ /**
+ * Updated when we update to define if we have any rows for the StackTrace;
+ * allowing the caller to know if this element is empty or not.
+ */
+ #hasRows = false;
constructor(element?: HTMLElement, target?: SDK.Target.Target, linkifier?: Linkifier, options?: Options) {
super(element, {useShadowDom: true});
@@ -353,6 +358,10 @@
this.performUpdate();
}
+ hasContent(): boolean {
+ return this.#hasRows;
+ }
+
override performUpdate(): void {
if (!this.#linkifier) {
return;
@@ -363,6 +372,7 @@
if (this.#stackTrace) {
const stackTraceRows = buildStackTraceRows(
this.#stackTrace, this.#target ?? null, this.#linkifier, tabStops, this.#options.showColumnNumber);
+ this.#hasRows = stackTraceRows.length > 0;
this.#links = renderStackTraceTable(this.#table, this.element, this.#options.expandable ?? false, stackTraceRows);
return;
}
@@ -373,6 +383,7 @@
const stackTraceRows = buildStackTraceRowsForLegacyRuntimeStackTrace(
runtimeStackTrace ?? {callFrames: []}, this.#target ?? null, this.#linkifier, tabStops, updateCallback,
this.#options.showColumnNumber);
+ this.#hasRows = stackTraceRows.length > 0;
this.#links = renderStackTraceTable(this.#table, this.element, this.#options.expandable ?? false, stackTraceRows);
}
diff -Nru chromium-145.0.7632.116/third_party/libxslt/BUILD.gn chromium-145.0.7632.159/third_party/libxslt/BUILD.gn
--- chromium-145.0.7632.116/third_party/libxslt/BUILD.gn 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/BUILD.gn 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,113 @@
+# Copyright 2014 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+config("libxslt_config") {
+ defines = [ "LIBXSLT_STATIC" ]
+
+ # TODO(crbug.com/364568421): Consdier removing "src/libxslt" from this list
+ # if we can remove win32config.h
+ include_dirs = [
+ "src",
+ "src/libxslt",
+ ]
+}
+
+config("libxslt_warnings") {
+ if (is_clang) {
+ cflags = [
+ # libxslt stores a char[3] in a `const unsigned char*`.
+ "-Wno-pointer-sign",
+
+ # xsltDefaultRegion and xsltCalibrateTimestamps are only
+ # used with certain preprocessor defines set.
+ "-Wno-unused-function",
+ ]
+ }
+}
+
+static_library("libxslt") {
+ sources = [
+ "src/libxslt/attributes.c",
+ "src/libxslt/attributes.h",
+ "src/libxslt/attrvt.c",
+ "src/libxslt/documents.c",
+ "src/libxslt/documents.h",
+ "src/libxslt/extensions.c",
+ "src/libxslt/extensions.h",
+ "src/libxslt/extra.c",
+ "src/libxslt/extra.h",
+ "src/libxslt/functions.c",
+ "src/libxslt/functions.h",
+ "src/libxslt/imports.c",
+ "src/libxslt/imports.h",
+ "src/libxslt/keys.c",
+ "src/libxslt/keys.h",
+ "src/libxslt/libxslt.h",
+ "src/libxslt/namespaces.c",
+ "src/libxslt/namespaces.h",
+ "src/libxslt/numbers.c",
+ "src/libxslt/numbersInternals.h",
+ "src/libxslt/pattern.c",
+ "src/libxslt/pattern.h",
+ "src/libxslt/preproc.c",
+ "src/libxslt/preproc.h",
+ "src/libxslt/security.c",
+ "src/libxslt/security.h",
+ "src/libxslt/templates.c",
+ "src/libxslt/templates.h",
+ "src/libxslt/transform.c",
+ "src/libxslt/transform.h",
+ "src/libxslt/trio.h",
+ "src/libxslt/triodef.h",
+ "src/libxslt/variables.c",
+ "src/libxslt/variables.h",
+ "src/libxslt/win32config.h",
+ "src/libxslt/xslt.c",
+ "src/libxslt/xslt.h",
+ "src/libxslt/xsltInternals.h",
+ "src/libxslt/xsltconfig.h",
+ "src/libxslt/xsltexports.h",
+ "src/libxslt/xsltlocale.c",
+ "src/libxslt/xsltlocale.h",
+ "src/libxslt/xsltutils.c",
+ "src/libxslt/xsltutils.h",
+ "win32/config.h",
+ ]
+
+ configs -= [ "//build/config/compiler:chromium_code" ]
+ configs += [
+ "//build/config/compiler:no_chromium_code",
+
+ # Must be after no_chromium_code for warning flags to be ordered correctly.
+ ":libxslt_warnings",
+ ]
+ public_configs = [ ":libxslt_config" ]
+
+ if (is_linux || is_chromeos) {
+ sources += [ "linux/config.h" ]
+ }
+ if (is_apple) {
+ sources += [ "mac/config.h" ]
+ }
+
+ cflags = []
+ if (is_linux || is_chromeos || is_android || is_fuchsia) {
+ include_dirs = [ "linux" ]
+ } else if (is_win) {
+ include_dirs = [ "win32" ]
+ cflags += [
+ "/wd4267", # size_t to int.
+
+ # TODO(brucedawson): http://crbug.com/554200 4311 is a VS
+ # 2015 64-bit warning for pointer truncation
+ "/wd4311",
+ ]
+ } else if (is_apple) {
+ include_dirs = [ "mac" ]
+ }
+
+ deps = [ "//third_party/libxml" ]
+
+ visibility = [ "//third_party/blink/renderer/*" ]
+}
diff -Nru chromium-145.0.7632.116/third_party/libxslt/DIR_METADATA chromium-145.0.7632.159/third_party/libxslt/DIR_METADATA
--- chromium-145.0.7632.116/third_party/libxslt/DIR_METADATA 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/DIR_METADATA 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,6 @@
+monorail: {
+ component: "Blink>XML"
+}
+buganizer_public: {
+ component_id: 1456730
+}
diff -Nru chromium-145.0.7632.116/third_party/libxslt/OWNERS chromium-145.0.7632.159/third_party/libxslt/OWNERS
--- chromium-145.0.7632.116/third_party/libxslt/OWNERS 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/OWNERS 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1 @@
+file://third_party/libxml/OWNERS
diff -Nru chromium-145.0.7632.116/third_party/libxslt/README.chromium chromium-145.0.7632.159/third_party/libxslt/README.chromium
--- chromium-145.0.7632.116/third_party/libxslt/README.chromium 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/README.chromium 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,16 @@
+Name: libxslt
+URL: http://xmlsoft.org/XSLT
+Revision: 35323d6a15f6e63c9919ddbc0abe64c90a0dd88a
+Update Mechanism: Manual
+Version: 35323d6a15f6e63c9919ddbc0abe64c90a0dd88a
+CPEPrefix: cpe:/a:xmlsoft:libxslt:1.1.45
+Security Critical: yes
+Shipped: yes
+License: X11
+License File: src/Copyright
+
+Description:
+
+libxslt from libxml.org.
+
+Modifications: Apply the patches in chromium/*.patch
diff -Nru chromium-145.0.7632.116/third_party/libxslt/chromium/0004-Use-a-dedicated-node-type-to-maintain-the-list-of-ca.patch chromium-145.0.7632.159/third_party/libxslt/chromium/0004-Use-a-dedicated-node-type-to-maintain-the-list-of-ca.patch
--- chromium-145.0.7632.116/third_party/libxslt/chromium/0004-Use-a-dedicated-node-type-to-maintain-the-list-of-ca.patch 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/chromium/0004-Use-a-dedicated-node-type-to-maintain-the-list-of-ca.patch 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,707 @@
+From 6ce8f3bf2b51befcea2af489bc859d690888981f Mon Sep 17 00:00:00 2001
+From: Daniel Cheng
+Date: Wed, 4 Jun 2025 12:19:14 -0700
+Subject: [PATCH] Use a dedicated node type to maintain the list of cached RVTs
+
+While evaluating a stylesheet, result value trees (result tree fragments
+in the XSLT spec) are represented as xmlDocs and cached on the transform
+context in a linked list, using xmlDoc's prev and next pointers to
+maintain the list.
+
+However, XPath evaluations can inadvertently traverse these links, which
+are an implementation detail and do not reflect the actual document
+structure. Using a dedicated node type avoids these unintended
+traversals.
+
+Bug: 416535738
+Change-Id: Iaacbe617905a3f844367cc56b2cbcf525d4818b6
+---
+ third_party/libxslt/src/libxslt/transform.c | 87 ++++---
+ third_party/libxslt/src/libxslt/variables.c | 219 +++++++++++-------
+ .../libxslt/src/libxslt/xsltInternals.h | 23 +-
+ 3 files changed, 199 insertions(+), 130 deletions(-)
+
+diff --git a/third_party/libxslt/src/libxslt/transform.c b/third_party/libxslt/src/libxslt/transform.c
+index 6ce73d2526e32..ac89c9b96bac4 100644
+--- a/libxslt/transform.c
++++ b/libxslt/transform.c
+@@ -518,19 +518,20 @@ xsltTransformCacheFree(xsltTransformCachePtr cache)
+ /*
+ * Free tree fragments.
+ */
+- if (cache->RVT) {
+- xmlDocPtr tmp, cur = cache->RVT;
++ if (cache->rvtList) {
++ xsltRVTListPtr tmp, cur = cache->rvtList;
+ while (cur) {
+ tmp = cur;
+- cur = (xmlDocPtr) cur->next;
+- if (tmp->_private != NULL) {
++ cur = cur->next;
++ if (tmp->RVT->_private != NULL) {
+ /*
+- * Tree the document info.
++ * Free the document info.
+ */
+- xsltFreeDocumentKeys((xsltDocumentPtr) tmp->_private);
+- xmlFree(tmp->_private);
++ xsltFreeDocumentKeys((xsltDocumentPtr) tmp->RVT->_private);
++ xmlFree(tmp->RVT->_private);
+ }
+- xmlFreeDoc(tmp);
++ xmlFreeDoc(tmp->RVT);
++ xmlFree(tmp);
+ }
+ }
+ /*
+@@ -2263,38 +2264,36 @@ xsltLocalVariablePush(xsltTransformContextPtr ctxt,
+ * are preserved; all other fragments are freed/cached.
+ */
+ static void
+-xsltReleaseLocalRVTs(xsltTransformContextPtr ctxt, xmlDocPtr base)
++xsltReleaseLocalRVTs(xsltTransformContextPtr ctxt, xsltRVTListPtr base)
+ {
+- xmlDocPtr cur = ctxt->localRVT, tmp;
++ xsltRVTListPtr cur = ctxt->localRVTList, tmp;
+
+ if (cur == base)
+ return;
+- if (cur->prev != NULL)
+- xsltTransformError(ctxt, NULL, NULL, "localRVT not head of list\n");
+
+- /* Reset localRVT early because some RVTs might be registered again. */
+- ctxt->localRVT = base;
+- if (base != NULL)
+- base->prev = NULL;
++ /* Reset localRVTList early because some RVTs might be registered again. */
++ ctxt->localRVTList = base;
+
+ do {
+ tmp = cur;
+- cur = (xmlDocPtr) cur->next;
+- if (tmp->compression == XSLT_RVT_LOCAL) {
+- xsltReleaseRVT(ctxt, tmp);
+- } else if (tmp->compression == XSLT_RVT_GLOBAL) {
+- xsltRegisterPersistRVT(ctxt, tmp);
+- } else if (tmp->compression == XSLT_RVT_FUNC_RESULT) {
++ cur = cur->next;
++ if (tmp->RVT->compression == XSLT_RVT_LOCAL) {
++ xsltReleaseRVTList(ctxt, tmp);
++ } else if (tmp->RVT->compression == XSLT_RVT_GLOBAL) {
++ xsltRegisterPersistRVT(ctxt, tmp->RVT);
++ xmlFree(tmp);
++ } else if (tmp->RVT->compression == XSLT_RVT_FUNC_RESULT) {
+ /*
+ * This will either register the RVT again or move it to the
+ * context variable.
+ */
+- xsltRegisterLocalRVT(ctxt, tmp);
+- tmp->compression = XSLT_RVT_FUNC_RESULT;
++ xsltRegisterLocalRVT(ctxt, tmp->RVT);
++ tmp->RVT->compression = XSLT_RVT_FUNC_RESULT;
++ xmlFree(tmp);
+ } else {
+ xmlGenericError(xmlGenericErrorContext,
+- "xsltReleaseLocalRVTs: Unexpected RVT flag %p\n",
+- tmp->psvi);
++ "xsltReleaseLocalRVTs: Unexpected RVT flag %d\n",
++ tmp->RVT->compression);
+ }
+ } while (cur != base);
+ }
+@@ -2322,7 +2321,7 @@ xsltApplySequenceConstructor(xsltTransformContextPtr ctxt,
+ xmlNodePtr oldInsert, oldInst, oldCurInst, oldContextNode;
+ xmlNodePtr cur, insert, copy = NULL;
+ int level = 0, oldVarsNr;
+- xmlDocPtr oldLocalFragmentTop;
++ xsltRVTListPtr oldLocalFragmentTop;
+
+ #ifdef XSLT_REFACTORED
+ xsltStylePreCompPtr info;
+@@ -2368,7 +2367,7 @@ xsltApplySequenceConstructor(xsltTransformContextPtr ctxt,
+ }
+ ctxt->depth++;
+
+- oldLocalFragmentTop = ctxt->localRVT;
++ oldLocalFragmentTop = ctxt->localRVTList;
+ oldInsert = insert = ctxt->insert;
+ oldInst = oldCurInst = ctxt->inst;
+ oldContextNode = ctxt->node;
+@@ -2602,7 +2601,7 @@ xsltApplySequenceConstructor(xsltTransformContextPtr ctxt,
+ /*
+ * Cleanup temporary tree fragments.
+ */
+- if (oldLocalFragmentTop != ctxt->localRVT)
++ if (oldLocalFragmentTop != ctxt->localRVTList)
+ xsltReleaseLocalRVTs(ctxt, oldLocalFragmentTop);
+
+ ctxt->insert = oldInsert;
+@@ -2697,7 +2696,7 @@ xsltApplySequenceConstructor(xsltTransformContextPtr ctxt,
+ /*
+ * Cleanup temporary tree fragments.
+ */
+- if (oldLocalFragmentTop != ctxt->localRVT)
++ if (oldLocalFragmentTop != ctxt->localRVTList)
+ xsltReleaseLocalRVTs(ctxt, oldLocalFragmentTop);
+
+ ctxt->insert = oldInsert;
+@@ -2763,7 +2762,7 @@ xsltApplySequenceConstructor(xsltTransformContextPtr ctxt,
+ /*
+ * Cleanup temporary tree fragments.
+ */
+- if (oldLocalFragmentTop != ctxt->localRVT)
++ if (oldLocalFragmentTop != ctxt->localRVTList)
+ xsltReleaseLocalRVTs(ctxt, oldLocalFragmentTop);
+
+ ctxt->insert = oldInsert;
+@@ -2893,7 +2892,7 @@ xsltApplySequenceConstructor(xsltTransformContextPtr ctxt,
+ /*
+ * Cleanup temporary tree fragments.
+ */
+- if (oldLocalFragmentTop != ctxt->localRVT)
++ if (oldLocalFragmentTop != ctxt->localRVTList)
+ xsltReleaseLocalRVTs(ctxt, oldLocalFragmentTop);
+
+ ctxt->insert = oldInsert;
+@@ -3072,7 +3071,7 @@ xsltApplyXSLTTemplate(xsltTransformContextPtr ctxt,
+ int oldVarsBase = 0;
+ xmlNodePtr cur;
+ xsltStackElemPtr tmpParam = NULL;
+- xmlDocPtr oldUserFragmentTop;
++ xsltRVTListPtr oldUserFragmentTop;
+ #ifdef WITH_PROFILER
+ long start = 0;
+ #endif
+@@ -3120,8 +3119,8 @@ xsltApplyXSLTTemplate(xsltTransformContextPtr ctxt,
+ return;
+ }
+
+- oldUserFragmentTop = ctxt->tmpRVT;
+- ctxt->tmpRVT = NULL;
++ oldUserFragmentTop = ctxt->tmpRVTList;
++ ctxt->tmpRVTList = NULL;
+
+ /*
+ * Initiate a distinct scope of local params/variables.
+@@ -3232,16 +3231,16 @@ xsltApplyXSLTTemplate(xsltTransformContextPtr ctxt,
+ * user code should now use xsltRegisterLocalRVT() instead
+ * of the obsolete xsltRegisterTmpRVT().
+ */
+- if (ctxt->tmpRVT) {
+- xmlDocPtr curdoc = ctxt->tmpRVT, tmp;
++ if (ctxt->tmpRVTList) {
++ xsltRVTListPtr curRVTList = ctxt->tmpRVTList, tmp;
+
+- while (curdoc != NULL) {
+- tmp = curdoc;
+- curdoc = (xmlDocPtr) curdoc->next;
+- xsltReleaseRVT(ctxt, tmp);
++ while (curRVTList != NULL) {
++ tmp = curRVTList;
++ curRVTList = curRVTList->next;
++ xsltReleaseRVTList(ctxt, tmp);
+ }
+ }
+- ctxt->tmpRVT = oldUserFragmentTop;
++ ctxt->tmpRVTList = oldUserFragmentTop;
+
+ /*
+ * Pop the xsl:template declaration from the stack.
+@@ -5319,7 +5318,7 @@ xsltIf(xsltTransformContextPtr ctxt, xmlNodePtr contextNode,
+
+ #ifdef XSLT_FAST_IF
+ {
+- xmlDocPtr oldLocalFragmentTop = ctxt->localRVT;
++ xsltRVTListPtr oldLocalFragmentTop = ctxt->localRVTList;
+
+ res = xsltPreCompEvalToBoolean(ctxt, contextNode, comp);
+
+@@ -5327,7 +5326,7 @@ xsltIf(xsltTransformContextPtr ctxt, xmlNodePtr contextNode,
+ * Cleanup fragments created during evaluation of the
+ * "select" expression.
+ */
+- if (oldLocalFragmentTop != ctxt->localRVT)
++ if (oldLocalFragmentTop != ctxt->localRVTList)
+ xsltReleaseLocalRVTs(ctxt, oldLocalFragmentTop);
+ }
+
+diff --git a/libxslt/variables.c b/libxslt/variables.c
+index eb98aab2fdc90..6696d9a1315c8 100644
+--- a/libxslt/variables.c
++++ b/libxslt/variables.c
+@@ -47,6 +47,21 @@ static const xmlChar *xsltComputingGlobalVarMarker =
+ #define XSLT_VAR_IN_SELECT (1<<1)
+ #define XSLT_TCTXT_VARIABLE(c) ((xsltStackElemPtr) (c)->contextVariable)
+
++static xsltRVTListPtr
++xsltRVTListCreate(void)
++{
++ xsltRVTListPtr ret;
++
++ ret = (xsltRVTListPtr) xmlMalloc(sizeof(xsltRVTList));
++ if (ret == NULL) {
++ xsltTransformError(NULL, NULL, NULL,
++ "xsltRVTListCreate: malloc failed\n");
++ return(NULL);
++ }
++ memset(ret, 0, sizeof(xsltRVTList));
++ return(ret);
++}
++
+ /************************************************************************
+ * *
+ * Result Value Tree (Result Tree Fragment) interfaces *
+@@ -64,6 +79,7 @@ static const xmlChar *xsltComputingGlobalVarMarker =
+ xmlDocPtr
+ xsltCreateRVT(xsltTransformContextPtr ctxt)
+ {
++ xsltRVTListPtr rvtList;
+ xmlDocPtr container;
+
+ /*
+@@ -76,12 +92,11 @@ xsltCreateRVT(xsltTransformContextPtr ctxt)
+ /*
+ * Reuse a RTF from the cache if available.
+ */
+- if (ctxt->cache->RVT) {
+- container = ctxt->cache->RVT;
+- ctxt->cache->RVT = (xmlDocPtr) container->next;
+- /* clear the internal pointers */
+- container->next = NULL;
+- container->prev = NULL;
++ if (ctxt->cache->rvtList) {
++ rvtList = ctxt->cache->rvtList;
++ container = ctxt->cache->rvtList->RVT;
++ ctxt->cache->rvtList = rvtList->next;
++ xmlFree(rvtList);
+ if (ctxt->cache->nbRVT > 0)
+ ctxt->cache->nbRVT--;
+ #ifdef XSLT_DEBUG_PROFILE_CACHE
+@@ -119,11 +134,16 @@ xsltCreateRVT(xsltTransformContextPtr ctxt)
+ int
+ xsltRegisterTmpRVT(xsltTransformContextPtr ctxt, xmlDocPtr RVT)
+ {
++ xsltRVTListPtr list;
++
+ if ((ctxt == NULL) || (RVT == NULL))
+ return(-1);
+
+- RVT->prev = NULL;
++ list = xsltRVTListCreate();
++ if (list == NULL) return(-1);
++
+ RVT->compression = XSLT_RVT_LOCAL;
++ list->RVT = RVT;
+
+ /*
+ * We'll restrict the lifetime of user-created fragments
+@@ -131,15 +151,13 @@ xsltRegisterTmpRVT(xsltTransformContextPtr ctxt, xmlDocPtr RVT)
+ * var/param itself.
+ */
+ if (ctxt->contextVariable != NULL) {
+- RVT->next = (xmlNodePtr) XSLT_TCTXT_VARIABLE(ctxt)->fragment;
+- XSLT_TCTXT_VARIABLE(ctxt)->fragment = RVT;
++ list->next = XSLT_TCTXT_VARIABLE(ctxt)->fragment;
++ XSLT_TCTXT_VARIABLE(ctxt)->fragment = list;
+ return(0);
+ }
+
+- RVT->next = (xmlNodePtr) ctxt->tmpRVT;
+- if (ctxt->tmpRVT != NULL)
+- ctxt->tmpRVT->prev = (xmlNodePtr) RVT;
+- ctxt->tmpRVT = RVT;
++ list->next = ctxt->tmpRVTList;
++ ctxt->tmpRVTList = list;
+ return(0);
+ }
+
+@@ -159,11 +177,16 @@ int
+ xsltRegisterLocalRVT(xsltTransformContextPtr ctxt,
+ xmlDocPtr RVT)
+ {
++ xsltRVTListPtr list;
++
+ if ((ctxt == NULL) || (RVT == NULL))
+ return(-1);
+
+- RVT->prev = NULL;
++ list = xsltRVTListCreate();
++ if (list == NULL) return(-1);
++
+ RVT->compression = XSLT_RVT_LOCAL;
++ list->RVT = RVT;
+
+ /*
+ * When evaluating "select" expressions of xsl:variable
+@@ -174,8 +197,8 @@ xsltRegisterLocalRVT(xsltTransformContextPtr ctxt,
+ if ((ctxt->contextVariable != NULL) &&
+ (XSLT_TCTXT_VARIABLE(ctxt)->flags & XSLT_VAR_IN_SELECT))
+ {
+- RVT->next = (xmlNodePtr) XSLT_TCTXT_VARIABLE(ctxt)->fragment;
+- XSLT_TCTXT_VARIABLE(ctxt)->fragment = RVT;
++ list->next = XSLT_TCTXT_VARIABLE(ctxt)->fragment;
++ XSLT_TCTXT_VARIABLE(ctxt)->fragment = list;
+ return(0);
+ }
+ /*
+@@ -183,10 +206,8 @@ xsltRegisterLocalRVT(xsltTransformContextPtr ctxt,
+ * If not reference by a returning instruction (like EXSLT's function),
+ * then this fragment will be freed, when the instruction exits.
+ */
+- RVT->next = (xmlNodePtr) ctxt->localRVT;
+- if (ctxt->localRVT != NULL)
+- ctxt->localRVT->prev = (xmlNodePtr) RVT;
+- ctxt->localRVT = RVT;
++ list->next = ctxt->localRVTList;
++ ctxt->localRVTList = list;
+ return(0);
+ }
+
+@@ -344,8 +365,9 @@ xsltFlagRVTs(xsltTransformContextPtr ctxt, xmlXPathObjectPtr obj, int val) {
+ * @ctxt: an XSLT transformation context
+ * @RVT: a result value tree (Result Tree Fragment)
+ *
+- * Either frees the RVT (which is an xmlDoc) or stores
+- * it in the context's cache for later reuse.
++ * Either frees the RVT (which is an xmlDoc) or stores it in the context's
++ * cache for later reuse. Preserved for ABI/API compatibility; internal use
++ * has all migrated to xsltReleaseRVTList().
+ */
+ void
+ xsltReleaseRVT(xsltTransformContextPtr ctxt, xmlDocPtr RVT)
+@@ -353,36 +375,64 @@ xsltReleaseRVT(xsltTransformContextPtr ctxt, xmlDocPtr RVT)
+ if (RVT == NULL)
+ return;
+
++ xsltRVTListPtr list = xsltRVTListCreate();
++ if (list == NULL) {
++ if (RVT->_private != NULL) {
++ xsltFreeDocumentKeys((xsltDocumentPtr) RVT->_private);
++ xmlFree(RVT->_private);
++ }
++ xmlFreeDoc(RVT);
++ return;
++ }
++
++ xsltReleaseRVTList(ctxt, list);
++}
++
++/**
++ * xsltReleaseRVTList:
++ * @ctxt: an XSLT transformation context
++ * @list: a list node containing a result value tree (Result Tree Fragment)
++ *
++ * Either frees the list node or stores it in the context's cache for later
++ * reuse. Optimization to avoid adding a fallible allocation path when the
++ * caller already has a RVT list node.
++ */
++void
++xsltReleaseRVTList(xsltTransformContextPtr ctxt, xsltRVTListPtr list)
++{
++ if (list == NULL)
++ return;
++
+ if (ctxt && (ctxt->cache->nbRVT < 40)) {
+ /*
+ * Store the Result Tree Fragment.
+ * Free the document info.
+ */
+- if (RVT->_private != NULL) {
+- xsltFreeDocumentKeys((xsltDocumentPtr) RVT->_private);
+- xmlFree(RVT->_private);
+- RVT->_private = NULL;
++ if (list->RVT->_private != NULL) {
++ xsltFreeDocumentKeys((xsltDocumentPtr) list->RVT->_private);
++ xmlFree(list->RVT->_private);
++ list->RVT->_private = NULL;
+ }
+ /*
+ * Clear the document tree.
+ */
+- if (RVT->children != NULL) {
+- xmlFreeNodeList(RVT->children);
+- RVT->children = NULL;
+- RVT->last = NULL;
++ if (list->RVT->children != NULL) {
++ xmlFreeNodeList(list->RVT->children);
++ list->RVT->children = NULL;
++ list->RVT->last = NULL;
+ }
+- if (RVT->ids != NULL) {
+- xmlFreeIDTable((xmlIDTablePtr) RVT->ids);
+- RVT->ids = NULL;
++ if (list->RVT->ids != NULL) {
++ xmlFreeIDTable((xmlIDTablePtr) list->RVT->ids);
++ list->RVT->ids = NULL;
+ }
+
+ /*
+ * Reset the ownership information.
+ */
+- RVT->compression = 0;
++ list->RVT->compression = 0;
+
+- RVT->next = (xmlNodePtr) ctxt->cache->RVT;
+- ctxt->cache->RVT = RVT;
++ list->next = ctxt->cache->rvtList;
++ ctxt->cache->rvtList = list;
+
+ ctxt->cache->nbRVT++;
+
+@@ -394,11 +444,12 @@ xsltReleaseRVT(xsltTransformContextPtr ctxt, xmlDocPtr RVT)
+ /*
+ * Free it.
+ */
+- if (RVT->_private != NULL) {
+- xsltFreeDocumentKeys((xsltDocumentPtr) RVT->_private);
+- xmlFree(RVT->_private);
++ if (list->RVT->_private != NULL) {
++ xsltFreeDocumentKeys((xsltDocumentPtr) list->RVT->_private);
++ xmlFree(list->RVT->_private);
+ }
+- xmlFreeDoc(RVT);
++ xmlFreeDoc(list->RVT);
++ xmlFree(list);
+ }
+
+ /**
+@@ -416,14 +467,17 @@ xsltReleaseRVT(xsltTransformContextPtr ctxt, xmlDocPtr RVT)
+ int
+ xsltRegisterPersistRVT(xsltTransformContextPtr ctxt, xmlDocPtr RVT)
+ {
++ xsltRVTListPtr list;
++
+ if ((ctxt == NULL) || (RVT == NULL)) return(-1);
+
++ list = xsltRVTListCreate();
++ if (list == NULL) return(-1);
++
+ RVT->compression = XSLT_RVT_GLOBAL;
+- RVT->prev = NULL;
+- RVT->next = (xmlNodePtr) ctxt->persistRVT;
+- if (ctxt->persistRVT != NULL)
+- ctxt->persistRVT->prev = (xmlNodePtr) RVT;
+- ctxt->persistRVT = RVT;
++ list->RVT = RVT;
++ list->next = ctxt->persistRVTList;
++ ctxt->persistRVTList = list;
+ return(0);
+ }
+
+@@ -438,52 +492,55 @@ xsltRegisterPersistRVT(xsltTransformContextPtr ctxt, xmlDocPtr RVT)
+ void
+ xsltFreeRVTs(xsltTransformContextPtr ctxt)
+ {
+- xmlDocPtr cur, next;
++ xsltRVTListPtr cur, next;
+
+ if (ctxt == NULL)
+ return;
+ /*
+ * Local fragments.
+ */
+- cur = ctxt->localRVT;
++ cur = ctxt->localRVTList;
+ while (cur != NULL) {
+- next = (xmlDocPtr) cur->next;
+- if (cur->_private != NULL) {
+- xsltFreeDocumentKeys(cur->_private);
+- xmlFree(cur->_private);
++ next = cur->next;
++ if (cur->RVT->_private != NULL) {
++ xsltFreeDocumentKeys(cur->RVT->_private);
++ xmlFree(cur->RVT->_private);
+ }
+- xmlFreeDoc(cur);
++ xmlFreeDoc(cur->RVT);
++ xmlFree(cur);
+ cur = next;
+ }
+- ctxt->localRVT = NULL;
++ ctxt->localRVTList = NULL;
+ /*
+ * User-created per-template fragments.
+ */
+- cur = ctxt->tmpRVT;
++ cur = ctxt->tmpRVTList;
+ while (cur != NULL) {
+- next = (xmlDocPtr) cur->next;
+- if (cur->_private != NULL) {
+- xsltFreeDocumentKeys(cur->_private);
+- xmlFree(cur->_private);
++ next = cur->next;
++ if (cur->RVT->_private != NULL) {
++ xsltFreeDocumentKeys(cur->RVT->_private);
++ xmlFree(cur->RVT->_private);
+ }
+- xmlFreeDoc(cur);
++ xmlFreeDoc(cur->RVT);
++ xmlFree(cur);
+ cur = next;
+ }
+- ctxt->tmpRVT = NULL;
++ ctxt->tmpRVTList = NULL;
+ /*
+ * Global fragments.
+ */
+- cur = ctxt->persistRVT;
++ cur = ctxt->persistRVTList;
+ while (cur != NULL) {
+- next = (xmlDocPtr) cur->next;
+- if (cur->_private != NULL) {
+- xsltFreeDocumentKeys(cur->_private);
+- xmlFree(cur->_private);
++ next = cur->next;
++ if (cur->RVT->_private != NULL) {
++ xsltFreeDocumentKeys(cur->RVT->_private);
++ xmlFree(cur->RVT->_private);
+ }
+- xmlFreeDoc(cur);
++ xmlFreeDoc(cur->RVT);
++ xmlFree(cur);
+ cur = next;
+ }
+- ctxt->persistRVT = NULL;
++ ctxt->persistRVTList = NULL;
+ }
+
+ /************************************************************************
+@@ -571,21 +628,22 @@ xsltFreeStackElem(xsltStackElemPtr elem) {
+ * Release the list of temporary Result Tree Fragments.
+ */
+ if (elem->context) {
+- xmlDocPtr cur;
++ xsltRVTListPtr cur;
+
+ while (elem->fragment != NULL) {
+ cur = elem->fragment;
+- elem->fragment = (xmlDocPtr) cur->next;
+-
+- if (cur->compression == XSLT_RVT_LOCAL) {
+- xsltReleaseRVT(elem->context, cur);
+- } else if (cur->compression == XSLT_RVT_FUNC_RESULT) {
+- xsltRegisterLocalRVT(elem->context, cur);
+- cur->compression = XSLT_RVT_FUNC_RESULT;
++ elem->fragment = cur->next;
++
++ if (cur->RVT->compression == XSLT_RVT_LOCAL) {
++ xsltReleaseRVTList(elem->context, cur);
++ } else if (cur->RVT->compression == XSLT_RVT_FUNC_RESULT) {
++ xsltRegisterLocalRVT(elem->context, cur->RVT);
++ cur->RVT->compression = XSLT_RVT_FUNC_RESULT;
++ xmlFree(cur);
+ } else {
+ xmlGenericError(xmlGenericErrorContext,
+ "xsltFreeStackElem: Unexpected RVT flag %d\n",
+- cur->compression);
++ cur->RVT->compression);
+ }
+ }
+ }
+@@ -944,6 +1002,7 @@ xsltEvalVariable(xsltTransformContextPtr ctxt, xsltStackElemPtr variable,
+ } else {
+ if (variable->tree) {
+ xmlDocPtr container;
++ xsltRVTListPtr rvtList;
+ xmlNodePtr oldInsert;
+ xmlDocPtr oldOutput;
+ const xmlChar *oldLastText;
+@@ -968,7 +1027,11 @@ xsltEvalVariable(xsltTransformContextPtr ctxt, xsltStackElemPtr variable,
+ * when the variable is freed, it will also free
+ * the Result Tree Fragment.
+ */
+- variable->fragment = container;
++ rvtList = xsltRVTListCreate();
++ if (rvtList == NULL)
++ goto error;
++ rvtList->RVT = container;
++ variable->fragment = rvtList;
+ container->compression = XSLT_RVT_LOCAL;
+
+ oldOutput = ctxt->output;
+@@ -2361,5 +2424,3 @@ local_variable_found:
+
+ return(valueObj);
+ }
+-
+-
+diff --git a/libxslt/xsltInternals.h b/libxslt/xsltInternals.h
+index 6faa07db52995..ec84e1dfff4f5 100644
+--- a/libxslt/xsltInternals.h
++++ b/libxslt/xsltInternals.h
+@@ -1410,6 +1410,8 @@ struct _xsltStylePreComp {
+
+ #endif /* XSLT_REFACTORED */
+
++typedef struct _xsltRVTList xsltRVTList;
++typedef xsltRVTList *xsltRVTListPtr;
+
+ /*
+ * The in-memory structure corresponding to an XSLT Variable
+@@ -1427,7 +1429,7 @@ struct _xsltStackElem {
+ xmlNodePtr tree; /* the sequence constructor if no eval
+ string or the location */
+ xmlXPathObjectPtr value; /* The value if computed */
+- xmlDocPtr fragment; /* The Result Tree Fragments (needed for XSLT 1.0)
++ xsltRVTListPtr fragment; /* The Result Tree Fragments (needed for XSLT 1.0)
+ which are bound to the variable's lifetime. */
+ int level; /* the depth in the tree;
+ -1 if persistent (e.g. a given xsl:with-param) */
+@@ -1639,10 +1641,15 @@ struct _xsltStylesheet {
+ unsigned long opCount;
+ };
+
++struct _xsltRVTList {
++ xmlDocPtr RVT;
++ xsltRVTListPtr next;
++};
++
+ typedef struct _xsltTransformCache xsltTransformCache;
+ typedef xsltTransformCache *xsltTransformCachePtr;
+ struct _xsltTransformCache {
+- xmlDocPtr RVT;
++ xsltRVTListPtr rvtList;
+ int nbRVT;
+ xsltStackElemPtr stackItems;
+ int nbStackItems;
+@@ -1749,8 +1756,8 @@ struct _xsltTransformContext {
+ * handling of temporary Result Value Tree
+ * (XSLT 1.0 term: "Result Tree Fragment")
+ */
+- xmlDocPtr tmpRVT; /* list of RVT without persistance */
+- xmlDocPtr persistRVT; /* list of persistant RVTs */
++ xsltRVTListPtr tmpRVTList; /* list of RVT without persistance */
++ xsltRVTListPtr persistRVTList; /* list of persistant RVTs */
+ int ctxtflags; /* context processing flags */
+
+ /*
+@@ -1783,7 +1790,7 @@ struct _xsltTransformContext {
+ xmlDocPtr initialContextDoc;
+ xsltTransformCachePtr cache;
+ void *contextVariable; /* the current variable item */
+- xmlDocPtr localRVT; /* list of local tree fragments; will be freed when
++ xsltRVTListPtr localRVTList; /* list of local tree fragments; will be freed when
+ the instruction which created the fragment
+ exits */
+ xmlDocPtr localRVTBase; /* Obsolete */
+@@ -1932,8 +1939,11 @@ XSLTPUBFUN int XSLTCALL
+ XSLTPUBFUN void XSLTCALL
+ xsltFreeRVTs (xsltTransformContextPtr ctxt);
+ XSLTPUBFUN void XSLTCALL
+- xsltReleaseRVT (xsltTransformContextPtr ctxt,
++ xsltReleaseRVT (xsltTransformContextPtr ctxt,
+ xmlDocPtr RVT);
++XSLTPUBFUN void XSLTCALL
++ xsltReleaseRVTList (xsltTransformContextPtr ctxt,
++ xsltRVTListPtr list);
+ /*
+ * Extra functions for Attribute Value Templates
+ */
+@@ -1992,4 +2002,3 @@ XSLTPUBFUN int XSLTCALL
+ #endif
+
+ #endif /* __XML_XSLT_H__ */
+-
+--
+2.50.0.rc0.642.g800a2b2222-goog
+
diff -Nru chromium-145.0.7632.116/third_party/libxslt/chromium/roll.py chromium-145.0.7632.159/third_party/libxslt/chromium/roll.py
--- chromium-145.0.7632.116/third_party/libxslt/chromium/roll.py 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/chromium/roll.py 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,440 @@
+#!/usr/bin/env python3
+
+# Copyright 2017 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import argparse
+import os
+import shutil
+import stat
+import subprocess
+import sys
+import tempfile
+
+# How to patch libxslt in Chromium:
+#
+# 1. Write a .patch file and add it to third_party/libxslt/chromium.
+# 2. Apply the patch in src: patch -p1 <../chromium/foo.patch
+# 3. Add the patch to the list of patches in this file.
+# 4. Update README.chromium with the provenance of the patch.
+# 5. Upload a change with the modified documentation, roll script,
+# patch, applied patch and any other relevant changes like
+# regression tests. Go through the usual review and commit process.
+#
+# How to roll libxslt in Chromium:
+#
+# Prerequisites:
+#
+# 1. Check out Chromium somewhere on Linux, Mac and Windows.
+# 2. On Linux:
+# a. sudo apt-get install libicu-dev
+# b. git clone https://gitlab.gnome.org/GNOME/libxslt.git somewhere
+# 3. On Mac, install these packages with brew:
+# autoconf automake libtool pkgconfig icu4c
+#
+# Procedure:
+#
+# Warning: This process is destructive. Run it on a clean branch.
+#
+# 1. On Linux, in the libxslt repo directory:
+# a. git remote update origin
+# b. git checkout origin/master
+#
+# This will be the upstream version of libxslt you are rolling to.
+#
+# 2. On Linux, in the Chromium src director:
+# a. third_party/libxslt/chromium/roll.py --linux /path/to/libxslt
+#
+# If this fails, it may be a patch no longer applies. Reset to
+# head; modify the patch files, this script, and
+# README.chromium; then commit the result and run it again.
+#
+# b. Upload a Cl but do not start review
+#
+# 2. On Windows, in the Chromium src directory:
+# a. git cl patch
+# b. third_party\libxslt\chromium\roll.py --win32
+# c. git cl upload
+#
+# 3. On Mac, in the Chromium src directory:
+# a. git cl patch
+# b. third_party/libxslt/chromium/roll.py --mac
+# c. Make and commit any final changes to README.chromium, BUILD.gn, etc.
+# d. Complete the code review process as usual: git cl upload -d;
+# git cl try-results; etc.
+#
+# The --linuxfast argument is an alternative to --linux which also deletes
+# files which are not intended to be checked in. This would normally happen at
+# the end of the --mac run, but if you want to run the roll script and get to
+# the final state without running the configure scripts on all three platforms,
+# this is helpful.
+
+PATCHES = [
+ 'xslt-locale.patch',
+ '0004-Use-a-dedicated-node-type-to-maintain-the-list-of-ca.patch',
+]
+
+
+# See libxslt configure.ac and win32/configure.js to learn what
+# options are available.
+
+# These two sets of options should be in sync. You can check the
+# generated #defines in (win32|mac|linux)/config.h to confirm
+# this.
+SHARED_XSLT_CONFIGURE_OPTIONS = [
+ # These options are turned OFF
+ ('--without-debug', 'xslt_debug=no'),
+ ('--without-debugger', 'debugger=no'),
+ ('--without-mem-debug', 'mem_debug=no'),
+ ('--without-plugins', 'modules=no'),
+ ('--without-crypto', 'crypto=no'),
+ ('--without-python', 'python=no'),
+]
+
+# These options are only available in configure.ac for Linux and Mac.
+EXTRA_NIX_XSLT_CONFIGURE_OPTIONS = [
+]
+
+
+# These options are only available in win32/configure.js for Windows.
+EXTRA_WIN32_XSLT_CONFIGURE_OPTIONS = [
+ 'compiler=msvc',
+ 'iconv=no',
+]
+
+
+XSLT_CONFIGURE_OPTIONS = (
+ [option[0] for option in SHARED_XSLT_CONFIGURE_OPTIONS] +
+ EXTRA_NIX_XSLT_CONFIGURE_OPTIONS)
+
+
+XSLT_WIN32_CONFIGURE_OPTIONS = (
+ [option[1] for option in SHARED_XSLT_CONFIGURE_OPTIONS] +
+ EXTRA_WIN32_XSLT_CONFIGURE_OPTIONS)
+
+
+FILES_TO_REMOVE = [
+ # TODO: Excluding ChangeLog and NEWS because encoding problems mean
+ # bots can't patch these. Reinclude them when there is a consistent
+ # encoding.
+ 'src/NEWS',
+ 'src/ChangeLog',
+ # These are auto-generated by autoconf/automake and should not be included
+ # with the source code
+ 'src/Makefile.in',
+ 'src/aclocal.m4',
+ 'src/CMakeLists.txt',
+ 'src/compile',
+ 'src/config.guess',
+ 'src/config.sub',
+ 'src/configure',
+ 'src/configure.ac',
+ 'src/depcomp',
+ 'src/install-sh',
+ 'src/libexslt/Makefile.in',
+ 'src/libxslt.spec.in',
+ 'src/libxslt/Makefile.in',
+ 'src/libxslt/libxslt.syms',
+ 'src/ltmain.sh',
+ 'src/m4/ax_append_flag.m4',
+ 'src/missing',
+ 'src/win32/Makefile.msvc',
+ 'src/xslt-config.in',
+ # These are not needed.
+ 'src/doc',
+ 'src/python',
+ 'src/tests',
+ 'src/xsltproc',
+ 'src/examples',
+ 'src/vms',
+]
+
+
+THIRD_PARTY_LIBXML_LINUX = 'third_party/libxml/linux'
+THIRD_PARTY_LIBXSLT = 'third_party/libxslt'
+THIRD_PARTY_LIBXSLT_SRC = os.path.join(THIRD_PARTY_LIBXSLT, 'src')
+
+
+def libxml_path_option(src_path):
+ """Gets the path to libxml/linux in Chromium.
+
+ libxslt needs to be configured with libxml source.
+
+ Args:
+ src_path: The Chromium src path.
+
+ Returns:
+ The path to the libxml2 third_party/libxml/linux configure
+ output.
+ """
+ libxml_linux_path = os.path.join(src_path, THIRD_PARTY_LIBXML_LINUX)
+ return ['--with-libxml-src=%s' % libxml_linux_path]
+
+
+class WorkingDir(object):
+ """Changes the working directory and resets it on exit."""
+ def __init__(self, path):
+ self.prev_path = os.getcwd()
+ self.path = path
+
+ def __enter__(self):
+ os.chdir(self.path)
+
+ def __exit__(self, exc_type, exc_value, traceback):
+ if exc_value:
+ print('was in %s; %s before that' % (self.path, self.prev_path))
+ os.chdir(self.prev_path)
+
+
+def git(*args):
+ """Runs a git subcommand.
+
+ On Windows this uses the shell because there's a git wrapper
+ batch file in depot_tools.
+
+ Arguments:
+ args: The arguments to pass to git.
+ """
+ command = ['git'] + list(args)
+ subprocess.check_call(command, shell=(os.name == 'nt'))
+
+
+def remove_tracked_and_local_dir(path):
+ """Removes the contents of a directory from git, and the filesystem.
+
+ Arguments:
+ path: The path to remove.
+ """
+ remove_tracked_files([path])
+ shutil.rmtree(path, ignore_errors=True)
+ os.mkdir(path)
+
+
+def remove_tracked_files(files_to_remove):
+ """Removes tracked files from git.
+
+ Arguments:
+ files_to_remove: The files to remove.
+ """
+ files_to_remove = [f for f in files_to_remove if os.path.exists(f)]
+ git('rm', '-rf', '--ignore-unmatch', *files_to_remove)
+
+
+def sed_in_place(input_filename, program):
+ """Replaces text in a file.
+
+ Arguments:
+ input_filename: The file to edit.
+ program: The sed program to perform edits on the file.
+ """
+ # OS X's sed requires -e
+ subprocess.check_call(['sed', '-i', '-e', program, input_filename])
+
+
+def check_copying(path='.'):
+ path = os.path.join(path, 'COPYING')
+ if not os.path.exists(path):
+ return
+ with open(path) as f:
+ s = f.read()
+ if 'GNU' in s:
+ raise Exception('check COPYING')
+
+
+def patch_config():
+ """Changes autoconf results which can not be changed with options."""
+ sed_in_place('config.h', 's/#define HAVE_CLOCK_GETTIME 1//')
+
+ # https://crbug.com/670720
+ sed_in_place('config.h', 's/#define HAVE_ASCTIME 1//')
+ sed_in_place('config.h', 's/#define HAVE_LOCALTIME 1//')
+ sed_in_place('config.h', 's/#define HAVE_MKTIME 1//')
+
+ sed_in_place('config.log',
+ r's/[a-z.0-9]\+\.corp\.google\.com/REDACTED/')
+
+
+def prepare_libxslt_distribution(src_path, libxslt_repo_path, temp_dir):
+ """Makes a libxslt distribution.
+
+ Args:
+ src_path: The Chromium repository src path, for finding libxslt.
+ libxslt_repo_path: The path to the local clone of the libxslt repo.
+ temp_dir: A temporary directory to stage the distribution to.
+
+ Returns: A tuple of commit hash and full path to the archive.
+ """
+ # If it was necessary to push from a distribution prepared upstream,
+ # this is the point to inject it: Return the version string and the
+ # distribution tar file.
+
+ # The libxslt repo we're pulling changes from should not have
+ # local changes. This *should* be a commit that's publicly visible
+ # in the upstream repo; reviewers should check this.
+ check_clean(libxslt_repo_path)
+
+ temp_config_path = os.path.join(temp_dir, 'config')
+ os.mkdir(temp_config_path)
+ temp_src_path = os.path.join(temp_dir, 'src')
+ os.mkdir(temp_src_path)
+
+ with WorkingDir(libxslt_repo_path):
+ commit = subprocess.check_output(
+ ['git', 'log', '-n', '1', '--pretty=format:%H', 'HEAD']).decode('ascii')
+ subprocess.check_call(
+ 'git archive HEAD | tar -x -C "%s"' % temp_src_path,
+ shell=True)
+ with WorkingDir(temp_src_path):
+ os.remove('.gitignore')
+ for patch in PATCHES:
+ print('applying %s' % patch)
+ subprocess.check_call(
+ 'patch -p1 --fuzz=0 < %s' % os.path.join(
+ src_path, THIRD_PARTY_LIBXSLT_SRC, '..', 'chromium', patch),
+ shell=True)
+ with WorkingDir(temp_config_path):
+ subprocess.check_call(['../src/autogen.sh'] + XSLT_CONFIGURE_OPTIONS +
+ libxml_path_option(src_path))
+ subprocess.check_call(['make', 'dist-all'])
+
+ # Work out what it is called
+ tar_file = subprocess.check_output(
+ '''awk '/PACKAGE =/ {p=$3} /VERSION =/ {v=$3} '''
+ '''END {printf("%s-%s.tar.xz", p, v)}' Makefile''',
+ shell=True).decode('ascii')
+ return commit, os.path.abspath(tar_file)
+
+
+def roll_libxslt_linux(src_path, repo_path, fast):
+ check_clean(src_path)
+ with WorkingDir(src_path):
+ try:
+ temp_dir = tempfile.mkdtemp()
+ print('temporary directory is: %s' % temp_dir)
+ commit, tar_file = prepare_libxslt_distribution(
+ src_path, repo_path, temp_dir)
+
+ # Remove all of the old libxslt to ensure only desired
+ # cruft accumulates
+ remove_tracked_and_local_dir(THIRD_PARTY_LIBXSLT_SRC)
+
+ # Export the libxslt distribution to the Chromium tree
+ with WorkingDir(THIRD_PARTY_LIBXSLT_SRC):
+ subprocess.check_call(
+ 'tar xJf %s --strip-components=1' % tar_file,
+ shell=True)
+ finally:
+ shutil.rmtree(temp_dir)
+
+ with WorkingDir(THIRD_PARTY_LIBXSLT_SRC):
+ # Write the commit ID into the README.chromium file
+ sed_in_place('../README.chromium',
+ 's/Revision: .*$/Revision: %s/' % commit)
+ # TODO(crbug.com/349529871): Use the version number instead of
+ # commit hash once it has been added upstream:
+ # https://gitlab.gnome.org/GNOME/libxslt/-/issues/117
+ sed_in_place('../README.chromium',
+ 's/Version: .*$/Version: %s/' % commit)
+ check_copying()
+
+ with WorkingDir('../linux'):
+ subprocess.check_call(['../src/configure'] +
+ XSLT_CONFIGURE_OPTIONS +
+ libxml_path_option(src_path))
+ check_copying()
+ patch_config()
+ # Other platforms share this, even though it is
+ # generated on Linux. Android and Windows do not have
+ # xlocale.
+ sed_in_place('libxslt/xsltconfig.h',
+ '/Locale support/,/#if 1/s/#if 1/#if 0/')
+ shutil.move('libxslt/xsltconfig.h', '../src/libxslt')
+
+ git('add', '*')
+ if fast:
+ with WorkingDir('..'):
+ remove_tracked_files(FILES_TO_REMOVE)
+ git('commit', '-am', '%s libxslt, linux' % commit)
+
+ if fast:
+ print('Now upload for review, etc.')
+ else:
+ print('Now push to Windows and runs steps there.')
+
+
+def roll_libxslt_win32(src_path):
+ full_path_to_libxslt = os.path.join(src_path, THIRD_PARTY_LIBXSLT)
+ with WorkingDir(full_path_to_libxslt):
+ with WorkingDir('src/win32'):
+ # Run the configure script.
+ subprocess.check_call(['cscript', '//E:jscript', 'configure.js'] +
+ XSLT_WIN32_CONFIGURE_OPTIONS)
+ shutil.copy('src/config.h', 'win32/config.h')
+ git('add', 'win32/config.h')
+ git('commit', '--allow-empty', '-m', 'Windows')
+ print('Now push to Mac and run steps there.')
+
+
+def roll_libxslt_mac(src_path):
+ full_path_to_libxslt = os.path.join(src_path, THIRD_PARTY_LIBXSLT)
+ with WorkingDir(full_path_to_libxslt):
+ with WorkingDir('mac'):
+ subprocess.check_call(['autoreconf', '-i', '../src'])
+ os.chmod('../src/configure',
+ os.stat('../src/configure').st_mode | stat.S_IXUSR)
+ # /linux in the configure options is not a typo; configure
+ # looks here to find xml2-config
+ subprocess.check_call(['../src/configure'] +
+ XSLT_CONFIGURE_OPTIONS)
+ check_copying()
+ patch_config()
+ # Commit and upload the result
+ git('add', 'config.h')
+ remove_tracked_files(FILES_TO_REMOVE)
+ git('commit', '-m', 'Mac')
+ print('Now upload for review, etc.')
+
+
+def check_clean(path):
+ with WorkingDir(path):
+ status = subprocess.check_output(['git', 'status', '-s', '-uno']).decode('ascii')
+ if len(status) > 0:
+ raise Exception('repository at %s is not clean' % path)
+
+
+def main():
+ src_dir = os.getcwd()
+ if not os.path.exists(os.path.join(src_dir, 'third_party')):
+ print('error: run this script from the Chromium src directory')
+ sys.exit(1)
+
+ parser = argparse.ArgumentParser(
+ description='Roll the libxslt dependency in Chromium')
+ platform = parser.add_mutually_exclusive_group(required=True)
+ platform.add_argument('--linux', action='store_true')
+ platform.add_argument('--win32', action='store_true')
+ platform.add_argument('--mac', action='store_true')
+ platform.add_argument('--linuxfast', action='store_true')
+ parser.add_argument(
+ 'libxslt_repo_path',
+ type=str,
+ nargs='?',
+ help='The path to the local clone of the libxslt git repo.')
+ args = parser.parse_args()
+
+ if args.linux or args.linuxfast:
+ libxslt_repo_path = args.libxslt_repo_path
+ if not libxslt_repo_path:
+ print('Specify the path to the local libxslt repo clone.')
+ sys.exit(1)
+ libxslt_repo_path = os.path.abspath(libxslt_repo_path)
+ roll_libxslt_linux(src_dir, libxslt_repo_path, args.linuxfast)
+ elif args.win32:
+ roll_libxslt_win32(src_dir)
+ elif args.mac:
+ roll_libxslt_mac(src_dir)
+
+
+if __name__ == '__main__':
+ main()
diff -Nru chromium-145.0.7632.116/third_party/libxslt/chromium/xslt-locale.patch chromium-145.0.7632.159/third_party/libxslt/chromium/xslt-locale.patch
--- chromium-145.0.7632.116/third_party/libxslt/chromium/xslt-locale.patch 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/chromium/xslt-locale.patch 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,45 @@
+WebKit sets a custom xslt sort function with the expectation that libxslt passes
+strings directly from the input. If locale support is enabled, libxslt will
+transform the string using into something WebKit does not expect. This will
+break third_party/WebKit/LayoutTests/fast/xsl/sort-locale.xml. By disabling
+POSIX and Windows locale support, we preserve the behavior WebKit expects in
+XsltUnicodeSortFunction.
+
+In addition, it would seem that strxfrm_l is not supported on Fuchsia as using
+it without this patch causes a compile error.
+
+diff --git a/libxslt/xsltlocale.c b/libxslt/xsltlocale.c
+index 5a929188..9324f284 100644
+--- a/libxslt/xsltlocale.c
++++ b/libxslt/xsltlocale.c
+@@ -19,29 +19,7 @@
+ #include "xsltlocale.h"
+ #include "xsltutils.h"
+
+-#ifdef HAVE_STRXFRM_L
+-
+- #define XSLT_LOCALE_POSIX
+-
+- #ifdef HAVE_LOCALE_H
+- #include
+- #endif
+- #ifdef HAVE_XLOCALE_H
+- #include
+- #endif
+-
+-#elif defined(_WIN32)
+-
+- #define XSLT_LOCALE_WINAPI
+-
+- #include
+- #include
+-
+-#else
+-
+- #define XSLT_LOCALE_NONE
+-
+-#endif
++#define XSLT_LOCALE_NONE
+
+ #define TOUPPER(c) (c & ~0x20)
+ #define TOLOWER(c) (c | 0x20)
diff -Nru chromium-145.0.7632.116/third_party/libxslt/linux/COPYING chromium-145.0.7632.159/third_party/libxslt/linux/COPYING
--- chromium-145.0.7632.116/third_party/libxslt/linux/COPYING 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/linux/COPYING 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,53 @@
+Licence for libxslt except libexslt
+----------------------------------------------------------------------
+ Copyright (C) 2001-2002 Daniel Veillard. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is fur-
+nished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
+NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+DANIEL VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
+NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Daniel Veillard shall not
+be used in advertising or otherwise to promote the sale, use or other deal-
+ings in this Software without prior written authorization from him.
+
+----------------------------------------------------------------------
+
+Licence for libexslt
+----------------------------------------------------------------------
+ Copyright (C) 2001-2002 Thomas Broyer, Charlie Bozeman and Daniel Veillard.
+ All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is fur-
+nished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
+NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
+NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the authors shall not
+be used in advertising or otherwise to promote the sale, use or other deal-
+ings in this Software without prior written authorization from him.
+----------------------------------------------------------------------
diff -Nru chromium-145.0.7632.116/third_party/libxslt/linux/config.h chromium-145.0.7632.159/third_party/libxslt/linux/config.h
--- chromium-145.0.7632.116/third_party/libxslt/linux/config.h 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/linux/config.h 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,225 @@
+/* config.h. Generated from config.h.in by configure. */
+/* config.h.in. Generated from configure.ac by autoheader. */
+
+/* Define to 1 if you have the 'clock_gettime' function. */
+
+
+/* Define to 1 if you have the header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the 'ftime' function. */
+#define HAVE_FTIME 1
+
+/* Define if gcrypt library is available. */
+/* #undef HAVE_GCRYPT */
+
+/* Define to 1 if you have the 'gettimeofday' function. */
+#define HAVE_GETTIMEOFDAY 1
+
+/* Define to 1 if you have the 'gmtime_r' function. */
+#define HAVE_GMTIME_R 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define if pthread library is there (-lpthread) */
+#define HAVE_LIBPTHREAD /**/
+
+/* Define to 1 if you have the header file. */
+#define HAVE_LOCALE_H 1
+
+/* Define to 1 if you have the 'localtime_r' function. */
+#define HAVE_LOCALTIME_R 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_MINIX_CONFIG_H */
+
+/* Define if is there */
+#define HAVE_PTHREAD_H /**/
+
+/* Define to 1 if you have the 'snprintf' function. */
+#define HAVE_SNPRINTF 1
+
+/* Define to 1 if you have the 'stat' function. */
+#define HAVE_STAT 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STDIO_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the 'strxfrm_l' function. */
+#define HAVE_STRXFRM_L 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_SELECT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_TIMEB_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the 'vsnprintf' function. */
+#define HAVE_VSNPRINTF 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_WCHAR_H 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_XLOCALE_H */
+
+/* Define to 1 if you have the '_stat' function. */
+/* #undef HAVE__STAT */
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+#define LT_OBJDIR ".libs/"
+
+/* plugin file extension */
+/* #undef MODULE_EXTENSION */
+
+/* Name of package */
+#define PACKAGE "libxslt"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT ""
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "libxslt"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "libxslt 1.1.45"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "libxslt"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "1.1.45"
+
+/* Define to 1 if all of the C89 standard headers exist (not just the ones
+ required in a freestanding environment). This macro is provided for
+ backward compatibility; new code need not use it. */
+#define STDC_HEADERS 1
+
+/* Enable extensions on AIX, Interix, z/OS. */
+#ifndef _ALL_SOURCE
+# define _ALL_SOURCE 1
+#endif
+/* Enable general extensions on macOS. */
+#ifndef _DARWIN_C_SOURCE
+# define _DARWIN_C_SOURCE 1
+#endif
+/* Enable general extensions on Solaris. */
+#ifndef __EXTENSIONS__
+# define __EXTENSIONS__ 1
+#endif
+/* Enable GNU extensions on systems that have them. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+/* Enable X/Open compliant socket functions that do not require linking
+ with -lxnet on HP-UX 11.11. */
+#ifndef _HPUX_ALT_XOPEN_SOCKET_API
+# define _HPUX_ALT_XOPEN_SOCKET_API 1
+#endif
+/* Identify the host operating system as Minix.
+ This macro does not affect the system headers' behavior.
+ A future release of Autoconf may stop defining this macro. */
+#ifndef _MINIX
+/* # undef _MINIX */
+#endif
+/* Enable general extensions on NetBSD.
+ Enable NetBSD compatibility extensions on Minix. */
+#ifndef _NETBSD_SOURCE
+# define _NETBSD_SOURCE 1
+#endif
+/* Enable OpenBSD compatibility extensions on NetBSD.
+ Oddly enough, this does nothing on OpenBSD. */
+#ifndef _OPENBSD_SOURCE
+# define _OPENBSD_SOURCE 1
+#endif
+/* Define to 1 if needed for POSIX-compatible behavior. */
+#ifndef _POSIX_SOURCE
+/* # undef _POSIX_SOURCE */
+#endif
+/* Define to 2 if needed for POSIX-compatible behavior. */
+#ifndef _POSIX_1_SOURCE
+/* # undef _POSIX_1_SOURCE */
+#endif
+/* Enable POSIX-compatible threading on Solaris. */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# define _POSIX_PTHREAD_SEMANTICS 1
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-5:2014. */
+#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
+# define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-1:2014. */
+#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+# define __STDC_WANT_IEC_60559_BFP_EXT__ 1
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-2:2015. */
+#ifndef __STDC_WANT_IEC_60559_DFP_EXT__
+# define __STDC_WANT_IEC_60559_DFP_EXT__ 1
+#endif
+/* Enable extensions specified by C23 Annex F. */
+#ifndef __STDC_WANT_IEC_60559_EXT__
+# define __STDC_WANT_IEC_60559_EXT__ 1
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-4:2015. */
+#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__
+# define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1
+#endif
+/* Enable extensions specified by C23 Annex H and ISO/IEC TS 18661-3:2015. */
+#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__
+# define __STDC_WANT_IEC_60559_TYPES_EXT__ 1
+#endif
+/* Enable extensions specified by ISO/IEC TR 24731-2:2010. */
+#ifndef __STDC_WANT_LIB_EXT2__
+# define __STDC_WANT_LIB_EXT2__ 1
+#endif
+/* Enable extensions specified by ISO/IEC 24747:2009. */
+#ifndef __STDC_WANT_MATH_SPEC_FUNCS__
+# define __STDC_WANT_MATH_SPEC_FUNCS__ 1
+#endif
+/* Enable extensions on HP NonStop. */
+#ifndef _TANDEM_SOURCE
+# define _TANDEM_SOURCE 1
+#endif
+/* Enable X/Open extensions. Define to 500 only if necessary
+ to make mbstate_t available. */
+#ifndef _XOPEN_SOURCE
+/* # undef _XOPEN_SOURCE */
+#endif
+
+
+/* Version number of package */
+#define VERSION "1.1.45"
+
+/* Define if debugging support is enabled */
+/* #undef WITH_DEBUGGER */
+
+/* Define if profiling support is enabled */
+#define WITH_PROFILER /**/
diff -Nru chromium-145.0.7632.116/third_party/libxslt/linux/libexslt/exsltconfig.h chromium-145.0.7632.159/third_party/libxslt/linux/libexslt/exsltconfig.h
--- chromium-145.0.7632.116/third_party/libxslt/linux/libexslt/exsltconfig.h 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/linux/libexslt/exsltconfig.h 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,70 @@
+/*
+ * exsltconfig.h: compile-time version information for the EXSLT library
+ *
+ * See Copyright for the status of this software.
+ *
+ * daniel@veillard.com
+ */
+
+#ifndef __XML_EXSLTCONFIG_H__
+#define __XML_EXSLTCONFIG_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * LIBEXSLT_DOTTED_VERSION:
+ *
+ * the version string like "1.2.3"
+ */
+#define LIBEXSLT_DOTTED_VERSION "0.8.25"
+
+/**
+ * LIBEXSLT_VERSION:
+ *
+ * the version number: 1.2.3 value is 10203
+ */
+#define LIBEXSLT_VERSION 825
+
+/**
+ * LIBEXSLT_VERSION_STRING:
+ *
+ * the version number string, 1.2.3 value is "10203"
+ */
+#define LIBEXSLT_VERSION_STRING "825"
+
+/**
+ * LIBEXSLT_VERSION_EXTRA:
+ *
+ * extra version information, used to show a Git commit description
+ */
+#define LIBEXSLT_VERSION_EXTRA ""
+
+/**
+ * WITH_CRYPTO:
+ *
+ * Whether crypto support is configured into exslt
+ */
+#if 0
+#define EXSLT_CRYPTO_ENABLED
+#endif
+
+/**
+ * ATTRIBUTE_UNUSED:
+ *
+ * This macro is used to flag unused function parameters to GCC
+ */
+#ifdef __GNUC__
+#ifndef ATTRIBUTE_UNUSED
+#define ATTRIBUTE_UNUSED __attribute__((unused))
+#endif
+#else
+#define ATTRIBUTE_UNUSED
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __XML_EXSLTCONFIG_H__ */
diff -Nru chromium-145.0.7632.116/third_party/libxslt/linux/libxslt/xsltwin32config.h chromium-145.0.7632.159/third_party/libxslt/linux/libxslt/xsltwin32config.h
--- chromium-145.0.7632.116/third_party/libxslt/linux/libxslt/xsltwin32config.h 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/linux/libxslt/xsltwin32config.h 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,105 @@
+/*
+ * Summary: compile-time version information for the XSLT engine
+ * when compiled on windows
+ * Description: compile-time version information for the XSLT engine
+ * when compiled on windows. This file is generated.
+ *
+ * Copy: See Copyright for the status of this software.
+ *
+ * Author: Daniel Veillard
+ */
+
+#ifndef __XML_XSLTWIN32CONFIG_H__
+#define __XML_XSLTWIN32CONFIG_H__
+
+#include "win32config.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * LIBXSLT_DOTTED_VERSION:
+ *
+ * the version string like "1.2.3"
+ */
+#define LIBXSLT_DOTTED_VERSION "1.1.34"
+
+/**
+ * LIBXSLT_VERSION:
+ *
+ * the version number: 1.2.3 value is 1002003
+ */
+#define LIBXSLT_VERSION 10134
+
+/**
+ * LIBXSLT_VERSION_STRING:
+ *
+ * the version number string, 1.2.3 value is "1002003"
+ */
+#define LIBXSLT_VERSION_STRING "10134"
+
+/**
+ * LIBXSLT_VERSION_EXTRA:
+ *
+ * extra version information, used to show a CVS compilation
+ */
+#define LIBXSLT_VERSION_EXTRA "-win32"
+
+/**
+ * WITH_XSLT_DEBUG:
+ *
+ * Activate the compilation of the debug reporting. Speed penalty
+ * is insignifiant and being able to run xsltpoc -v is useful. On
+ * by default
+ */
+#if 1
+#define WITH_XSLT_DEBUG
+#endif
+
+/**
+ * WITH_MODULES:
+ *
+ * Whether module support is configured into libxslt
+ */
+#if 0
+#ifndef WITH_MODULES
+#define WITH_MODULES
+#endif
+#define LIBXSLT_PLUGINS_PATH() getenv("LIBXSLT_PLUGINS_PATH")
+#endif
+
+#if 0
+/**
+ * DEBUG_MEMORY:
+ *
+ * should be activated only when debugging libxslt. It replaces the
+ * allocator with a collect and debug shell to the libc allocator.
+ * Use configure --with-mem-debug to activate it on both library
+ */
+#define DEBUG_MEMORY
+
+/**
+ * DEBUG_MEMORY_LOCATION:
+ *
+ * should be activated only when debugging libxslt.
+ * DEBUG_MEMORY_LOCATION should be activated only when libxml has
+ * been configured with --with-debug-mem too
+ */
+#define DEBUG_MEMORY_LOCATION
+#endif
+
+/**
+ * ATTRIBUTE_UNUSED:
+ *
+ * This macro is used to flag unused function parameters to GCC, useless here
+ */
+#ifndef ATTRIBUTE_UNUSED
+#define ATTRIBUTE_UNUSED
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __XML_XSLTWIN32CONFIG_H__ */
diff -Nru chromium-145.0.7632.116/third_party/libxslt/mac/config.h chromium-145.0.7632.159/third_party/libxslt/mac/config.h
--- chromium-145.0.7632.116/third_party/libxslt/mac/config.h 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/mac/config.h 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,225 @@
+/* config.h. Generated from config.h.in by configure. */
+/* config.h.in. Generated from configure.ac by autoheader. */
+
+/* Define to 1 if you have the 'clock_gettime' function. */
+
+
+/* Define to 1 if you have the header file. */
+#define HAVE_DLFCN_H 1
+
+/* Define to 1 if you have the 'ftime' function. */
+#define HAVE_FTIME 1
+
+/* Define if gcrypt library is available. */
+/* #undef HAVE_GCRYPT */
+
+/* Define to 1 if you have the 'gettimeofday' function. */
+#define HAVE_GETTIMEOFDAY 1
+
+/* Define to 1 if you have the 'gmtime_r' function. */
+#define HAVE_GMTIME_R 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define if pthread library is there (-lpthread) */
+#define HAVE_LIBPTHREAD /**/
+
+/* Define to 1 if you have the header file. */
+#define HAVE_LOCALE_H 1
+
+/* Define to 1 if you have the 'localtime_r' function. */
+#define HAVE_LOCALTIME_R 1
+
+/* Define to 1 if you have the header file. */
+/* #undef HAVE_MINIX_CONFIG_H */
+
+/* Define if is there */
+#define HAVE_PTHREAD_H /**/
+
+/* Define to 1 if you have the 'snprintf' function. */
+#define HAVE_SNPRINTF 1
+
+/* Define to 1 if you have the 'stat' function. */
+#define HAVE_STAT 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STDIO_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the 'strxfrm_l' function. */
+#define HAVE_STRXFRM_L 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_SELECT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_TIMEB_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the 'vsnprintf' function. */
+#define HAVE_VSNPRINTF 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_WCHAR_H 1
+
+/* Define to 1 if you have the header file. */
+#define HAVE_XLOCALE_H 1
+
+/* Define to 1 if you have the '_stat' function. */
+/* #undef HAVE__STAT */
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+#define LT_OBJDIR ".libs/"
+
+/* plugin file extension */
+/* #undef MODULE_EXTENSION */
+
+/* Name of package */
+#define PACKAGE "libxslt"
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT ""
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "libxslt"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "libxslt 1.1.44"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "libxslt"
+
+/* Define to the home page for this package. */
+#define PACKAGE_URL ""
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "1.1.44"
+
+/* Define to 1 if all of the C89 standard headers exist (not just the ones
+ required in a freestanding environment). This macro is provided for
+ backward compatibility; new code need not use it. */
+#define STDC_HEADERS 1
+
+/* Enable extensions on AIX, Interix, z/OS. */
+#ifndef _ALL_SOURCE
+# define _ALL_SOURCE 1
+#endif
+/* Enable general extensions on macOS. */
+#ifndef _DARWIN_C_SOURCE
+# define _DARWIN_C_SOURCE 1
+#endif
+/* Enable general extensions on Solaris. */
+#ifndef __EXTENSIONS__
+# define __EXTENSIONS__ 1
+#endif
+/* Enable GNU extensions on systems that have them. */
+#ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+#endif
+/* Enable X/Open compliant socket functions that do not require linking
+ with -lxnet on HP-UX 11.11. */
+#ifndef _HPUX_ALT_XOPEN_SOCKET_API
+# define _HPUX_ALT_XOPEN_SOCKET_API 1
+#endif
+/* Identify the host operating system as Minix.
+ This macro does not affect the system headers' behavior.
+ A future release of Autoconf may stop defining this macro. */
+#ifndef _MINIX
+/* # undef _MINIX */
+#endif
+/* Enable general extensions on NetBSD.
+ Enable NetBSD compatibility extensions on Minix. */
+#ifndef _NETBSD_SOURCE
+# define _NETBSD_SOURCE 1
+#endif
+/* Enable OpenBSD compatibility extensions on NetBSD.
+ Oddly enough, this does nothing on OpenBSD. */
+#ifndef _OPENBSD_SOURCE
+# define _OPENBSD_SOURCE 1
+#endif
+/* Define to 1 if needed for POSIX-compatible behavior. */
+#ifndef _POSIX_SOURCE
+/* # undef _POSIX_SOURCE */
+#endif
+/* Define to 2 if needed for POSIX-compatible behavior. */
+#ifndef _POSIX_1_SOURCE
+/* # undef _POSIX_1_SOURCE */
+#endif
+/* Enable POSIX-compatible threading on Solaris. */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# define _POSIX_PTHREAD_SEMANTICS 1
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-5:2014. */
+#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
+# define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-1:2014. */
+#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+# define __STDC_WANT_IEC_60559_BFP_EXT__ 1
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-2:2015. */
+#ifndef __STDC_WANT_IEC_60559_DFP_EXT__
+# define __STDC_WANT_IEC_60559_DFP_EXT__ 1
+#endif
+/* Enable extensions specified by C23 Annex F. */
+#ifndef __STDC_WANT_IEC_60559_EXT__
+# define __STDC_WANT_IEC_60559_EXT__ 1
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-4:2015. */
+#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__
+# define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1
+#endif
+/* Enable extensions specified by C23 Annex H and ISO/IEC TS 18661-3:2015. */
+#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__
+# define __STDC_WANT_IEC_60559_TYPES_EXT__ 1
+#endif
+/* Enable extensions specified by ISO/IEC TR 24731-2:2010. */
+#ifndef __STDC_WANT_LIB_EXT2__
+# define __STDC_WANT_LIB_EXT2__ 1
+#endif
+/* Enable extensions specified by ISO/IEC 24747:2009. */
+#ifndef __STDC_WANT_MATH_SPEC_FUNCS__
+# define __STDC_WANT_MATH_SPEC_FUNCS__ 1
+#endif
+/* Enable extensions on HP NonStop. */
+#ifndef _TANDEM_SOURCE
+# define _TANDEM_SOURCE 1
+#endif
+/* Enable X/Open extensions. Define to 500 only if necessary
+ to make mbstate_t available. */
+#ifndef _XOPEN_SOURCE
+/* # undef _XOPEN_SOURCE */
+#endif
+
+
+/* Version number of package */
+#define VERSION "1.1.44"
+
+/* Define if debugging support is enabled */
+/* #undef WITH_DEBUGGER */
+
+/* Define if profiling support is enabled */
+#define WITH_PROFILER /**/
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/AUTHORS chromium-145.0.7632.159/third_party/libxslt/src/AUTHORS
--- chromium-145.0.7632.116/third_party/libxslt/src/AUTHORS 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/AUTHORS 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,64 @@
+Daniel Veillard:
+ daniel@veillard.com
+ DV on #gnome IRC channel
+ http://veillard.com/
+ Used to work at W3C, now Red Hat
+ co-chair of W3C XML Linking WG
+ invited expert on the W3C XML Core WG
+ Author of libxml2 upon which this library is based.
+
+Bjorn Reese:
+ breese@users.sourceforge.net
+ http://home1.stofanet.dk/breese/
+ Software developer at http://www.systematic.dk/
+ Member of the XML-MTF Mapping WG.
+
+William Brack
+
+Thomas Broyer
+
+Igor Zlatkovic for the Windows port
+
+Patches gently provided by a multitude of people :
+
+Abhishek Arya
+Ben Walton
+Bjorn Reese
+C. M. Sperberg-McQueen
+Colin Walters
+Daniel Mustieles
+Daniel Richard G
+Darin Adler
+ÉRDI Gergo
+Fatih Demir
+Federico Mena Quintero
+Frederic Crozat
+Hao Hu
+Havoc Pennington
+IlyaS
+jacob berkman
+Jason Viers
+Jérôme Carretero
+Joachim Breitner
+Johan Dahlin
+John Fleck
+Jose Maria Celorio
+Julio M. Merino Vidal
+Kasimier T. Buchcik
+Kjartan Maraas
+Laurence Rowe
+Malcolm Purvis
+Martin
+Michael Bonfils
+Mike Hommey
+money_seshu Dronamraju
+Nick Wellnhofer
+Nix
+Pedro F. Giffuni
+Peter Williams
+Rob Richards
+Roumen Petrov
+Stefan Kost
+Tomasz Kłoczko
+Chris Evans
+Iván Chavero
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/Copyright chromium-145.0.7632.159/third_party/libxslt/src/Copyright
--- chromium-145.0.7632.116/third_party/libxslt/src/Copyright 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/Copyright 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,53 @@
+Licence for libxslt except libexslt
+----------------------------------------------------------------------
+ Copyright (C) 2001-2002 Daniel Veillard. All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is fur-
+nished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
+NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+DANIEL VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
+NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of Daniel Veillard shall not
+be used in advertising or otherwise to promote the sale, use or other deal-
+ings in this Software without prior written authorization from him.
+
+----------------------------------------------------------------------
+
+Licence for libexslt
+----------------------------------------------------------------------
+ Copyright (C) 2001-2002 Thomas Broyer, Charlie Bozeman and Daniel Veillard.
+ All Rights Reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is fur-
+nished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT-
+NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON-
+NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the authors shall not
+be used in advertising or otherwise to promote the sale, use or other deal-
+ings in this Software without prior written authorization from him.
+----------------------------------------------------------------------
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/FEATURES chromium-145.0.7632.159/third_party/libxslt/src/FEATURES
--- chromium-145.0.7632.116/third_party/libxslt/src/FEATURES 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/FEATURES 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,242 @@
+ Status of implementation of the XSLT 1.0 Features:
+ ==================================================
+
+Stylesheet Constructs:
+======================
+
+YES xsl:stylesheet
+? id = id
+YES extension-element-prefixes = tokens
+YES exclude-result-prefixes = tokens
+YES version = number
+
+YES xsl:transform
+? id = id
+YES extension-element-prefixes = tokens
+YES exclude-result-prefixes = tokens
+YES version = number
+
+
+YES Literal Result Element as Stylesheet
+
+YES Embedding Stylesheets
+
+NO mediaType
+
+Top Level Elements:
+===================
+
+YES xsl:include
+YES href = uri-reference
+
+YES xsl:import
+YES href = uri-reference
+
+YES xsl:strip-space
+YES elements = tokens
+
+YES xsl:preserve-space
+YES elements = tokens
+
+YES xsl:template
+YES match = pattern
+YES name = qname
+YES priority = number
+YES mode = qname
+
+YES xsl:namespace-alias
+YES stylesheet-prefix = prefix | "#default"
+YES result-prefix = prefix | "#default"
+
+YES xsl:attribute-set
+YES name = qname
+YES use-attribute-sets = qnames
+
+YES xsl:variable
+YES name = qname
+YES select = expression
+YES Content: template
+
+YES xsl:param
+YES name = qname
+YES select = expression
+YES Content: template
+
+YES xsl:key
+YES name = qname
+YES match = pattern
+YES use = expression
+
+YES xsl:output
+YES method = "xml" | "html" | "text" | qname-but-not-ncname
+YES version = nmtoken
+YES encoding = string
+YES omit-xml-declaration = "yes" | "no"
+YES standalone = "yes" | "no"
+YES doctype-public = string
+YES doctype-system = string
+YES cdata-section-elements = qnames
+YES indent = "yes" | "no"
+YES media-type = string
+
+Instructions:
+=============
+
+YES xsl:apply-templates
+YES select = node-set-expression
+YES mode = qname
+
+YES xsl:apply-imports
+
+YES xsl:call-template
+YES name = qname
+
+YES xsl:element
+YES name = { qname }
+YES namespace = { uri-reference }
+YES use-attribute-sets = qnames
+
+YES xsl:attribute
+YES name = { qname }
+YES namespace = { uri-reference }
+
+YES xsl:text
+YES disable-output-escaping = "yes" | "no"
+
+YES xsl:processing-instruction
+YES name = { ncname }
+
+YES xsl:comment
+
+YES xsl:copy
+YES use-attribute-sets = qnames
+
+YES xsl:value-of
+YES select = string-expression
+YES disable-output-escaping = "yes" | "no"
+
+YES xsl:number
+YES level = "single" | "multiple" | "any"
+YES count = pattern
+YES from = pattern
+YES value = number-expression
+YES format = { string }
+NO lang = { nmtoken }
+NO letter-value = { "alphabetic" | "traditional" }
+YES grouping-separator = { char }
+YES grouping-size = { number }
+
+YES xsl:for-each
+YES select = node-set-expression
+
+YES xsl:if
+YES test = boolean-expression
+
+YES xsl:choose
+
+YES xsl:when
+YES test = boolean-expression
+
+YES xsl:otherwise
+
+YES xsl:sort
+YES select = string-expression
+NO lang = { nmtoken }
+YES data-type = { "text" | "number" | qname-but-not-ncname }
+YES order = { "ascending" | "descending" }
+NO case-order = { "upper-first" | "lower-first" }
+
+YES xsl:variable
+YES name = qname
+YES select = expression
+YES Content: template
+
+YES xsl:param
+YES name = qname
+YES select = expression
+YES Content: template
+
+YES xsl:copy-of
+YES select = expression
+
+YES xsl:with-param
+YES name = qname
+YES select = expression
+
+YES xsl:decimal-format
+YES name = qname
+YES decimal-separator = char
+YES grouping-separator = char
+YES infinity = string
+YES minus-sign = char
+YES NaN = string
+YES percent = char
+YES per-mille = char
+YES zero-digit = char
+YES digit = char
+YES pattern-separator = char
+
+YES xsl:message
+YES terminate = "yes" | "no"
+
+YES xsl:fallback
+
+General:
+========
+
+YES Conflict Resolution for Template Rules
+
+YES Whitespace Stripping
+
+YES Built-in Template Rules
+YES match="*|/"
+YES match="text()|@*"
+YES match="processing-instruction()|comment()"
+YES Namespace
+YES Mode
+
+YES Extension Elements
+
+YES Extension Functions
+
+YES Attribute Value Templates
+
+YES Result Tree Fragments
+
+Functions:
+==========
+
+YES node-set document(object, node-set?)
+YES node-set key(string, object)
+YES string format-number(number, string, string?)
+YES node-set current()
+YES string unparsed-entity-uri(string)
+YES string generate-id(node-set?)
+YES object system-property(string)
+YES boolean element-available(string)
+YES boolean function-available(string)
+
+Patterns:
+=========
+
+YES para
+YES *
+YES chapter|appendix
+YES olist/item
+YES appendix//para
+YES /
+YES text()
+YES processing-instruction()
+YES node()
+YES id("W11")
+YES para[1]
+YES *[position()=1 and self::para]
+YES para[last()=1]
+YES items/item[position()>1]
+YES item[position() mod 2 = 1]
+YES div[@class="appendix"]//p
+YES @class
+YES @*
+YES except ns for key key('a','b')
+
+daniel@veillard.com
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/FindGcrypt.cmake chromium-145.0.7632.159/third_party/libxslt/src/FindGcrypt.cmake
--- chromium-145.0.7632.116/third_party/libxslt/src/FindGcrypt.cmake 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/FindGcrypt.cmake 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,40 @@
+include(FindPackageHandleStandardArgs)
+include(SelectLibraryConfigurations)
+
+find_path(GCRYPT_INCLUDE_DIRS NAMES gcrypt.h)
+
+mark_as_advanced(GCRYPT_INCLUDE_DIRS)
+
+find_library(GCRYPT_LIBRARY_DEBUG NAMES gcryptd)
+find_library(GCRYPT_LIBRARY_RELEASE NAMES gcrypt)
+
+select_library_configurations(GCRYPT)
+
+if(GCRYPT_INCLUDE_DIRS AND EXISTS "${GCRYPT_INCLUDE_DIRS}/gcrypt.h")
+ file(STRINGS "${GCRYPT_INCLUDE_DIRS}/gcrypt.h" _GCRYPT_VERSION_DEFINE REGEX "#define[\t ]+GCRYPT_VERSION[\t ]+\"[^\"]*\".*")
+ string(REGEX REPLACE "#define[\t ]+GCRYPT_VERSION[\t ]+\"([^\"]*)\".*" "\\1" GCRYPT_VERSION "${_GCRYPT_VERSION_DEFINE}")
+ unset(_GCRYPT_VERSION_DEFINE)
+endif()
+
+find_package_handle_standard_args(
+ Gcrypt
+ FOUND_VAR GCRYPT_FOUND
+ REQUIRED_VARS GCRYPT_INCLUDE_DIRS GCRYPT_LIBRARIES
+ VERSION_VAR GCRYPT_VERSION
+)
+
+if(GCRYPT_FOUND AND NOT TARGET Gcrypt::Gcrypt)
+ add_library(Gcrypt::Gcrypt UNKNOWN IMPORTED)
+ if(GCRYPT_LIBRARY_RELEASE)
+ set_property(TARGET Gcrypt::Gcrypt APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
+ set_target_properties(Gcrypt::Gcrypt PROPERTIES IMPORTED_LOCATION_RELEASE "${GCRYPT_LIBRARY_RELEASE}")
+ endif()
+ if(GCRYPT_LIBRARY_DEBUG)
+ set_property(TARGET Gcrypt::Gcrypt APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
+ set_target_properties(Gcrypt::Gcrypt PROPERTIES IMPORTED_LOCATION_DEBUG "${GCRYPT_LIBRARY_DEBUG}")
+ endif()
+ set_target_properties(
+ Gcrypt::Gcrypt PROPERTIES
+ INTERFACE_INCLUDE_DIRECTORIES "${GCRYPT_INCLUDE_DIRS}"
+ )
+endif()
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/INSTALL chromium-145.0.7632.159/third_party/libxslt/src/INSTALL
--- chromium-145.0.7632.116/third_party/libxslt/src/INSTALL 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/INSTALL 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,50 @@
+ How to install the XSLT library:
+
+Requirements:
+=============
+
+this library requires a recent version of libxml2 which you can grab from
+either the GNOME download server or the GitLab release page:
+
+ https://gitlab.gnome.org/GNOME/libxml2/-/releases
+ https://download.gnome.org/sources/libxml2/
+
+When installing from a distribution package like a tar.gz:
+==========================================================
+
+expand the package
+
+run ./configure possibly indicating the desired installation prefix:
+
+ ./configure --prefix=/usr
+
+then run
+
+ make
+
+to build the project and
+
+ make install
+
+(possibly after having gained root access) to install the library
+and associated include and scripts.
+
+When installing from a Git clone:
+=================================
+
+
+run ./autogen.sh possibly indicating the desired installation prefix:
+
+ ./autogen.sh --prefix=/usr
+
+then run
+
+ make
+
+to build the project and
+
+ make install
+
+(possibly after having gained root access) to instal the library
+and associated include and scripts.
+
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/Makefile.am chromium-145.0.7632.159/third_party/libxslt/src/Makefile.am
--- chromium-145.0.7632.116/third_party/libxslt/src/Makefile.am 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/Makefile.am 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,51 @@
+ACLOCAL_AMFLAGS = -I m4
+
+SUBDIRS = libxslt libexslt xsltproc doc tests
+if WITH_PYTHON
+SUBDIRS += python
+endif
+
+DIST_SUBDIRS = libxslt libexslt xsltproc python doc tests
+
+confexecdir=$(libdir)
+confexec_DATA = xsltConf.sh
+
+bin_SCRIPTS = xslt-config
+
+dist-hook: cleanup
+ touch $(distdir)/doc/*.xml
+ touch $(distdir)/doc/EXSLT/*.xml
+ touch $(distdir)/libxslt/*.syms
+ (cd $(srcdir) ; tar -cf - win32 vms examples) | (cd $(distdir); tar xf -)
+
+EXTRA_DIST = xsltConf.sh.in \
+ FEATURES TODO Copyright \
+ CMakeLists.txt config.h.cmake.in libxslt-config.cmake.in libxslt-config.cmake.cmake.in
+
+## We create xsltConf.sh here and not from configure because we want
+## to get the paths expanded correctly. Macros like srcdir are given
+## the value NONE in configure if the user doesn't specify them (this
+## is an autoconf feature, not a bug).
+
+xsltConf.sh: xsltConf.sh.in Makefile
+## Use sed and then mv to avoid problems if the user interrupts.
+ sed -e 's?\@XSLT_LIBDIR\@?$(XSLT_LIBDIR)?g' \
+ -e 's?\@XSLT_INCLUDEDIR\@?$(XSLT_INCLUDEDIR)?g' \
+ -e 's?\@VERSION\@?$(VERSION)?g' \
+ -e 's?\@XSLT_LIBS\@?$(XSLT_LIBS) $(EXTRA_LIBS)?g' \
+ -e 's?\@XSLT_PRIVATE_LIBS\@?$(XSLT_PRIVATE_LIBS)?g' \
+ < $(srcdir)/xsltConf.sh.in > xsltConf.tmp \
+ && mv xsltConf.tmp xsltConf.sh
+
+CLEANFILES = xsltConf.sh
+
+cleanup:
+ -@(find . -name .\#\* -exec rm {} \;)
+
+pkgconfigdir=$(libdir)/pkgconfig
+pkgconfig_DATA = libxslt.pc libexslt.pc
+
+cmakedir = $(libdir)/cmake/libxslt
+dist_cmake_DATA = FindGcrypt.cmake
+cmake_DATA = libxslt-config.cmake
+
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/README.md chromium-145.0.7632.159/third_party/libxslt/src/README.md
--- chromium-145.0.7632.116/third_party/libxslt/src/README.md 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/README.md 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,19 @@
+# libxslt
+
+libxslt is an XSLT processor based on libxml2.
+
+Official releases can be downloaded from
+
+
+The git repository is hosted on GNOME's GitLab server:
+
+
+Bugs should be reported at
+
+
+Documentation is available at
+
+
+The build system is similar to libxml2. Refer to libxml2's README for
+build instructions.
+
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/TODO chromium-145.0.7632.159/third_party/libxslt/src/TODO
--- chromium-145.0.7632.116/third_party/libxslt/src/TODO 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/TODO 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,124 @@
+ ********
+ * *
+ * TODO *
+ * *
+ ********
+
+Lifetime of result Value Tree, make sure we keep pointers. Exslt
+handling of node set values is especially nasty in this respect,
+lots of potential mem leaks...
+
+Pattern tester:
+ -> try to optimize for ID scan and tests.
+
+Pattern scanner:
+ -> add error checks on all returns
+
+Sorting:
+ -> add lang and case-order
+ -> add foreign sorting functions (interfaces ?).
+
+ ********
+ * *
+ * DONE *
+ * *
+ ********
+
+Design:
+ - should transforms for a given stylesheet be thread clean,
+ -> the precompilation now occur only at stylesheet processing
+ time (except the binding for named templates and extension
+ functions which need to be computed once at run-time).
+ Multiple threads should be able to reuse the same stylesheet
+ now.
+
+Embedding Stylesheets:
+ - example in 2.7 would force to validate, we do it by default now
+
+ID and Key support:
+ -> Done
+
+Extra functions:
+ -> document() should not be a problem since Result Tree Fragments are
+ implemented
+ => Done
+
+Templates:
+ -> check the built-in template rule for attributes
+ -> make sure @xxx matches are applied
+
+Contextual error reporting:
+ -> provide a couple of functions providing context analysis, not urgent
+
+Validity:
+ -> should we add validation by default ? Make this an option
+ -> redirrect validity errors
+ => done added a special parsing mode
+
+Import:
+ -> parse them
+ -> provide functions to circulate in the import tree of stylesheets
+ -> make sure we use the cascade wherever it's needed
+
+Extra functions:
+ -> make a separate module.
+ => done functions.[ch]
+
+Support Attribute value templates:
+ -> starts to be urgent. Design it in flexible ways but try to optimize
+ to handle most of it at the stylesheet parse time ...
+ => Done for the most part need to check all attributes in XSLT constructs
+ using them and use the dedicated readin function.
+ -> optimization by checking their existence at stylesheet parse time.
+ => done when building the preproc function
+
+Sorting:
+ -> add support for imbricated sorts
+ => done but not well tested.
+
+Separate util module:
+ -> macros, config, verbosity ?
+ => xsltutils.[ch]
+
+Support for disable-output-escaping="yes":
+ -> looks problematic, libxml has no support for anything like this,
+ and unless adding a new node type :-( or tweaking text node and
+ output routines this is gonna be messy ... must be handled at libxml
+ level.
+ => Done with a trick, text node name is different, requires > 2.2.11
+
+Pattern scanner:
+ -> compute priority
+ -> handle unions
+ -> support for mode
+ => done
+
+Pattern tester:
+ -> also put fast lookup for "text()", "comment()", "node()"
+ based patterns lists.
+ => done
+
+Support Attribute value templates:
+ -> namespace support for attribute value templates is not done, need
+ a small API redesign
+
+Doc:
+ - put a page at http://xmlsoft.org/XSLT/
+ - generate/transform the DocBook to HTML
+ - add HTML to package
+ - manpage and doc for xsltproc
+
+
+Error handling:
+ -> check the version stuff, design a separate module for error interfacing
+ and default handling, parsing vs. runtime, fatal / compat / warning,
+ and lack of optionnal features.
+ -> reports context
+
+ID and Key support:
+ -> done but namespace support in keys is not defined
+ -> make sure keys are recomputed on new document input
+
+Profiler:
+ -> added looks good enough
+ -> autocorrection of initial calibration loop
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/config.h.cmake.in chromium-145.0.7632.159/third_party/libxslt/src/config.h.cmake.in
--- chromium-145.0.7632.116/third_party/libxslt/src/config.h.cmake.in 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/config.h.cmake.in 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,136 @@
+/* config.h. Generated from config.h.in by configure. */
+/* config.h.in. Generated from configure.ac by autoheader. */
+
+/* Define to 1 if you have the `clock_gettime' function. */
+#cmakedefine HAVE_CLOCK_GETTIME 1
+
+/* Define to 1 if you have the `ftime' function. */
+#cmakedefine HAVE_FTIME 1
+
+/* Define if gcrypt library is available. */
+#cmakedefine HAVE_GCRYPT 1
+
+/* Define to 1 if you have the `gettimeofday' function. */
+#cmakedefine HAVE_GETTIMEOFDAY 1
+
+/* Define to 1 if you have the `gmtime_r' function. */
+#cmakedefine HAVE_GMTIME_R 1
+
+/* Define to 1 if you have the header file. */
+#cmakedefine HAVE_INTTYPES_H 1
+
+/* Define if pthread library is there (-lpthread) */
+#cmakedefine HAVE_LIBPTHREAD
+
+/* Define to 1 if you have the header file. */
+#cmakedefine HAVE_LOCALE_H 1
+
+/* Define to 1 if you have the `localtime_r' function. */
+#cmakedefine HAVE_LOCALTIME_R 1
+
+/* Define if is there */
+#cmakedefine HAVE_PTHREAD_H
+
+/* Define to 1 if you have the `snprintf' function. */
+#cmakedefine HAVE_SNPRINTF 1
+
+/* Define to 1 if you have the `stat' function. */
+#cmakedefine HAVE_STAT 1
+
+/* Define to 1 if you have the `strxfrm_l' function. */
+#cmakedefine HAVE_STRXFRM_L 1
+
+/* Define to 1 if you have the header file. */
+#cmakedefine HAVE_SYS_SELECT_H 1
+
+/* Define to 1 if you have the header file. */
+#cmakedefine HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the header file. */
+#cmakedefine HAVE_SYS_TIMEB_H 1
+
+/* Define to 1 if you have the header file. */
+#cmakedefine HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the header file. */
+#cmakedefine HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the header file. */
+#cmakedefine HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#cmakedefine HAVE_VSNPRINTF 1
+
+/* Define to 1 if you have the header file. */
+#cmakedefine HAVE_XLOCALE_H 1
+
+/* Define to 1 if you have the `_stat' function. */
+#cmakedefine HAVE__STAT 1
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+#cmakedefine LT_OBJDIR "@LT_OBJDIR@"
+
+/* plugin file extension */
+#define MODULE_EXTENSION "@MODULE_EXTENSION@"
+
+/* Name of package */
+#cmakedefine PACKAGE "@PACKAGE@"
+
+/* Define to the address where bug reports for this package should be sent. */
+#cmakedefine PACKAGE_BUGREPORT "@PACKAGE_BUGREPORT@"
+
+/* Define to the full name of this package. */
+#cmakedefine PACKAGE_NAME "@PACKAGE_NAME@"
+
+/* Define to the full name and version of this package. */
+#cmakedefine PACKAGE_STRING "@PACKAGE_STRING@"
+
+/* Define to the one symbol short name of this package. */
+#cmakedefine PACKAGE_TARNAME "@PACKAGE_TARNAME@"
+
+/* Define to the home page for this package. */
+#cmakedefine PACKAGE_URL "@PACKAGE_URL@"
+
+/* Define to the version of this package. */
+#cmakedefine PACKAGE_VERSION "@PACKAGE_VERSION@"
+
+/* Enable extensions on AIX 3, Interix. */
+#ifndef _ALL_SOURCE
+#cmakedefine _ALL_SOURCE 1
+#endif
+/* Enable GNU extensions on systems that have them. */
+#ifndef _GNU_SOURCE
+#cmakedefine _GNU_SOURCE 1
+#endif
+/* Enable threading extensions on Solaris. */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+#cmakedefine _POSIX_PTHREAD_SEMANTICS 1
+#endif
+/* Enable extensions on HP NonStop. */
+#ifndef _TANDEM_SOURCE
+#cmakedefine _TANDEM_SOURCE 1
+#endif
+/* Enable general extensions on Solaris. */
+#ifndef __EXTENSIONS__
+#cmakedefine __EXTENSIONS__ 1
+#endif
+
+
+/* Version number of package */
+#cmakedefine VERSION "@VERSION@"
+
+/* Define if debugging support is enabled */
+#cmakedefine WITH_DEBUGGER 1
+
+/* Define if profiling support is enabled */
+#cmakedefine WITH_PROFILER 1
+
+/* Define to 1 if on MINIX. */
+#cmakedefine _MINIX 1
+
+/* Define to 2 if the system does not provide POSIX.1 features except with
+ this defined. */
+#cmakedefine _POSIX_1_SOURCE 2
+
+/* Define to 1 if you need to in order for `stat' and other things to work. */
+#cmakedefine _POSIX_SOURCE 1
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/config.h.in chromium-145.0.7632.159/third_party/libxslt/src/config.h.in
--- chromium-145.0.7632.116/third_party/libxslt/src/config.h.in 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/config.h.in 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,224 @@
+/* config.h.in. Generated from configure.ac by autoheader. */
+
+/* Define to 1 if you have the 'clock_gettime' function. */
+#undef HAVE_CLOCK_GETTIME
+
+/* Define to 1 if you have the header file. */
+#undef HAVE_DLFCN_H
+
+/* Define to 1 if you have the 'ftime' function. */
+#undef HAVE_FTIME
+
+/* Define if gcrypt library is available. */
+#undef HAVE_GCRYPT
+
+/* Define to 1 if you have the 'gettimeofday' function. */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define to 1 if you have the 'gmtime_r' function. */
+#undef HAVE_GMTIME_R
+
+/* Define to 1 if you have the header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define if pthread library is there (-lpthread) */
+#undef HAVE_LIBPTHREAD
+
+/* Define to 1 if you have the header file. */
+#undef HAVE_LOCALE_H
+
+/* Define to 1 if you have the 'localtime_r' function. */
+#undef HAVE_LOCALTIME_R
+
+/* Define to 1 if you have the header file. */
+#undef HAVE_MINIX_CONFIG_H
+
+/* Define if is there */
+#undef HAVE_PTHREAD_H
+
+/* Define to 1 if you have the 'snprintf' function. */
+#undef HAVE_SNPRINTF
+
+/* Define to 1 if you have the 'stat' function. */
+#undef HAVE_STAT
+
+/* Define to 1 if you have the header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the header file. */
+#undef HAVE_STDIO_H
+
+/* Define to 1 if you have the header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the header file. */
+#undef HAVE_STRING_H
+
+/* Define to 1 if you have the 'strxfrm_l' function. */
+#undef HAVE_STRXFRM_L
+
+/* Define to 1 if you have the header file. */
+#undef HAVE_SYS_SELECT_H
+
+/* Define to 1 if you have the header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the header file. */
+#undef HAVE_SYS_TIMEB_H
+
+/* Define to 1 if you have the header file. */
+#undef HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the 'vsnprintf' function. */
+#undef HAVE_VSNPRINTF
+
+/* Define to 1 if you have the header file. */
+#undef HAVE_WCHAR_H
+
+/* Define to 1 if you have the header file. */
+#undef HAVE_XLOCALE_H
+
+/* Define to 1 if you have the '_stat' function. */
+#undef HAVE__STAT
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+#undef LT_OBJDIR
+
+/* plugin file extension */
+#undef MODULE_EXTENSION
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to 1 if all of the C89 standard headers exist (not just the ones
+ required in a freestanding environment). This macro is provided for
+ backward compatibility; new code need not use it. */
+#undef STDC_HEADERS
+
+/* Enable extensions on AIX, Interix, z/OS. */
+#ifndef _ALL_SOURCE
+# undef _ALL_SOURCE
+#endif
+/* Enable general extensions on macOS. */
+#ifndef _DARWIN_C_SOURCE
+# undef _DARWIN_C_SOURCE
+#endif
+/* Enable general extensions on Solaris. */
+#ifndef __EXTENSIONS__
+# undef __EXTENSIONS__
+#endif
+/* Enable GNU extensions on systems that have them. */
+#ifndef _GNU_SOURCE
+# undef _GNU_SOURCE
+#endif
+/* Enable X/Open compliant socket functions that do not require linking
+ with -lxnet on HP-UX 11.11. */
+#ifndef _HPUX_ALT_XOPEN_SOCKET_API
+# undef _HPUX_ALT_XOPEN_SOCKET_API
+#endif
+/* Identify the host operating system as Minix.
+ This macro does not affect the system headers' behavior.
+ A future release of Autoconf may stop defining this macro. */
+#ifndef _MINIX
+# undef _MINIX
+#endif
+/* Enable general extensions on NetBSD.
+ Enable NetBSD compatibility extensions on Minix. */
+#ifndef _NETBSD_SOURCE
+# undef _NETBSD_SOURCE
+#endif
+/* Enable OpenBSD compatibility extensions on NetBSD.
+ Oddly enough, this does nothing on OpenBSD. */
+#ifndef _OPENBSD_SOURCE
+# undef _OPENBSD_SOURCE
+#endif
+/* Define to 1 if needed for POSIX-compatible behavior. */
+#ifndef _POSIX_SOURCE
+# undef _POSIX_SOURCE
+#endif
+/* Define to 2 if needed for POSIX-compatible behavior. */
+#ifndef _POSIX_1_SOURCE
+# undef _POSIX_1_SOURCE
+#endif
+/* Enable POSIX-compatible threading on Solaris. */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+# undef _POSIX_PTHREAD_SEMANTICS
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-5:2014. */
+#ifndef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
+# undef __STDC_WANT_IEC_60559_ATTRIBS_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-1:2014. */
+#ifndef __STDC_WANT_IEC_60559_BFP_EXT__
+# undef __STDC_WANT_IEC_60559_BFP_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-2:2015. */
+#ifndef __STDC_WANT_IEC_60559_DFP_EXT__
+# undef __STDC_WANT_IEC_60559_DFP_EXT__
+#endif
+/* Enable extensions specified by C23 Annex F. */
+#ifndef __STDC_WANT_IEC_60559_EXT__
+# undef __STDC_WANT_IEC_60559_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TS 18661-4:2015. */
+#ifndef __STDC_WANT_IEC_60559_FUNCS_EXT__
+# undef __STDC_WANT_IEC_60559_FUNCS_EXT__
+#endif
+/* Enable extensions specified by C23 Annex H and ISO/IEC TS 18661-3:2015. */
+#ifndef __STDC_WANT_IEC_60559_TYPES_EXT__
+# undef __STDC_WANT_IEC_60559_TYPES_EXT__
+#endif
+/* Enable extensions specified by ISO/IEC TR 24731-2:2010. */
+#ifndef __STDC_WANT_LIB_EXT2__
+# undef __STDC_WANT_LIB_EXT2__
+#endif
+/* Enable extensions specified by ISO/IEC 24747:2009. */
+#ifndef __STDC_WANT_MATH_SPEC_FUNCS__
+# undef __STDC_WANT_MATH_SPEC_FUNCS__
+#endif
+/* Enable extensions on HP NonStop. */
+#ifndef _TANDEM_SOURCE
+# undef _TANDEM_SOURCE
+#endif
+/* Enable X/Open extensions. Define to 500 only if necessary
+ to make mbstate_t available. */
+#ifndef _XOPEN_SOURCE
+# undef _XOPEN_SOURCE
+#endif
+
+
+/* Version number of package */
+#undef VERSION
+
+/* Define if debugging support is enabled */
+#undef WITH_DEBUGGER
+
+/* Define if profiling support is enabled */
+#undef WITH_PROFILER
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/libexslt/Makefile.am chromium-145.0.7632.159/third_party/libxslt/src/libexslt/Makefile.am
--- chromium-145.0.7632.116/third_party/libxslt/src/libexslt/Makefile.am 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/libexslt/Makefile.am 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,35 @@
+AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/libxslt -I$(top_srcdir)/libexslt \
+ -I$(top_builddir) -I$(top_builddir)/libxslt \
+ -I$(top_builddir)/libexslt
+
+lib_LTLIBRARIES = libexslt.la
+
+exsltincdir = $(includedir)/libexslt
+
+exsltinc_HEADERS = \
+ exslt.h \
+ exsltexports.h
+nodist_exsltinc_HEADERS = \
+ exsltconfig.h
+
+libexslt_la_SOURCES = \
+ exslt.c \
+ common.c \
+ crypto.c \
+ math.c \
+ sets.c \
+ functions.c \
+ strings.c \
+ date.c \
+ saxon.c \
+ libexslt.h \
+ dynamic.c
+
+libexslt_la_CFLAGS = $(AM_CFLAGS) $(LIBGCRYPT_CFLAGS)
+libexslt_la_LIBADD = $(top_builddir)/libxslt/libxslt.la $(LIBXML_LIBS) $(EXTRA_LIBS) $(LIBGCRYPT_LIBS) $(LIBM)
+libexslt_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined \
+ -version-info $(LIBEXSLT_VERSION_INFO)
+
+man_MANS = libexslt.3
+
+EXTRA_DIST = $(man_MANS)
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/libexslt/common.c chromium-145.0.7632.159/third_party/libxslt/src/libexslt/common.c
--- chromium-145.0.7632.116/third_party/libxslt/src/libexslt/common.c 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/libexslt/common.c 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,124 @@
+#define IN_LIBEXSLT
+#include "libexslt/libexslt.h"
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "exslt.h"
+
+static void
+exsltNodeSetFunction (xmlXPathParserContextPtr ctxt, int nargs) {
+ if (nargs != 1) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+ if (xmlXPathStackIsNodeSet (ctxt)) {
+ xsltFunctionNodeSet (ctxt, nargs);
+ return;
+ } else {
+ xmlDocPtr fragment;
+ xsltTransformContextPtr tctxt = xsltXPathGetTransformContext(ctxt);
+ xmlNodePtr txt;
+ xmlChar *strval;
+ xmlXPathObjectPtr obj;
+ /*
+ * SPEC EXSLT:
+ * "You can also use this function to turn a string into a text
+ * node, which is helpful if you want to pass a string to a
+ * function that only accepts a node-set."
+ */
+ fragment = xsltCreateRVT(tctxt);
+ if (fragment == NULL) {
+ xsltTransformError(tctxt, NULL, tctxt->inst,
+ "exsltNodeSetFunction: Failed to create a tree fragment.\n");
+ tctxt->state = XSLT_STATE_STOPPED;
+ return;
+ }
+ xsltRegisterLocalRVT(tctxt, fragment);
+
+ strval = xmlXPathPopString (ctxt);
+
+ txt = xmlNewDocText (fragment, strval);
+ xmlAddChild((xmlNodePtr) fragment, txt);
+ obj = xmlXPathNewNodeSet(txt);
+ if (obj == NULL) {
+ xsltTransformError(tctxt, NULL, tctxt->inst,
+ "exsltNodeSetFunction: Failed to create a node set object.\n");
+ tctxt->state = XSLT_STATE_STOPPED;
+ }
+ if (strval != NULL)
+ xmlFree (strval);
+
+ valuePush (ctxt, obj);
+ }
+}
+
+static void
+exsltObjectTypeFunction (xmlXPathParserContextPtr ctxt, int nargs) {
+ xmlXPathObjectPtr obj, ret;
+
+ if (nargs != 1) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+
+ obj = valuePop(ctxt);
+
+ switch (obj->type) {
+ case XPATH_STRING:
+ ret = xmlXPathNewCString("string");
+ break;
+ case XPATH_NUMBER:
+ ret = xmlXPathNewCString("number");
+ break;
+ case XPATH_BOOLEAN:
+ ret = xmlXPathNewCString("boolean");
+ break;
+ case XPATH_NODESET:
+ ret = xmlXPathNewCString("node-set");
+ break;
+ case XPATH_XSLT_TREE:
+ ret = xmlXPathNewCString("RTF");
+ break;
+ case XPATH_USERS:
+ ret = xmlXPathNewCString("external");
+ break;
+ default:
+ xsltGenericError(xsltGenericErrorContext,
+ "object-type() invalid arg\n");
+ ctxt->error = XPATH_INVALID_TYPE;
+ xmlXPathFreeObject(obj);
+ return;
+ }
+ xmlXPathFreeObject(obj);
+ valuePush(ctxt, ret);
+}
+
+
+/**
+ * exsltCommonRegister:
+ *
+ * Registers the EXSLT - Common module
+ */
+
+void
+exsltCommonRegister (void) {
+ xsltRegisterExtModuleFunction((const xmlChar *) "node-set",
+ EXSLT_COMMON_NAMESPACE,
+ exsltNodeSetFunction);
+ xsltRegisterExtModuleFunction((const xmlChar *) "object-type",
+ EXSLT_COMMON_NAMESPACE,
+ exsltObjectTypeFunction);
+ xsltRegisterExtModuleElement((const xmlChar *) "document",
+ EXSLT_COMMON_NAMESPACE,
+ xsltDocumentComp,
+ xsltDocumentElem);
+}
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/libexslt/crypto.c chromium-145.0.7632.159/third_party/libxslt/src/libexslt/crypto.c
--- chromium-145.0.7632.116/third_party/libxslt/src/libexslt/crypto.c 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/libexslt/crypto.c 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,806 @@
+#define IN_LIBEXSLT
+#include "libexslt/libexslt.h"
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+
+#include "exslt.h"
+
+#ifdef EXSLT_CRYPTO_ENABLED
+
+#define HASH_DIGEST_LENGTH 32
+#define MD5_DIGEST_LENGTH 16
+#define SHA1_DIGEST_LENGTH 20
+
+/* gcrypt rc4 can do 256 bit keys, but cryptoapi limit
+ seems to be 128 for the default provider */
+#define RC4_KEY_LENGTH 128
+
+/* The following routines have been declared static - this should be
+ reviewed to consider whether we want to expose them to the API
+ exsltCryptoBin2Hex
+ exsltCryptoHex2Bin
+ exsltCryptoGcryptInit
+ exsltCryptoGcryptHash
+ exsltCryptoGcryptRc4Encrypt
+ exsltCryptoGcryptRC4Decrypt
+*/
+
+/**
+ * exsltCryptoBin2Hex:
+ * @bin: binary blob to convert
+ * @binlen: length of binary blob
+ * @hex: buffer to store hex version of blob
+ * @hexlen: length of buffer to store hex version of blob
+ *
+ * Helper function which encodes a binary blob as hex.
+ */
+static void
+exsltCryptoBin2Hex (const unsigned char *bin, int binlen,
+ unsigned char *hex, int hexlen) {
+ static const char bin2hex[] = { '0', '1', '2', '3',
+ '4', '5', '6', '7',
+ '8', '9', 'a', 'b',
+ 'c', 'd', 'e', 'f'
+ };
+
+ unsigned char lo, hi;
+ int i, pos;
+ for (i = 0, pos = 0; (i < binlen && pos < hexlen); i++) {
+ lo = bin[i] & 0xf;
+ hi = bin[i] >> 4;
+ hex[pos++] = bin2hex[hi];
+ hex[pos++] = bin2hex[lo];
+ }
+
+ hex[pos] = '\0';
+}
+
+/**
+ * exsltCryptoHex2Bin:
+ * @hex: hex version of blob to convert
+ * @hexlen: length of hex buffer
+ * @bin: destination binary buffer
+ * @binlen: length of binary buffer
+ *
+ * Helper function which decodes a hex blob to binary
+ */
+static int
+exsltCryptoHex2Bin (const unsigned char *hex, int hexlen,
+ unsigned char *bin, int binlen) {
+ int i = 0, j = 0;
+ unsigned char lo, hi, result, tmp;
+
+ while (i < hexlen && j < binlen) {
+ hi = lo = 0;
+
+ tmp = hex[i++];
+ if (tmp >= '0' && tmp <= '9')
+ hi = tmp - '0';
+ else if (tmp >= 'a' && tmp <= 'f')
+ hi = 10 + (tmp - 'a');
+
+ tmp = hex[i++];
+ if (tmp >= '0' && tmp <= '9')
+ lo = tmp - '0';
+ else if (tmp >= 'a' && tmp <= 'f')
+ lo = 10 + (tmp - 'a');
+
+ result = hi << 4;
+ result += lo;
+ bin[j++] = result;
+ }
+
+ return j;
+}
+
+#if defined(_WIN32)
+
+#define HAVE_CRYPTO
+#define PLATFORM_HASH exsltCryptoCryptoApiHash
+#define PLATFORM_RC4_ENCRYPT exsltCryptoCryptoApiRc4Encrypt
+#define PLATFORM_RC4_DECRYPT exsltCryptoCryptoApiRc4Decrypt
+#define PLATFORM_MD4 CALG_MD4
+#define PLATFORM_MD5 CALG_MD5
+#define PLATFORM_SHA1 CALG_SHA1
+
+#include
+#include
+#ifdef _MSC_VER
+#pragma comment(lib, "advapi32.lib")
+#endif
+
+static void
+exsltCryptoCryptoApiReportError (xmlXPathParserContextPtr ctxt,
+ int line) {
+ char *lpMsgBuf;
+ DWORD dw = GetLastError ();
+
+ FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM, NULL, dw,
+ MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPSTR)&lpMsgBuf, 0, NULL);
+
+ xsltTransformError (xsltXPathGetTransformContext (ctxt), NULL, NULL,
+ "exslt:crypto error (line %d). %s", line,
+ lpMsgBuf);
+ LocalFree (lpMsgBuf);
+}
+
+static HCRYPTHASH
+exsltCryptoCryptoApiCreateHash (xmlXPathParserContextPtr ctxt,
+ HCRYPTPROV hCryptProv, ALG_ID algorithm,
+ const unsigned char *msg, unsigned int msglen,
+ char *dest, unsigned int destlen)
+{
+ HCRYPTHASH hHash = 0;
+ DWORD dwHashLen = destlen;
+
+ if (!CryptCreateHash (hCryptProv, algorithm, 0, 0, &hHash)) {
+ exsltCryptoCryptoApiReportError (ctxt, __LINE__);
+ return 0;
+ }
+
+ if (!CryptHashData (hHash, msg, msglen, 0)) {
+ exsltCryptoCryptoApiReportError (ctxt, __LINE__);
+ goto fail;
+ }
+
+ if (!CryptGetHashParam (hHash, HP_HASHVAL, (BYTE *) dest, &dwHashLen, 0)) {
+ exsltCryptoCryptoApiReportError (ctxt, __LINE__);
+ goto fail;
+ }
+
+ fail:
+ return hHash;
+}
+
+/**
+ * exsltCryptoCryptoApiHash:
+ * @ctxt: an XPath parser context
+ * @algorithm: hashing algorithm to use
+ * @msg: text to be hashed
+ * @msglen: length of text to be hashed
+ * @dest: buffer to place hash result
+ *
+ * Helper function which hashes a message using MD4, MD5, or SHA1.
+ * Uses Win32 CryptoAPI.
+ */
+static void
+exsltCryptoCryptoApiHash (xmlXPathParserContextPtr ctxt,
+ ALG_ID algorithm, const char *msg,
+ unsigned long msglen,
+ char dest[HASH_DIGEST_LENGTH]) {
+ HCRYPTPROV hCryptProv;
+ HCRYPTHASH hHash;
+
+ if (!CryptAcquireContext (&hCryptProv, NULL, NULL, PROV_RSA_FULL,
+ CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) {
+ exsltCryptoCryptoApiReportError (ctxt, __LINE__);
+ return;
+ }
+
+ hHash = exsltCryptoCryptoApiCreateHash (ctxt, hCryptProv,
+ algorithm, (unsigned char *) msg,
+ msglen, dest, HASH_DIGEST_LENGTH);
+ if (0 != hHash) {
+ CryptDestroyHash (hHash);
+ }
+
+ CryptReleaseContext (hCryptProv, 0);
+}
+
+static void
+exsltCryptoCryptoApiRc4Encrypt (xmlXPathParserContextPtr ctxt,
+ const unsigned char *key,
+ const unsigned char *msg, int msglen,
+ unsigned char *dest, int destlen) {
+ HCRYPTPROV hCryptProv;
+ HCRYPTKEY hKey;
+ HCRYPTHASH hHash;
+ DWORD dwDataLen;
+ char hash[HASH_DIGEST_LENGTH];
+
+ if (msglen > destlen) {
+ xsltTransformError (xsltXPathGetTransformContext (ctxt), NULL,
+ NULL,
+ "exslt:crypto : internal error exsltCryptoCryptoApiRc4Encrypt dest buffer too small.\n");
+ return;
+ }
+
+ if (!CryptAcquireContext (&hCryptProv, NULL, NULL, PROV_RSA_FULL,
+ CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) {
+ exsltCryptoCryptoApiReportError (ctxt, __LINE__);
+ return;
+ }
+
+ hHash = exsltCryptoCryptoApiCreateHash (ctxt, hCryptProv,
+ CALG_SHA1, key,
+ RC4_KEY_LENGTH, hash,
+ HASH_DIGEST_LENGTH);
+
+ if (!CryptDeriveKey
+ (hCryptProv, CALG_RC4, hHash, 0x00800000, &hKey)) {
+ exsltCryptoCryptoApiReportError (ctxt, __LINE__);
+ goto fail;
+ }
+/* Now encrypt data. */
+ dwDataLen = msglen;
+ memcpy (dest, msg, msglen);
+ if (!CryptEncrypt (hKey, 0, TRUE, 0, dest, &dwDataLen, msglen)) {
+ exsltCryptoCryptoApiReportError (ctxt, __LINE__);
+ goto fail;
+ }
+
+ fail:
+ if (0 != hHash) {
+ CryptDestroyHash (hHash);
+ }
+
+ CryptDestroyKey (hKey);
+ CryptReleaseContext (hCryptProv, 0);
+}
+
+static void
+exsltCryptoCryptoApiRc4Decrypt (xmlXPathParserContextPtr ctxt,
+ const unsigned char *key,
+ const unsigned char *msg, int msglen,
+ unsigned char *dest, int destlen) {
+ HCRYPTPROV hCryptProv;
+ HCRYPTKEY hKey;
+ HCRYPTHASH hHash;
+ DWORD dwDataLen;
+ char hash[HASH_DIGEST_LENGTH];
+
+ if (msglen > destlen) {
+ xsltTransformError (xsltXPathGetTransformContext (ctxt), NULL,
+ NULL,
+ "exslt:crypto : internal error exsltCryptoCryptoApiRc4Encrypt dest buffer too small.\n");
+ return;
+ }
+
+ if (!CryptAcquireContext (&hCryptProv, NULL, NULL, PROV_RSA_FULL,
+ CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) {
+ exsltCryptoCryptoApiReportError (ctxt, __LINE__);
+ return;
+ }
+
+ hHash = exsltCryptoCryptoApiCreateHash (ctxt, hCryptProv,
+ CALG_SHA1, key,
+ RC4_KEY_LENGTH, hash,
+ HASH_DIGEST_LENGTH);
+
+ if (!CryptDeriveKey
+ (hCryptProv, CALG_RC4, hHash, 0x00800000, &hKey)) {
+ exsltCryptoCryptoApiReportError (ctxt, __LINE__);
+ goto fail;
+ }
+/* Now encrypt data. */
+ dwDataLen = msglen;
+ memcpy (dest, msg, msglen);
+ if (!CryptDecrypt (hKey, 0, TRUE, 0, dest, &dwDataLen)) {
+ exsltCryptoCryptoApiReportError (ctxt, __LINE__);
+ goto fail;
+ }
+
+ fail:
+ if (0 != hHash) {
+ CryptDestroyHash (hHash);
+ }
+
+ CryptDestroyKey (hKey);
+ CryptReleaseContext (hCryptProv, 0);
+}
+
+#endif /* defined(_WIN32) */
+
+#if defined(HAVE_GCRYPT)
+
+#define HAVE_CRYPTO
+#define PLATFORM_HASH exsltCryptoGcryptHash
+#define PLATFORM_RC4_ENCRYPT exsltCryptoGcryptRc4Encrypt
+#define PLATFORM_RC4_DECRYPT exsltCryptoGcryptRc4Decrypt
+#define PLATFORM_MD4 GCRY_MD_MD4
+#define PLATFORM_MD5 GCRY_MD_MD5
+#define PLATFORM_SHA1 GCRY_MD_SHA1
+
+#ifdef HAVE_SYS_TYPES_H
+# include
+#endif
+
+#ifdef HAVE_SYS_SELECT_H
+#include /* needed by gcrypt.h 4 Jul 04 */
+#endif
+#include
+
+static void
+exsltCryptoGcryptInit (void) {
+ static int gcrypt_init;
+ xmlLockLibrary ();
+
+ if (!gcrypt_init) {
+/* The function `gcry_check_version' must be called before any other
+ function in the library, because it initializes the thread support
+ subsystem in Libgcrypt. To achieve this in all generality, it is
+ necessary to synchronize the call to this function with all other calls
+ to functions in the library, using the synchronization mechanisms
+ available in your thread library. (from gcrypt.info)
+*/
+ gcry_check_version (GCRYPT_VERSION);
+ gcrypt_init = 1;
+ }
+
+ xmlUnlockLibrary ();
+}
+
+/**
+ * exsltCryptoGcryptHash:
+ * @ctxt: an XPath parser context
+ * @algorithm: hashing algorithm to use
+ * @msg: text to be hashed
+ * @msglen: length of text to be hashed
+ * @dest: buffer to place hash result
+ *
+ * Helper function which hashes a message using MD4, MD5, or SHA1.
+ * using gcrypt
+ */
+static void
+exsltCryptoGcryptHash (xmlXPathParserContextPtr ctxt ATTRIBUTE_UNUSED,
+/* changed the enum to int */
+ int algorithm, const char *msg,
+ unsigned long msglen,
+ char dest[HASH_DIGEST_LENGTH]) {
+ exsltCryptoGcryptInit ();
+ gcry_md_hash_buffer (algorithm, dest, msg, msglen);
+}
+
+static void
+exsltCryptoGcryptRc4Encrypt (xmlXPathParserContextPtr ctxt,
+ const unsigned char *key,
+ const unsigned char *msg, int msglen,
+ unsigned char *dest, int destlen) {
+ gcry_cipher_hd_t cipher;
+ gcry_error_t rc = 0;
+
+ exsltCryptoGcryptInit ();
+
+ rc = gcry_cipher_open (&cipher, GCRY_CIPHER_ARCFOUR,
+ GCRY_CIPHER_MODE_STREAM, 0);
+ if (rc) {
+ xsltTransformError (xsltXPathGetTransformContext (ctxt), NULL,
+ NULL,
+ "exslt:crypto internal error %s (gcry_cipher_open)\n",
+ gcry_strerror (rc));
+ }
+
+ rc = gcry_cipher_setkey (cipher, key, RC4_KEY_LENGTH);
+ if (rc) {
+ xsltTransformError (xsltXPathGetTransformContext (ctxt), NULL,
+ NULL,
+ "exslt:crypto internal error %s (gcry_cipher_setkey)\n",
+ gcry_strerror (rc));
+ }
+
+ rc = gcry_cipher_encrypt (cipher, (unsigned char *) dest, destlen,
+ (const unsigned char *) msg, msglen);
+ if (rc) {
+ xsltTransformError (xsltXPathGetTransformContext (ctxt), NULL,
+ NULL,
+ "exslt:crypto internal error %s (gcry_cipher_encrypt)\n",
+ gcry_strerror (rc));
+ }
+
+ gcry_cipher_close (cipher);
+}
+
+static void
+exsltCryptoGcryptRc4Decrypt (xmlXPathParserContextPtr ctxt,
+ const unsigned char *key,
+ const unsigned char *msg, int msglen,
+ unsigned char *dest, int destlen) {
+ gcry_cipher_hd_t cipher;
+ gcry_error_t rc = 0;
+
+ exsltCryptoGcryptInit ();
+
+ rc = gcry_cipher_open (&cipher, GCRY_CIPHER_ARCFOUR,
+ GCRY_CIPHER_MODE_STREAM, 0);
+ if (rc) {
+ xsltTransformError (xsltXPathGetTransformContext (ctxt), NULL,
+ NULL,
+ "exslt:crypto internal error %s (gcry_cipher_open)\n",
+ gcry_strerror (rc));
+ }
+
+ rc = gcry_cipher_setkey (cipher, key, RC4_KEY_LENGTH);
+ if (rc) {
+ xsltTransformError (xsltXPathGetTransformContext (ctxt), NULL,
+ NULL,
+ "exslt:crypto internal error %s (gcry_cipher_setkey)\n",
+ gcry_strerror (rc));
+ }
+
+ rc = gcry_cipher_decrypt (cipher, (unsigned char *) dest, destlen,
+ (const unsigned char *) msg, msglen);
+ if (rc) {
+ xsltTransformError (xsltXPathGetTransformContext (ctxt), NULL,
+ NULL,
+ "exslt:crypto internal error %s (gcry_cipher_decrypt)\n",
+ gcry_strerror (rc));
+ }
+
+ gcry_cipher_close (cipher);
+}
+
+#endif /* defined(HAVE_GCRYPT) */
+
+#if defined(HAVE_CRYPTO)
+
+/**
+ * exsltCryptoPopString:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Helper function which checks for and returns first string argument and its
+ * length in bytes.
+ */
+static int
+exsltCryptoPopString (xmlXPathParserContextPtr ctxt, int nargs,
+ xmlChar ** str) {
+
+ int str_len = 0;
+
+ if ((nargs < 1) || (nargs > 2)) {
+ xmlXPathSetArityError (ctxt);
+ return 0;
+ }
+
+ *str = xmlXPathPopString (ctxt);
+ str_len = xmlStrlen (*str);
+
+ if (str_len == 0) {
+ xmlXPathReturnEmptyString (ctxt);
+ xmlFree (*str);
+ return 0;
+ }
+
+ return str_len;
+}
+
+/**
+ * exsltCryptoMd4Function:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * computes the md4 hash of a string and returns as hex
+ */
+static void
+exsltCryptoMd4Function (xmlXPathParserContextPtr ctxt, int nargs) {
+
+ int str_len = 0;
+ xmlChar *str = NULL, *ret = NULL;
+ unsigned char hash[HASH_DIGEST_LENGTH];
+ unsigned char hex[MD5_DIGEST_LENGTH * 2 + 1];
+
+ str_len = exsltCryptoPopString (ctxt, nargs, &str);
+ if (str_len == 0)
+ return;
+
+ PLATFORM_HASH (ctxt, PLATFORM_MD4, (const char *) str, str_len,
+ (char *) hash);
+ exsltCryptoBin2Hex (hash, sizeof (hash) - 1, hex, sizeof (hex) - 1);
+
+ ret = xmlStrdup ((xmlChar *) hex);
+ xmlXPathReturnString (ctxt, ret);
+
+ if (str != NULL)
+ xmlFree (str);
+}
+
+/**
+ * exsltCryptoMd5Function:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * computes the md5 hash of a string and returns as hex
+ */
+static void
+exsltCryptoMd5Function (xmlXPathParserContextPtr ctxt, int nargs) {
+
+ int str_len = 0;
+ xmlChar *str = NULL, *ret = NULL;
+ unsigned char hash[HASH_DIGEST_LENGTH];
+ unsigned char hex[MD5_DIGEST_LENGTH * 2 + 1];
+
+ str_len = exsltCryptoPopString (ctxt, nargs, &str);
+ if (str_len == 0)
+ return;
+
+ PLATFORM_HASH (ctxt, PLATFORM_MD5, (const char *) str, str_len,
+ (char *) hash);
+ exsltCryptoBin2Hex (hash, sizeof (hash) - 1, hex, sizeof (hex) - 1);
+
+ ret = xmlStrdup ((xmlChar *) hex);
+ xmlXPathReturnString (ctxt, ret);
+
+ if (str != NULL)
+ xmlFree (str);
+}
+
+/**
+ * exsltCryptoSha1Function:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * computes the sha1 hash of a string and returns as hex
+ */
+static void
+exsltCryptoSha1Function (xmlXPathParserContextPtr ctxt, int nargs) {
+
+ int str_len = 0;
+ xmlChar *str = NULL, *ret = NULL;
+ unsigned char hash[HASH_DIGEST_LENGTH];
+ unsigned char hex[SHA1_DIGEST_LENGTH * 2 + 1];
+
+ str_len = exsltCryptoPopString (ctxt, nargs, &str);
+ if (str_len == 0)
+ return;
+
+ PLATFORM_HASH (ctxt, PLATFORM_SHA1, (const char *) str, str_len,
+ (char *) hash);
+ exsltCryptoBin2Hex (hash, sizeof (hash) - 1, hex, sizeof (hex) - 1);
+
+ ret = xmlStrdup ((xmlChar *) hex);
+ xmlXPathReturnString (ctxt, ret);
+
+ if (str != NULL)
+ xmlFree (str);
+}
+
+/**
+ * exsltCryptoRc4EncryptFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * computes the sha1 hash of a string and returns as hex
+ */
+static void
+exsltCryptoRc4EncryptFunction (xmlXPathParserContextPtr ctxt, int nargs) {
+
+ int key_len = 0;
+ int str_len = 0, bin_len = 0, hex_len = 0;
+ xmlChar *key = NULL, *str = NULL, *padkey = NULL;
+ xmlChar *bin = NULL, *hex = NULL;
+ xsltTransformContextPtr tctxt = NULL;
+
+ if (nargs != 2) {
+ xmlXPathSetArityError (ctxt);
+ return;
+ }
+ tctxt = xsltXPathGetTransformContext(ctxt);
+
+ str = xmlXPathPopString (ctxt);
+ str_len = xmlStrlen (str);
+
+ if (str_len == 0) {
+ xmlXPathReturnEmptyString (ctxt);
+ xmlFree (str);
+ return;
+ }
+
+ key = xmlXPathPopString (ctxt);
+ key_len = xmlStrlen (key);
+
+ if (key_len == 0) {
+ xmlXPathReturnEmptyString (ctxt);
+ xmlFree (key);
+ xmlFree (str);
+ return;
+ }
+
+ padkey = xmlMallocAtomic (RC4_KEY_LENGTH + 1);
+ if (padkey == NULL) {
+ xsltTransformError(tctxt, NULL, tctxt->inst,
+ "exsltCryptoRc4EncryptFunction: Failed to allocate padkey\n");
+ tctxt->state = XSLT_STATE_STOPPED;
+ xmlXPathReturnEmptyString (ctxt);
+ goto done;
+ }
+ memset(padkey, 0, RC4_KEY_LENGTH + 1);
+
+ if ((key_len > RC4_KEY_LENGTH) || (key_len < 0)) {
+ xsltTransformError(tctxt, NULL, tctxt->inst,
+ "exsltCryptoRc4EncryptFunction: key size too long or key broken\n");
+ tctxt->state = XSLT_STATE_STOPPED;
+ xmlXPathReturnEmptyString (ctxt);
+ goto done;
+ }
+ memcpy (padkey, key, key_len);
+
+/* encrypt it */
+ bin_len = str_len;
+ bin = xmlStrdup (str);
+ if (bin == NULL) {
+ xsltTransformError(tctxt, NULL, tctxt->inst,
+ "exsltCryptoRc4EncryptFunction: Failed to allocate string\n");
+ tctxt->state = XSLT_STATE_STOPPED;
+ xmlXPathReturnEmptyString (ctxt);
+ goto done;
+ }
+ PLATFORM_RC4_ENCRYPT (ctxt, padkey, str, str_len, bin, bin_len);
+
+/* encode it */
+ hex_len = str_len * 2 + 1;
+ hex = xmlMallocAtomic (hex_len);
+ if (hex == NULL) {
+ xsltTransformError(tctxt, NULL, tctxt->inst,
+ "exsltCryptoRc4EncryptFunction: Failed to allocate result\n");
+ tctxt->state = XSLT_STATE_STOPPED;
+ xmlXPathReturnEmptyString (ctxt);
+ goto done;
+ }
+
+ exsltCryptoBin2Hex (bin, str_len, hex, hex_len);
+ xmlXPathReturnString (ctxt, hex);
+
+done:
+ if (key != NULL)
+ xmlFree (key);
+ if (str != NULL)
+ xmlFree (str);
+ if (padkey != NULL)
+ xmlFree (padkey);
+ if (bin != NULL)
+ xmlFree (bin);
+}
+
+/**
+ * exsltCryptoRc4DecryptFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * computes the sha1 hash of a string and returns as hex
+ */
+static void
+exsltCryptoRc4DecryptFunction (xmlXPathParserContextPtr ctxt, int nargs) {
+
+ int key_len = 0;
+ int str_len = 0, bin_len = 0, ret_len = 0;
+ xmlChar *key = NULL, *str = NULL, *padkey = NULL, *bin =
+ NULL, *ret = NULL;
+ xsltTransformContextPtr tctxt = NULL;
+
+ if (nargs != 2) {
+ xmlXPathSetArityError (ctxt);
+ return;
+ }
+ tctxt = xsltXPathGetTransformContext(ctxt);
+
+ str = xmlXPathPopString (ctxt);
+ str_len = xmlStrlen (str);
+
+ if (str_len == 0) {
+ xmlXPathReturnEmptyString (ctxt);
+ xmlFree (str);
+ return;
+ }
+
+ key = xmlXPathPopString (ctxt);
+ key_len = xmlStrlen (key);
+
+ if (key_len == 0) {
+ xmlXPathReturnEmptyString (ctxt);
+ xmlFree (key);
+ xmlFree (str);
+ return;
+ }
+
+ padkey = xmlMallocAtomic (RC4_KEY_LENGTH + 1);
+ if (padkey == NULL) {
+ xsltTransformError(tctxt, NULL, tctxt->inst,
+ "exsltCryptoRc4EncryptFunction: Failed to allocate padkey\n");
+ tctxt->state = XSLT_STATE_STOPPED;
+ xmlXPathReturnEmptyString (ctxt);
+ goto done;
+ }
+ memset(padkey, 0, RC4_KEY_LENGTH + 1);
+ if ((key_len > RC4_KEY_LENGTH) || (key_len < 0)) {
+ xsltTransformError(tctxt, NULL, tctxt->inst,
+ "exsltCryptoRc4EncryptFunction: key size too long or key broken\n");
+ tctxt->state = XSLT_STATE_STOPPED;
+ xmlXPathReturnEmptyString (ctxt);
+ goto done;
+ }
+ memcpy (padkey, key, key_len);
+
+/* decode hex to binary */
+ bin_len = str_len;
+ bin = xmlMallocAtomic (bin_len);
+ if (bin == NULL) {
+ xsltTransformError(tctxt, NULL, tctxt->inst,
+ "exsltCryptoRc4EncryptFunction: Failed to allocate string\n");
+ tctxt->state = XSLT_STATE_STOPPED;
+ xmlXPathReturnEmptyString (ctxt);
+ goto done;
+ }
+ ret_len = exsltCryptoHex2Bin (str, str_len, bin, bin_len);
+
+/* decrypt the binary blob */
+ ret = xmlMallocAtomic (ret_len + 1);
+ if (ret == NULL) {
+ xsltTransformError(tctxt, NULL, tctxt->inst,
+ "exsltCryptoRc4EncryptFunction: Failed to allocate result\n");
+ tctxt->state = XSLT_STATE_STOPPED;
+ xmlXPathReturnEmptyString (ctxt);
+ goto done;
+ }
+ PLATFORM_RC4_DECRYPT (ctxt, padkey, bin, ret_len, ret, ret_len);
+ ret[ret_len] = 0;
+
+ if (xmlCheckUTF8(ret) == 0) {
+ xsltTransformError(tctxt, NULL, tctxt->inst,
+ "exsltCryptoRc4DecryptFunction: Invalid UTF-8\n");
+ xmlFree(ret);
+ xmlXPathReturnEmptyString(ctxt);
+ } else {
+ xmlXPathReturnString(ctxt, ret);
+ }
+
+done:
+ if (key != NULL)
+ xmlFree (key);
+ if (str != NULL)
+ xmlFree (str);
+ if (padkey != NULL)
+ xmlFree (padkey);
+ if (bin != NULL)
+ xmlFree (bin);
+}
+
+/**
+ * exsltCryptoRegister:
+ *
+ * Registers the EXSLT - Crypto module
+ */
+
+void
+exsltCryptoRegister (void) {
+ xsltRegisterExtModuleFunction ((const xmlChar *) "md4",
+ EXSLT_CRYPTO_NAMESPACE,
+ exsltCryptoMd4Function);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "md5",
+ EXSLT_CRYPTO_NAMESPACE,
+ exsltCryptoMd5Function);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "sha1",
+ EXSLT_CRYPTO_NAMESPACE,
+ exsltCryptoSha1Function);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "rc4_encrypt",
+ EXSLT_CRYPTO_NAMESPACE,
+ exsltCryptoRc4EncryptFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "rc4_decrypt",
+ EXSLT_CRYPTO_NAMESPACE,
+ exsltCryptoRc4DecryptFunction);
+}
+
+#else
+/**
+ * exsltCryptoRegister:
+ *
+ * Registers the EXSLT - Crypto module
+ */
+void
+exsltCryptoRegister (void) {
+}
+
+#endif /* defined(HAVE_CRYPTO) */
+
+#endif /* EXSLT_CRYPTO_ENABLED */
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/libexslt/date.c chromium-145.0.7632.159/third_party/libxslt/src/libexslt/date.c
--- chromium-145.0.7632.116/third_party/libxslt/src/libexslt/date.c 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/libexslt/date.c 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,3956 @@
+/*
+ * date.c: Implementation of the EXSLT -- Dates and Times module
+ *
+ * References:
+ * http://www.exslt.org/date/date.html
+ *
+ * See Copyright for the status of this software.
+ *
+ * Authors:
+ * Charlie Bozeman
+ * Thomas Broyer
+ *
+ * TODO:
+ * elements:
+ * date-format
+ * functions:
+ * format-date
+ * parse-date
+ * sum
+ */
+
+#define IN_LIBEXSLT
+#include "libexslt/libexslt.h"
+
+#if defined(HAVE_LOCALTIME_R) && defined(__GLIBC__) /* _POSIX_SOURCE required by gnu libc */
+#ifndef _AIX51 /* but on AIX we're not using gnu libc */
+#define _POSIX_SOURCE
+#endif
+#endif
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+
+#include "exslt.h"
+
+#include
+#include
+#include
+#include
+#include
+
+/* needed to get localtime_r on Solaris */
+#ifdef __sun
+#ifndef __EXTENSIONS__
+#define __EXTENSIONS__
+#endif
+#endif
+
+#include
+
+#if defined(_MSC_VER) && _MSC_VER >= 1400 || \
+ defined(_WIN32) && \
+ defined(__MINGW64_VERSION_MAJOR) && __MINGW64_VERSION_MAJOR >= 4
+ #define HAVE_MSVCRT
+#endif
+
+/*
+ * types of date and/or time (from schema datatypes)
+ * somewhat ordered from least specific to most specific (i.e.
+ * most truncated to least truncated).
+ */
+typedef enum {
+ EXSLT_UNKNOWN = 0,
+ XS_TIME = 1, /* time is left-truncated */
+ XS_GDAY = (XS_TIME << 1),
+ XS_GMONTH = (XS_GDAY << 1),
+ XS_GMONTHDAY = (XS_GMONTH | XS_GDAY),
+ XS_GYEAR = (XS_GMONTH << 1),
+ XS_GYEARMONTH = (XS_GYEAR | XS_GMONTH),
+ XS_DATE = (XS_GYEAR | XS_GMONTH | XS_GDAY),
+ XS_DATETIME = (XS_DATE | XS_TIME)
+} exsltDateType;
+
+/* Date value */
+typedef struct _exsltDateVal exsltDateVal;
+typedef exsltDateVal *exsltDateValPtr;
+struct _exsltDateVal {
+ exsltDateType type;
+ long year;
+ unsigned int mon :4; /* 1 <= mon <= 12 */
+ unsigned int day :5; /* 1 <= day <= 31 */
+ unsigned int hour :5; /* 0 <= hour <= 23 */
+ unsigned int min :6; /* 0 <= min <= 59 */
+ double sec;
+ unsigned int tz_flag :1; /* is tzo explicitely set? */
+ signed int tzo :12; /* -1440 <= tzo <= 1440 currently only -840 to +840 are needed */
+};
+
+/* Duration value */
+typedef struct _exsltDateDurVal exsltDateDurVal;
+typedef exsltDateDurVal *exsltDateDurValPtr;
+struct _exsltDateDurVal {
+ long mon; /* mon stores years also */
+ long day;
+ double sec; /* sec stores min and hour also
+ 0 <= sec < SECS_PER_DAY */
+};
+
+/****************************************************************
+ * *
+ * Convenience macros and functions *
+ * *
+ ****************************************************************/
+
+#define IS_TZO_CHAR(c) \
+ ((c == 0) || (c == 'Z') || (c == '+') || (c == '-'))
+
+#define VALID_ALWAYS(num) (num >= 0)
+#define VALID_MONTH(mon) ((mon >= 1) && (mon <= 12))
+/* VALID_DAY should only be used when month is unknown */
+#define VALID_DAY(day) ((day >= 1) && (day <= 31))
+#define VALID_HOUR(hr) ((hr >= 0) && (hr <= 23))
+#define VALID_MIN(min) ((min >= 0) && (min <= 59))
+#define VALID_SEC(sec) ((sec >= 0) && (sec < 60))
+#define VALID_TZO(tzo) ((tzo > -1440) && (tzo < 1440))
+#define IS_LEAP(y) \
+ (((y & 3) == 0) && ((y % 25 != 0) || ((y & 15) == 0)))
+
+static const long daysInMonth[12] =
+ { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+static const long daysInMonthLeap[12] =
+ { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
+
+#define MAX_DAYINMONTH(yr,mon) \
+ (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1])
+
+#define VALID_MDAY(dt) \
+ (IS_LEAP(dt->year) ? \
+ (dt->day <= daysInMonthLeap[dt->mon - 1]) : \
+ (dt->day <= daysInMonth[dt->mon - 1]))
+
+#define VALID_DATE(dt) \
+ (VALID_MONTH(dt->mon) && VALID_MDAY(dt))
+
+/*
+ hour and min structure vals are unsigned, so normal macros give
+ warnings on some compilers.
+*/
+#define VALID_TIME(dt) \
+ ((dt->hour <=23 ) && (dt->min <= 59) && \
+ VALID_SEC(dt->sec) && VALID_TZO(dt->tzo))
+
+#define VALID_DATETIME(dt) \
+ (VALID_DATE(dt) && VALID_TIME(dt))
+
+#define SECS_PER_MIN 60
+#define MINS_PER_HOUR 60
+#define HOURS_PER_DAY 24
+#define SECS_PER_HOUR (MINS_PER_HOUR * SECS_PER_MIN)
+#define SECS_PER_DAY (HOURS_PER_DAY * SECS_PER_HOUR)
+#define MINS_PER_DAY (HOURS_PER_DAY * MINS_PER_HOUR)
+#define DAYS_PER_EPOCH (400 * 365 + 100 - 4 + 1)
+#define YEARS_PER_EPOCH 400
+
+static const long dayInYearByMonth[12] =
+ { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
+static const long dayInLeapYearByMonth[12] =
+ { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };
+
+#define DAY_IN_YEAR(day, month, year) \
+ ((IS_LEAP(year) ? \
+ dayInLeapYearByMonth[month - 1] : \
+ dayInYearByMonth[month - 1]) + day)
+
+#define YEAR_MAX LONG_MAX
+#define YEAR_MIN (-LONG_MAX + 1)
+
+/**
+ * _exsltDateParseGYear:
+ * @dt: pointer to a date structure
+ * @str: pointer to the string to analyze
+ *
+ * Parses a xs:gYear without time zone and fills in the appropriate
+ * field of the @dt structure. @str is updated to point just after the
+ * xs:gYear. It is supposed that @dt->year is big enough to contain
+ * the year.
+ *
+ * According to XML Schema Part 2, the year "0000" is an illegal year value
+ * which probably means that the year preceding AD 1 is BC 1. Internally,
+ * we allow a year 0 and adjust the value when parsing and formatting.
+ *
+ * Returns 0 or the error code
+ */
+static int
+_exsltDateParseGYear (exsltDateValPtr dt, const xmlChar **str)
+{
+ const xmlChar *cur = *str, *firstChar;
+ int isneg = 0, digcnt = 0;
+
+ if (((*cur < '0') || (*cur > '9')) &&
+ (*cur != '-') && (*cur != '+'))
+ return -1;
+
+ if (*cur == '-') {
+ isneg = 1;
+ cur++;
+ }
+
+ firstChar = cur;
+
+ while ((*cur >= '0') && (*cur <= '9')) {
+ if (dt->year >= YEAR_MAX / 10) /* Not really exact */
+ return -1;
+ dt->year = dt->year * 10 + (*cur - '0');
+ cur++;
+ digcnt++;
+ }
+
+ /* year must be at least 4 digits (CCYY); over 4
+ * digits cannot have a leading zero. */
+ if ((digcnt < 4) || ((digcnt > 4) && (*firstChar == '0')))
+ return 1;
+
+ if (dt->year == 0)
+ return 2;
+
+ /* The internal representation of negative years is continuous. */
+ if (isneg)
+ dt->year = -dt->year + 1;
+
+ *str = cur;
+
+#ifdef DEBUG_EXSLT_DATE
+ xsltGenericDebug(xsltGenericDebugContext,
+ "Parsed year %04ld\n", dt->year);
+#endif
+
+ return 0;
+}
+
+/**
+ * exsltFormatGYear:
+ * @cur: a pointer to a pointer to an allocated buffer
+ * @end: a pointer to the end of @cur buffer
+ * @yr: the year to format
+ *
+ * Formats @yr in xsl:gYear format. Result is appended to @cur and
+ * @cur is updated to point after the xsl:gYear.
+ */
+static void
+exsltFormatGYear(xmlChar **cur, xmlChar *end, long yr)
+{
+ long year;
+ xmlChar tmp_buf[100], *tmp = tmp_buf, *tmp_end = tmp_buf + 99;
+
+ if (yr <= 0 && *cur < end) {
+ *(*cur)++ = '-';
+ }
+
+ year = (yr <= 0) ? -yr + 1 : yr;
+ /* result is in reverse-order */
+ while (year > 0 && tmp < tmp_end) {
+ *tmp++ = '0' + (xmlChar)(year % 10);
+ year /= 10;
+ }
+
+ /* virtually adds leading zeros */
+ while ((tmp - tmp_buf) < 4)
+ *tmp++ = '0';
+
+ /* restore the correct order */
+ while (tmp > tmp_buf && *cur < end) {
+ tmp--;
+ *(*cur)++ = *tmp;
+ }
+}
+
+/**
+ * PARSE_2_DIGITS:
+ * @num: the integer to fill in
+ * @cur: an #xmlChar *
+ * @func: validation function for the number
+ * @invalid: an integer
+ *
+ * Parses a 2-digits integer and updates @num with the value. @cur is
+ * updated to point just after the integer.
+ * In case of error, @invalid is set to %TRUE, values of @num and
+ * @cur are undefined.
+ */
+#define PARSE_2_DIGITS(num, cur, func, invalid) \
+ if ((cur[0] < '0') || (cur[0] > '9') || \
+ (cur[1] < '0') || (cur[1] > '9')) \
+ invalid = 1; \
+ else { \
+ int val; \
+ val = (cur[0] - '0') * 10 + (cur[1] - '0'); \
+ if (!func(val)) \
+ invalid = 2; \
+ else \
+ num = val; \
+ } \
+ cur += 2;
+
+/**
+ * exsltFormat2Digits:
+ * @cur: a pointer to a pointer to an allocated buffer
+ * @end: a pointer to the end of @cur buffer
+ * @num: the integer to format
+ *
+ * Formats a 2-digits integer. Result is appended to @cur and
+ * @cur is updated to point after the integer.
+ */
+static void
+exsltFormat2Digits(xmlChar **cur, xmlChar *end, unsigned int num)
+{
+ if (*cur < end)
+ *(*cur)++ = '0' + ((num / 10) % 10);
+ if (*cur < end)
+ *(*cur)++ = '0' + (num % 10);
+}
+
+/**
+ * PARSE_FLOAT:
+ * @num: the double to fill in
+ * @cur: an #xmlChar *
+ * @invalid: an integer
+ *
+ * Parses a float and updates @num with the value. @cur is
+ * updated to point just after the float. The float must have a
+ * 2-digits integer part and may or may not have a decimal part.
+ * In case of error, @invalid is set to %TRUE, values of @num and
+ * @cur are undefined.
+ */
+#define PARSE_FLOAT(num, cur, invalid) \
+ PARSE_2_DIGITS(num, cur, VALID_ALWAYS, invalid); \
+ if (!invalid && (*cur == '.')) { \
+ double mult = 1; \
+ cur++; \
+ if ((*cur < '0') || (*cur > '9')) \
+ invalid = 1; \
+ while ((*cur >= '0') && (*cur <= '9')) { \
+ mult /= 10; \
+ num += (*cur - '0') * mult; \
+ cur++; \
+ } \
+ }
+
+/**
+ * _exsltDateParseGMonth:
+ * @dt: pointer to a date structure
+ * @str: pointer to the string to analyze
+ *
+ * Parses a xs:gMonth without time zone and fills in the appropriate
+ * field of the @dt structure. @str is updated to point just after the
+ * xs:gMonth.
+ *
+ * Returns 0 or the error code
+ */
+static int
+_exsltDateParseGMonth (exsltDateValPtr dt, const xmlChar **str)
+{
+ const xmlChar *cur = *str;
+ int ret = 0;
+
+ PARSE_2_DIGITS(dt->mon, cur, VALID_MONTH, ret);
+ if (ret != 0)
+ return ret;
+
+ *str = cur;
+
+#ifdef DEBUG_EXSLT_DATE
+ xsltGenericDebug(xsltGenericDebugContext,
+ "Parsed month %02i\n", dt->mon);
+#endif
+
+ return 0;
+}
+
+/**
+ * _exsltDateParseGDay:
+ * @dt: pointer to a date structure
+ * @str: pointer to the string to analyze
+ *
+ * Parses a xs:gDay without time zone and fills in the appropriate
+ * field of the @dt structure. @str is updated to point just after the
+ * xs:gDay.
+ *
+ * Returns 0 or the error code
+ */
+static int
+_exsltDateParseGDay (exsltDateValPtr dt, const xmlChar **str)
+{
+ const xmlChar *cur = *str;
+ int ret = 0;
+
+ PARSE_2_DIGITS(dt->day, cur, VALID_DAY, ret);
+ if (ret != 0)
+ return ret;
+
+ *str = cur;
+
+#ifdef DEBUG_EXSLT_DATE
+ xsltGenericDebug(xsltGenericDebugContext,
+ "Parsed day %02i\n", dt->day);
+#endif
+
+ return 0;
+}
+
+/**
+ * exsltFormatYearMonthDay:
+ * @cur: a pointer to a pointer to an allocated buffer
+ * @end: a pointer to the end of @cur buffer
+ * @dt: the #exsltDateVal to format
+ *
+ * Formats @dt in xsl:date format. Result is appended to @cur and
+ * @cur is updated to point after the xsl:date.
+ */
+static void
+exsltFormatYearMonthDay(xmlChar **cur, xmlChar *end, const exsltDateValPtr dt)
+{
+ exsltFormatGYear(cur, end, dt->year);
+ if (*cur < end)
+ *(*cur)++ = '-';
+ exsltFormat2Digits(cur, end, dt->mon);
+ if (*cur < end)
+ *(*cur)++ = '-';
+ exsltFormat2Digits(cur, end, dt->day);
+}
+
+/**
+ * _exsltDateParseTime:
+ * @dt: pointer to a date structure
+ * @str: pointer to the string to analyze
+ *
+ * Parses a xs:time without time zone and fills in the appropriate
+ * fields of the @dt structure. @str is updated to point just after the
+ * xs:time.
+ * In case of error, values of @dt fields are undefined.
+ *
+ * Returns 0 or the error code
+ */
+static int
+_exsltDateParseTime (exsltDateValPtr dt, const xmlChar **str)
+{
+ const xmlChar *cur = *str;
+ unsigned int hour = 0; /* use temp var in case str is not xs:time */
+ int ret = 0;
+
+ PARSE_2_DIGITS(hour, cur, VALID_HOUR, ret);
+ if (ret != 0)
+ return ret;
+
+ if (*cur != ':')
+ return 1;
+ cur++;
+
+ /* the ':' insures this string is xs:time */
+ dt->hour = hour;
+
+ PARSE_2_DIGITS(dt->min, cur, VALID_MIN, ret);
+ if (ret != 0)
+ return ret;
+
+ if (*cur != ':')
+ return 1;
+ cur++;
+
+ PARSE_FLOAT(dt->sec, cur, ret);
+ if (ret != 0)
+ return ret;
+
+ if (!VALID_TIME(dt))
+ return 2;
+
+ *str = cur;
+
+#ifdef DEBUG_EXSLT_DATE
+ xsltGenericDebug(xsltGenericDebugContext,
+ "Parsed time %02i:%02i:%02.f\n",
+ dt->hour, dt->min, dt->sec);
+#endif
+
+ return 0;
+}
+
+/**
+ * _exsltDateParseTimeZone:
+ * @dt: pointer to a date structure
+ * @str: pointer to the string to analyze
+ *
+ * Parses a time zone without time zone and fills in the appropriate
+ * field of the @dt structure. @str is updated to point just after the
+ * time zone.
+ *
+ * Returns 0 or the error code
+ */
+static int
+_exsltDateParseTimeZone (exsltDateValPtr dt, const xmlChar **str)
+{
+ const xmlChar *cur;
+ int ret = 0;
+
+ if (str == NULL)
+ return -1;
+ cur = *str;
+ switch (*cur) {
+ case 0:
+ dt->tz_flag = 0;
+ dt->tzo = 0;
+ break;
+
+ case 'Z':
+ dt->tz_flag = 1;
+ dt->tzo = 0;
+ cur++;
+ break;
+
+ case '+':
+ case '-': {
+ int isneg = 0, tmp = 0;
+ isneg = (*cur == '-');
+
+ cur++;
+
+ PARSE_2_DIGITS(tmp, cur, VALID_HOUR, ret);
+ if (ret != 0)
+ return ret;
+
+ if (*cur != ':')
+ return 1;
+ cur++;
+
+ dt->tzo = tmp * 60;
+
+ PARSE_2_DIGITS(tmp, cur, VALID_MIN, ret);
+ if (ret != 0)
+ return ret;
+
+ dt->tzo += tmp;
+ if (isneg)
+ dt->tzo = - dt->tzo;
+
+ if (!VALID_TZO(dt->tzo))
+ return 2;
+
+ break;
+ }
+ default:
+ return 1;
+ }
+
+ *str = cur;
+
+#ifdef DEBUG_EXSLT_DATE
+ xsltGenericDebug(xsltGenericDebugContext,
+ "Parsed time zone offset (%s) %i\n",
+ dt->tz_flag ? "explicit" : "implicit", dt->tzo);
+#endif
+
+ return 0;
+}
+
+/**
+ * exsltFormatTimeZone:
+ * @cur: a pointer to a pointer to an allocated buffer
+ * @end: a pointer to the end of @cur buffer
+ * @tzo: the timezone offset to format
+ *
+ * Formats @tzo timezone. Result is appended to @cur and
+ * @cur is updated to point after the timezone.
+ */
+static void
+exsltFormatTimeZone(xmlChar **cur, xmlChar *end, int tzo)
+{
+ if (tzo == 0) {
+ if (*cur < end)
+ *(*cur)++ = 'Z';
+ } else {
+ unsigned int aTzo = (tzo < 0) ? -tzo : tzo;
+ unsigned int tzHh = aTzo / 60, tzMm = aTzo % 60;
+ if (*cur < end)
+ *(*cur)++ = (tzo < 0) ? '-' : '+';
+ exsltFormat2Digits(cur, end, tzHh);
+ if (*cur < end)
+ *(*cur)++ = ':';
+ exsltFormat2Digits(cur, end, tzMm);
+ }
+}
+
+/****************************************************************
+ * *
+ * XML Schema Dates/Times Datatypes Handling *
+ * *
+ ****************************************************************/
+
+/**
+ * exsltDateCreateDate:
+ * @type: type to create
+ *
+ * Creates a new #exsltDateVal, uninitialized.
+ *
+ * Returns the #exsltDateValPtr
+ */
+static exsltDateValPtr
+exsltDateCreateDate (exsltDateType type)
+{
+ exsltDateValPtr ret;
+
+ ret = (exsltDateValPtr) xmlMalloc(sizeof(exsltDateVal));
+ if (ret == NULL) {
+ xsltGenericError(xsltGenericErrorContext,
+ "exsltDateCreateDate: out of memory\n");
+ return (NULL);
+ }
+ memset (ret, 0, sizeof(exsltDateVal));
+
+ ret->mon = 1;
+ ret->day = 1;
+
+ if (type != EXSLT_UNKNOWN)
+ ret->type = type;
+
+ return ret;
+}
+
+/**
+ * exsltDateFreeDate:
+ * @date: an #exsltDateValPtr
+ *
+ * Frees up the @date
+ */
+static void
+exsltDateFreeDate (exsltDateValPtr date) {
+ if (date == NULL)
+ return;
+
+ xmlFree(date);
+}
+
+/**
+ * exsltDateCreateDuration:
+ *
+ * Creates a new #exsltDateDurVal, uninitialized.
+ *
+ * Returns the #exsltDateDurValPtr
+ */
+static exsltDateDurValPtr
+exsltDateCreateDuration (void)
+{
+ exsltDateDurValPtr ret;
+
+ ret = (exsltDateDurValPtr) xmlMalloc(sizeof(exsltDateDurVal));
+ if (ret == NULL) {
+ xsltGenericError(xsltGenericErrorContext,
+ "exsltDateCreateDuration: out of memory\n");
+ return (NULL);
+ }
+ memset (ret, 0, sizeof(exsltDateDurVal));
+
+ return ret;
+}
+
+/**
+ * exsltDateFreeDuration:
+ * @date: an #exsltDateDurValPtr
+ *
+ * Frees up the @duration
+ */
+static void
+exsltDateFreeDuration (exsltDateDurValPtr duration) {
+ if (duration == NULL)
+ return;
+
+ xmlFree(duration);
+}
+
+/**
+ * exsltDateCurrent:
+ *
+ * Returns the current date and time.
+ */
+static exsltDateValPtr
+exsltDateCurrent (void)
+{
+ struct tm localTm, gmTm;
+#if !defined(HAVE_GMTIME_R) && !defined(HAVE_MSVCRT)
+ struct tm *tb = NULL;
+#endif
+ time_t secs;
+ int local_s, gm_s;
+ exsltDateValPtr ret;
+ char *source_date_epoch;
+ int override = 0;
+
+ ret = exsltDateCreateDate(XS_DATETIME);
+ if (ret == NULL)
+ return NULL;
+
+ /*
+ * Allow the date and time to be set externally by an exported
+ * environment variable to enable reproducible builds.
+ */
+ source_date_epoch = getenv("SOURCE_DATE_EPOCH");
+ if (source_date_epoch) {
+ errno = 0;
+ secs = (time_t) strtol (source_date_epoch, NULL, 10);
+ if (errno == 0) {
+#ifdef HAVE_MSVCRT
+ struct tm *gm = gmtime_s(&localTm, &secs) ? NULL : &localTm;
+ if (gm != NULL)
+ override = 1;
+#elif HAVE_GMTIME_R
+ if (gmtime_r(&secs, &localTm) != NULL)
+ override = 1;
+#else
+ tb = gmtime(&secs);
+ if (tb != NULL) {
+ localTm = *tb;
+ override = 1;
+ }
+#endif
+ }
+ }
+
+ if (override == 0) {
+ /* get current time */
+ secs = time(NULL);
+
+#ifdef HAVE_MSVCRT
+ localtime_s(&localTm, &secs);
+#elif HAVE_LOCALTIME_R
+ localtime_r(&secs, &localTm);
+#else
+ localTm = *localtime(&secs);
+#endif
+ }
+
+ /* get real year, not years since 1900 */
+ ret->year = localTm.tm_year + 1900;
+
+ ret->mon = localTm.tm_mon + 1;
+ ret->day = localTm.tm_mday;
+ ret->hour = localTm.tm_hour;
+ ret->min = localTm.tm_min;
+
+ /* floating point seconds */
+ ret->sec = (double) localTm.tm_sec;
+
+ /* determine the time zone offset from local to gm time */
+#ifdef HAVE_MSVCRT
+ gmtime_s(&gmTm, &secs);
+#elif HAVE_GMTIME_R
+ gmtime_r(&secs, &gmTm);
+#else
+ tb = gmtime(&secs);
+ if (tb == NULL)
+ return NULL;
+ gmTm = *tb;
+#endif
+ ret->tz_flag = 0;
+#if 0
+ ret->tzo = (((ret->day * 1440) +
+ (ret->hour * 60) +
+ ret->min) -
+ ((gmTm.tm_mday * 1440) + (gmTm.tm_hour * 60) +
+ gmTm.tm_min));
+#endif
+ local_s = localTm.tm_hour * SECS_PER_HOUR +
+ localTm.tm_min * SECS_PER_MIN +
+ localTm.tm_sec;
+
+ gm_s = gmTm.tm_hour * SECS_PER_HOUR +
+ gmTm.tm_min * SECS_PER_MIN +
+ gmTm.tm_sec;
+
+ if (localTm.tm_year < gmTm.tm_year) {
+ ret->tzo = -((SECS_PER_DAY - local_s) + gm_s)/60;
+ } else if (localTm.tm_year > gmTm.tm_year) {
+ ret->tzo = ((SECS_PER_DAY - gm_s) + local_s)/60;
+ } else if (localTm.tm_mon < gmTm.tm_mon) {
+ ret->tzo = -((SECS_PER_DAY - local_s) + gm_s)/60;
+ } else if (localTm.tm_mon > gmTm.tm_mon) {
+ ret->tzo = ((SECS_PER_DAY - gm_s) + local_s)/60;
+ } else if (localTm.tm_mday < gmTm.tm_mday) {
+ ret->tzo = -((SECS_PER_DAY - local_s) + gm_s)/60;
+ } else if (localTm.tm_mday > gmTm.tm_mday) {
+ ret->tzo = ((SECS_PER_DAY - gm_s) + local_s)/60;
+ } else {
+ ret->tzo = (local_s - gm_s)/60;
+ }
+
+ return ret;
+}
+
+/**
+ * exsltDateParse:
+ * @dateTime: string to analyze
+ *
+ * Parses a date/time string
+ *
+ * Returns a newly built #exsltDateValPtr of NULL in case of error
+ */
+static exsltDateValPtr
+exsltDateParse (const xmlChar *dateTime)
+{
+ exsltDateValPtr dt;
+ int ret;
+ const xmlChar *cur = dateTime;
+
+#define RETURN_TYPE_IF_VALID(t) \
+ if (IS_TZO_CHAR(*cur)) { \
+ ret = _exsltDateParseTimeZone(dt, &cur); \
+ if (ret == 0) { \
+ if (*cur != 0) \
+ goto error; \
+ dt->type = t; \
+ return dt; \
+ } \
+ }
+
+ if (dateTime == NULL)
+ return NULL;
+
+ if ((*cur != '-') && (*cur < '0') && (*cur > '9'))
+ return NULL;
+
+ dt = exsltDateCreateDate(EXSLT_UNKNOWN);
+ if (dt == NULL)
+ return NULL;
+
+ if ((cur[0] == '-') && (cur[1] == '-')) {
+ /*
+ * It's an incomplete date (xs:gMonthDay, xs:gMonth or
+ * xs:gDay)
+ */
+ cur += 2;
+
+ /* is it an xs:gDay? */
+ if (*cur == '-') {
+ ++cur;
+ ret = _exsltDateParseGDay(dt, &cur);
+ if (ret != 0)
+ goto error;
+
+ RETURN_TYPE_IF_VALID(XS_GDAY);
+
+ goto error;
+ }
+
+ /*
+ * it should be an xs:gMonthDay or xs:gMonth
+ */
+ ret = _exsltDateParseGMonth(dt, &cur);
+ if (ret != 0)
+ goto error;
+
+ if (*cur != '-')
+ goto error;
+ cur++;
+
+ /* is it an xs:gMonth? */
+ if (*cur == '-') {
+ cur++;
+ RETURN_TYPE_IF_VALID(XS_GMONTH);
+ goto error;
+ }
+
+ /* it should be an xs:gMonthDay */
+ ret = _exsltDateParseGDay(dt, &cur);
+ if (ret != 0)
+ goto error;
+
+ RETURN_TYPE_IF_VALID(XS_GMONTHDAY);
+
+ goto error;
+ }
+
+ /*
+ * It's a right-truncated date or an xs:time.
+ * Try to parse an xs:time then fallback on right-truncated dates.
+ */
+ if ((*cur >= '0') && (*cur <= '9')) {
+ ret = _exsltDateParseTime(dt, &cur);
+ if (ret == 0) {
+ /* it's an xs:time */
+ RETURN_TYPE_IF_VALID(XS_TIME);
+ }
+ }
+
+ /* fallback on date parsing */
+ cur = dateTime;
+
+ ret = _exsltDateParseGYear(dt, &cur);
+ if (ret != 0)
+ goto error;
+
+ /* is it an xs:gYear? */
+ RETURN_TYPE_IF_VALID(XS_GYEAR);
+
+ if (*cur != '-')
+ goto error;
+ cur++;
+
+ ret = _exsltDateParseGMonth(dt, &cur);
+ if (ret != 0)
+ goto error;
+
+ /* is it an xs:gYearMonth? */
+ RETURN_TYPE_IF_VALID(XS_GYEARMONTH);
+
+ if (*cur != '-')
+ goto error;
+ cur++;
+
+ ret = _exsltDateParseGDay(dt, &cur);
+ if ((ret != 0) || !VALID_DATE(dt))
+ goto error;
+
+ /* is it an xs:date? */
+ RETURN_TYPE_IF_VALID(XS_DATE);
+
+ if (*cur != 'T')
+ goto error;
+ cur++;
+
+ /* it should be an xs:dateTime */
+ ret = _exsltDateParseTime(dt, &cur);
+ if (ret != 0)
+ goto error;
+
+ ret = _exsltDateParseTimeZone(dt, &cur);
+ if ((ret != 0) || (*cur != 0) || !VALID_DATETIME(dt))
+ goto error;
+
+ dt->type = XS_DATETIME;
+
+ return dt;
+
+error:
+ if (dt != NULL)
+ exsltDateFreeDate(dt);
+ return NULL;
+}
+
+/**
+ * exsltDateParseDuration:
+ * @duration: string to analyze
+ *
+ * Parses a duration string
+ *
+ * Returns a newly built #exsltDateDurValPtr of NULL in case of error
+ */
+static exsltDateDurValPtr
+exsltDateParseDuration (const xmlChar *duration)
+{
+ const xmlChar *cur = duration;
+ exsltDateDurValPtr dur;
+ int isneg = 0;
+ unsigned int seq = 0;
+ long days, secs = 0;
+ double sec_frac = 0.0;
+
+ if (duration == NULL)
+ return NULL;
+
+ if (*cur == '-') {
+ isneg = 1;
+ cur++;
+ }
+
+ /* duration must start with 'P' (after sign) */
+ if (*cur++ != 'P')
+ return NULL;
+
+ if (*cur == 0)
+ return NULL;
+
+ dur = exsltDateCreateDuration();
+ if (dur == NULL)
+ return NULL;
+
+ while (*cur != 0) {
+ long num = 0;
+ size_t has_digits = 0;
+ int has_frac = 0;
+ const xmlChar desig[] = {'Y', 'M', 'D', 'H', 'M', 'S'};
+
+ /* input string should be empty or invalid date/time item */
+ if (seq >= sizeof(desig))
+ goto error;
+
+ /* T designator must be present for time items */
+ if (*cur == 'T') {
+ if (seq > 3)
+ goto error;
+ cur++;
+ seq = 3;
+ } else if (seq == 3)
+ goto error;
+
+ /* Parse integral part. */
+ while (*cur >= '0' && *cur <= '9') {
+ long digit = *cur - '0';
+
+ if (num > LONG_MAX / 10)
+ goto error;
+ num *= 10;
+ if (num > LONG_MAX - digit)
+ goto error;
+ num += digit;
+
+ has_digits = 1;
+ cur++;
+ }
+
+ if (*cur == '.') {
+ /* Parse fractional part. */
+ double mult = 1.0;
+ cur++;
+ has_frac = 1;
+ while (*cur >= '0' && *cur <= '9') {
+ mult /= 10.0;
+ sec_frac += (*cur - '0') * mult;
+ has_digits = 1;
+ cur++;
+ }
+ }
+
+ while (*cur != desig[seq]) {
+ seq++;
+ /* No T designator or invalid char. */
+ if (seq == 3 || seq == sizeof(desig))
+ goto error;
+ }
+ cur++;
+
+ if (!has_digits || (has_frac && (seq != 5)))
+ goto error;
+
+ switch (seq) {
+ case 0:
+ /* Year */
+ if (num > LONG_MAX / 12)
+ goto error;
+ dur->mon = num * 12;
+ break;
+ case 1:
+ /* Month */
+ if (dur->mon > LONG_MAX - num)
+ goto error;
+ dur->mon += num;
+ break;
+ case 2:
+ /* Day */
+ dur->day = num;
+ break;
+ case 3:
+ /* Hour */
+ days = num / HOURS_PER_DAY;
+ if (dur->day > LONG_MAX - days)
+ goto error;
+ dur->day += days;
+ secs = (num % HOURS_PER_DAY) * SECS_PER_HOUR;
+ break;
+ case 4:
+ /* Minute */
+ days = num / MINS_PER_DAY;
+ if (dur->day > LONG_MAX - days)
+ goto error;
+ dur->day += days;
+ secs += (num % MINS_PER_DAY) * SECS_PER_MIN;
+ break;
+ case 5:
+ /* Second */
+ days = num / SECS_PER_DAY;
+ if (dur->day > LONG_MAX - days)
+ goto error;
+ dur->day += days;
+ secs += num % SECS_PER_DAY;
+ break;
+ }
+
+ seq++;
+ }
+
+ days = secs / SECS_PER_DAY;
+ if (dur->day > LONG_MAX - days)
+ goto error;
+ dur->day += days;
+ dur->sec = (secs % SECS_PER_DAY) + sec_frac;
+
+ if (isneg) {
+ dur->mon = -dur->mon;
+ dur->day = -dur->day;
+ if (dur->sec != 0.0) {
+ dur->sec = SECS_PER_DAY - dur->sec;
+ dur->day -= 1;
+ }
+ }
+
+#ifdef DEBUG_EXSLT_DATE
+ xsltGenericDebug(xsltGenericDebugContext,
+ "Parsed duration %f\n", dur->sec);
+#endif
+
+ return dur;
+
+error:
+ if (dur != NULL)
+ exsltDateFreeDuration(dur);
+ return NULL;
+}
+
+static void
+exsltFormatLong(xmlChar **cur, xmlChar *end, long num) {
+ xmlChar buf[20];
+ int i = 0;
+
+ while (i < 20) {
+ buf[i++] = '0' + num % 10;
+ num /= 10;
+ if (num == 0)
+ break;
+ }
+
+ while (i > 0) {
+ if (*cur < end)
+ *(*cur)++ = buf[--i];
+ }
+}
+
+static void
+exsltFormatNanoseconds(xmlChar **cur, xmlChar *end, long nsecs) {
+ long p10, digit;
+
+ if (nsecs > 0) {
+ if (*cur < end)
+ *(*cur)++ = '.';
+ p10 = 100000000;
+ while (nsecs > 0) {
+ digit = nsecs / p10;
+ if (*cur < end)
+ *(*cur)++ = '0' + digit;
+ nsecs -= digit * p10;
+ p10 /= 10;
+ }
+ }
+}
+
+/**
+ * exsltDateFormatDuration:
+ * @dur: an #exsltDateDurValPtr
+ *
+ * Formats the duration.
+ *
+ * Returns a newly allocated string, or NULL in case of error
+ */
+static xmlChar *
+exsltDateFormatDuration (const exsltDateDurValPtr dur)
+{
+ xmlChar buf[100], *cur = buf, *end = buf + 99;
+ double secs, tmp;
+ long days, months, intSecs, nsecs;
+
+ if (dur == NULL)
+ return NULL;
+
+ /* quick and dirty check */
+ if ((dur->sec == 0.0) && (dur->day == 0) && (dur->mon == 0))
+ return xmlStrdup((xmlChar*)"P0D");
+
+ secs = dur->sec;
+ days = dur->day;
+ months = dur->mon;
+
+ *cur = '\0';
+ if (days < 0) {
+ if (secs != 0.0) {
+ secs = SECS_PER_DAY - secs;
+ days += 1;
+ }
+ days = -days;
+ *cur = '-';
+ }
+ if (months < 0) {
+ months = -months;
+ *cur = '-';
+ }
+ if (*cur == '-')
+ cur++;
+
+ *cur++ = 'P';
+
+ if (months >= 12) {
+ long years = months / 12;
+
+ months -= years * 12;
+ exsltFormatLong(&cur, end, years);
+ if (cur < end)
+ *cur++ = 'Y';
+ }
+
+ if (months != 0) {
+ exsltFormatLong(&cur, end, months);
+ if (cur < end)
+ *cur++ = 'M';
+ }
+
+ if (days != 0) {
+ exsltFormatLong(&cur, end, days);
+ if (cur < end)
+ *cur++ = 'D';
+ }
+
+ tmp = floor(secs);
+ intSecs = (long) tmp;
+ /* Round to nearest to avoid issues with floating point precision */
+ nsecs = (long) floor((secs - tmp) * 1000000000 + 0.5);
+ if (nsecs >= 1000000000) {
+ nsecs -= 1000000000;
+ intSecs += 1;
+ }
+
+ if ((intSecs > 0) || (nsecs > 0)) {
+ if (cur < end)
+ *cur++ = 'T';
+
+ if (intSecs >= SECS_PER_HOUR) {
+ long hours = intSecs / SECS_PER_HOUR;
+
+ intSecs -= hours * SECS_PER_HOUR;
+ exsltFormatLong(&cur, end, hours);
+ if (cur < end)
+ *cur++ = 'H';
+ }
+
+ if (intSecs >= SECS_PER_MIN) {
+ long mins = intSecs / SECS_PER_MIN;
+
+ intSecs -= mins * SECS_PER_MIN;
+ exsltFormatLong(&cur, end, mins);
+ if (cur < end)
+ *cur++ = 'M';
+ }
+
+ if ((intSecs > 0) || (nsecs > 0)) {
+ exsltFormatLong(&cur, end, intSecs);
+ exsltFormatNanoseconds(&cur, end, nsecs);
+ if (cur < end)
+ *cur++ = 'S';
+ }
+ }
+
+ *cur = 0;
+
+ return xmlStrdup(buf);
+}
+
+static void
+exsltFormatTwoDigits(xmlChar **cur, xmlChar *end, int num) {
+ if (num < 0 || num >= 100)
+ return;
+ if (*cur < end)
+ *(*cur)++ = '0' + num / 10;
+ if (*cur < end)
+ *(*cur)++ = '0' + num % 10;
+}
+
+static void
+exsltFormatTime(xmlChar **cur, xmlChar *end, exsltDateValPtr dt) {
+ double tmp;
+ long intSecs, nsecs;
+
+ exsltFormatTwoDigits(cur, end, dt->hour);
+ if (*cur < end)
+ *(*cur)++ = ':';
+
+ exsltFormatTwoDigits(cur, end, dt->min);
+ if (*cur < end)
+ *(*cur)++ = ':';
+
+ tmp = floor(dt->sec);
+ intSecs = (long) tmp;
+ /*
+ * Round to nearest to avoid issues with floating point precision,
+ * but don't carry over so seconds stay below 60.
+ */
+ nsecs = (long) floor((dt->sec - tmp) * 1000000000 + 0.5);
+ if (nsecs > 999999999)
+ nsecs = 999999999;
+ exsltFormatTwoDigits(cur, end, intSecs);
+ exsltFormatNanoseconds(cur, end, nsecs);
+}
+
+/**
+ * exsltDateFormatDateTime:
+ * @dt: an #exsltDateValPtr
+ *
+ * Formats @dt in xs:dateTime format.
+ *
+ * Returns a newly allocated string, or NULL in case of error
+ */
+static xmlChar *
+exsltDateFormatDateTime (const exsltDateValPtr dt)
+{
+ xmlChar buf[100], *cur = buf, *end = buf + 99;
+
+ if ((dt == NULL) || !VALID_DATETIME(dt))
+ return NULL;
+
+ exsltFormatYearMonthDay(&cur, end, dt);
+ if (cur < end)
+ *cur++ = 'T';
+ exsltFormatTime(&cur, end, dt);
+ exsltFormatTimeZone(&cur, end, dt->tzo);
+ *cur = 0;
+
+ return xmlStrdup(buf);
+}
+
+/**
+ * exsltDateFormatDate:
+ * @dt: an #exsltDateValPtr
+ *
+ * Formats @dt in xs:date format.
+ *
+ * Returns a newly allocated string, or NULL in case of error
+ */
+static xmlChar *
+exsltDateFormatDate (const exsltDateValPtr dt)
+{
+ xmlChar buf[100], *cur = buf, *end = buf + 99;
+
+ if ((dt == NULL) || !VALID_DATETIME(dt))
+ return NULL;
+
+ exsltFormatYearMonthDay(&cur, end, dt);
+ if (dt->tz_flag || (dt->tzo != 0)) {
+ exsltFormatTimeZone(&cur, end, dt->tzo);
+ }
+ *cur = 0;
+
+ return xmlStrdup(buf);
+}
+
+/**
+ * exsltDateFormatTime:
+ * @dt: an #exsltDateValPtr
+ *
+ * Formats @dt in xs:time format.
+ *
+ * Returns a newly allocated string, or NULL in case of error
+ */
+static xmlChar *
+exsltDateFormatTime (const exsltDateValPtr dt)
+{
+ xmlChar buf[100], *cur = buf, *end = buf + 99;
+
+ if ((dt == NULL) || !VALID_TIME(dt))
+ return NULL;
+
+ exsltFormatTime(&cur, end, dt);
+ if (dt->tz_flag || (dt->tzo != 0)) {
+ exsltFormatTimeZone(&cur, end, dt->tzo);
+ }
+ *cur = 0;
+
+ return xmlStrdup(buf);
+}
+
+/**
+ * exsltDateFormat:
+ * @dt: an #exsltDateValPtr
+ *
+ * Formats @dt in the proper format.
+ * Note: xs:gmonth and xs:gday are not formatted as there are no
+ * routines that output them.
+ *
+ * Returns a newly allocated string, or NULL in case of error
+ */
+static xmlChar *
+exsltDateFormat (const exsltDateValPtr dt)
+{
+ if (dt == NULL)
+ return NULL;
+
+ switch (dt->type) {
+ case XS_DATETIME:
+ return exsltDateFormatDateTime(dt);
+ case XS_DATE:
+ return exsltDateFormatDate(dt);
+ case XS_TIME:
+ return exsltDateFormatTime(dt);
+ default:
+ break;
+ }
+
+ if (dt->type & XS_GYEAR) {
+ xmlChar buf[100], *cur = buf, *end = buf + 99;
+
+ exsltFormatGYear(&cur, end, dt->year);
+ if (dt->type == XS_GYEARMONTH) {
+ if (cur < end)
+ *cur++ = '-';
+ exsltFormat2Digits(&cur, end, dt->mon);
+ }
+
+ if (dt->tz_flag || (dt->tzo != 0)) {
+ exsltFormatTimeZone(&cur, end, dt->tzo);
+ }
+ *cur = 0;
+ return xmlStrdup(buf);
+ }
+
+ return NULL;
+}
+
+/**
+ * _exsltDateCastYMToDays:
+ * @dt: an #exsltDateValPtr
+ *
+ * Convert mon and year of @dt to total number of days. Take the
+ * number of years since (or before) 1 AD and add the number of leap
+ * years. This is a function because negative
+ * years must be handled a little differently.
+ *
+ * Returns number of days.
+ */
+static long
+_exsltDateCastYMToDays (const exsltDateValPtr dt)
+{
+ long ret;
+
+ if (dt->year <= 0)
+ ret = ((dt->year-1) * 365) +
+ (((dt->year)/4)-((dt->year)/100)+
+ ((dt->year)/400)) +
+ DAY_IN_YEAR(0, dt->mon, dt->year) - 1;
+ else
+ ret = ((dt->year-1) * 365) +
+ (((dt->year-1)/4)-((dt->year-1)/100)+
+ ((dt->year-1)/400)) +
+ DAY_IN_YEAR(0, dt->mon, dt->year);
+
+ return ret;
+}
+
+/**
+ * TIME_TO_NUMBER:
+ * @dt: an #exsltDateValPtr
+ *
+ * Calculates the number of seconds in the time portion of @dt.
+ *
+ * Returns seconds.
+ */
+#define TIME_TO_NUMBER(dt) \
+ ((double)((dt->hour * SECS_PER_HOUR) + \
+ (dt->min * SECS_PER_MIN)) + dt->sec)
+
+/**
+ * _exsltDateTruncateDate:
+ * @dt: an #exsltDateValPtr
+ * @type: dateTime type to set to
+ *
+ * Set @dt to truncated @type.
+ *
+ * Returns 0 success, non-zero otherwise.
+ */
+static int
+_exsltDateTruncateDate (exsltDateValPtr dt, exsltDateType type)
+{
+ if (dt == NULL)
+ return 1;
+
+ if ((type & XS_TIME) != XS_TIME) {
+ dt->hour = 0;
+ dt->min = 0;
+ dt->sec = 0.0;
+ }
+
+ if ((type & XS_GDAY) != XS_GDAY)
+ dt->day = 1;
+
+ if ((type & XS_GMONTH) != XS_GMONTH)
+ dt->mon = 1;
+
+ if ((type & XS_GYEAR) != XS_GYEAR)
+ dt->year = 0;
+
+ dt->type = type;
+
+ return 0;
+}
+
+/**
+ * _exsltDayInWeek:
+ * @yday: year day (1-366)
+ * @yr: year
+ *
+ * Determine the day-in-week from @yday and @yr. 0001-01-01 was
+ * a Monday so all other days are calculated from there. Take the
+ * number of years since (or before) add the number of leap years and
+ * the day-in-year and mod by 7. This is a function because negative
+ * years must be handled a little differently.
+ *
+ * Returns day in week (Sunday = 0).
+ */
+static long
+_exsltDateDayInWeek(long yday, long yr)
+{
+ long ret;
+
+ if (yr <= 0) {
+ /* Compute modulus twice to avoid integer overflow */
+ ret = ((yr%7-2 + ((yr/4)-(yr/100)+(yr/400)) + yday) % 7);
+ if (ret < 0)
+ ret += 7;
+ } else
+ ret = (((yr%7-1) + (((yr-1)/4)-((yr-1)/100)+((yr-1)/400)) + yday) % 7);
+
+ return ret;
+}
+
+/**
+ * _exsltDateAdd:
+ * @dt: an #exsltDateValPtr
+ * @dur: an #exsltDateDurValPtr
+ *
+ * Compute a new date/time from @dt and @dur. This function assumes @dt
+ * is either #XS_DATETIME, #XS_DATE, #XS_GYEARMONTH, or #XS_GYEAR.
+ *
+ * Returns date/time pointer or NULL.
+ */
+static exsltDateValPtr
+_exsltDateAdd (exsltDateValPtr dt, exsltDateDurValPtr dur)
+{
+ exsltDateValPtr ret;
+ long carry, temp;
+ double sum;
+
+ if ((dt == NULL) || (dur == NULL))
+ return NULL;
+
+ ret = exsltDateCreateDate(dt->type);
+ if (ret == NULL)
+ return NULL;
+
+ /*
+ * Note that temporary values may need more bits than the values in
+ * bit field.
+ */
+
+ /* month */
+ temp = dt->mon + dur->mon % 12;
+ carry = dur->mon / 12;
+ if (temp < 1) {
+ temp += 12;
+ carry -= 1;
+ }
+ else if (temp > 12) {
+ temp -= 12;
+ carry += 1;
+ }
+ ret->mon = temp;
+
+ /*
+ * year (may be modified later)
+ *
+ * Add epochs from dur->day now to avoid overflow later and to speed up
+ * pathological cases.
+ */
+ carry += (dur->day / DAYS_PER_EPOCH) * YEARS_PER_EPOCH;
+ if ((carry > 0 && dt->year > YEAR_MAX - carry) ||
+ (carry < 0 && dt->year < YEAR_MIN - carry)) {
+ /* Overflow */
+ exsltDateFreeDate(ret);
+ return NULL;
+ }
+ ret->year = dt->year + carry;
+
+ /* time zone */
+ ret->tzo = dt->tzo;
+ ret->tz_flag = dt->tz_flag;
+
+ /* seconds */
+ sum = dt->sec + dur->sec;
+ ret->sec = fmod(sum, 60.0);
+ carry = (long)(sum / 60.0);
+
+ /* minute */
+ temp = dt->min + carry % 60;
+ carry = carry / 60;
+ if (temp >= 60) {
+ temp -= 60;
+ carry += 1;
+ }
+ ret->min = temp;
+
+ /* hours */
+ temp = dt->hour + carry % 24;
+ carry = carry / 24;
+ if (temp >= 24) {
+ temp -= 24;
+ carry += 1;
+ }
+ ret->hour = temp;
+
+ /* days */
+ if (dt->day > MAX_DAYINMONTH(ret->year, ret->mon))
+ temp = MAX_DAYINMONTH(ret->year, ret->mon);
+ else if (dt->day < 1)
+ temp = 1;
+ else
+ temp = dt->day;
+
+ temp += dur->day % DAYS_PER_EPOCH + carry;
+
+ while (1) {
+ if (temp < 1) {
+ if (ret->mon > 1) {
+ ret->mon -= 1;
+ }
+ else {
+ if (ret->year == YEAR_MIN) {
+ exsltDateFreeDate(ret);
+ return NULL;
+ }
+ ret->mon = 12;
+ ret->year -= 1;
+ }
+ temp += MAX_DAYINMONTH(ret->year, ret->mon);
+ } else if (temp > (long)MAX_DAYINMONTH(ret->year, ret->mon)) {
+ temp -= MAX_DAYINMONTH(ret->year, ret->mon);
+ if (ret->mon < 12) {
+ ret->mon += 1;
+ }
+ else {
+ if (ret->year == YEAR_MAX) {
+ exsltDateFreeDate(ret);
+ return NULL;
+ }
+ ret->mon = 1;
+ ret->year += 1;
+ }
+ } else
+ break;
+ }
+
+ ret->day = temp;
+
+ /*
+ * adjust the date/time type to the date values
+ */
+ if (ret->type != XS_DATETIME) {
+ if ((ret->hour) || (ret->min) || (ret->sec))
+ ret->type = XS_DATETIME;
+ else if (ret->type != XS_DATE) {
+ if (ret->day != 1)
+ ret->type = XS_DATE;
+ else if ((ret->type != XS_GYEARMONTH) && (ret->mon != 1))
+ ret->type = XS_GYEARMONTH;
+ }
+ }
+
+ return ret;
+}
+
+/**
+ * _exsltDateDifference:
+ * @x: an #exsltDateValPtr
+ * @y: an #exsltDateValPtr
+ * @flag: force difference in days
+ *
+ * Calculate the difference between @x and @y as a duration
+ * (i.e. y - x). If the @flag is set then even if the least specific
+ * format of @x or @y is xs:gYear or xs:gYearMonth.
+ *
+ * Returns a duration pointer or NULL.
+ */
+static exsltDateDurValPtr
+_exsltDateDifference (exsltDateValPtr x, exsltDateValPtr y, int flag)
+{
+ exsltDateDurValPtr ret;
+
+ if ((x == NULL) || (y == NULL))
+ return NULL;
+
+ if (((x->type < XS_GYEAR) || (x->type > XS_DATETIME)) ||
+ ((y->type < XS_GYEAR) || (y->type > XS_DATETIME)))
+ return NULL;
+
+ /*
+ * the operand with the most specific format must be converted to
+ * the same type as the operand with the least specific format.
+ */
+ if (x->type != y->type) {
+ if (x->type < y->type) {
+ _exsltDateTruncateDate(y, x->type);
+ } else {
+ _exsltDateTruncateDate(x, y->type);
+ }
+ }
+
+ ret = exsltDateCreateDuration();
+ if (ret == NULL)
+ return NULL;
+
+ if (((x->type == XS_GYEAR) || (x->type == XS_GYEARMONTH)) && (!flag)) {
+ /* compute the difference in months */
+ if ((x->year >= LONG_MAX / 24) || (x->year <= LONG_MIN / 24) ||
+ (y->year >= LONG_MAX / 24) || (y->year <= LONG_MIN / 24)) {
+ /* Possible overflow. */
+ exsltDateFreeDuration(ret);
+ return NULL;
+ }
+ ret->mon = (y->year - x->year) * 12 + (y->mon - x->mon);
+ } else {
+ long carry;
+
+ if ((x->year > LONG_MAX / 731) || (x->year < LONG_MIN / 731) ||
+ (y->year > LONG_MAX / 731) || (y->year < LONG_MIN / 731)) {
+ /* Possible overflow. */
+ exsltDateFreeDuration(ret);
+ return NULL;
+ }
+
+ ret->sec = TIME_TO_NUMBER(y) - TIME_TO_NUMBER(x);
+ ret->sec += (x->tzo - y->tzo) * SECS_PER_MIN;
+ carry = (long)floor(ret->sec / SECS_PER_DAY);
+ ret->sec = ret->sec - carry * SECS_PER_DAY;
+
+ ret->day = _exsltDateCastYMToDays(y) - _exsltDateCastYMToDays(x);
+ ret->day += y->day - x->day;
+ ret->day += carry;
+ }
+
+ return ret;
+}
+
+/**
+ * _exsltDateAddDurCalc
+ * @ret: an exsltDateDurValPtr for the return value:
+ * @x: an exsltDateDurValPtr for the first operand
+ * @y: an exsltDateDurValPtr for the second operand
+ *
+ * Add two durations, catering for possible negative values.
+ * The sum is placed in @ret.
+ *
+ * Returns 1 for success, 0 if error detected.
+ */
+static int
+_exsltDateAddDurCalc (exsltDateDurValPtr ret, exsltDateDurValPtr x,
+ exsltDateDurValPtr y)
+{
+ /* months */
+ if ((x->mon > 0 && y->mon > LONG_MAX - x->mon) ||
+ (x->mon < 0 && y->mon <= LONG_MIN - x->mon)) {
+ /* Overflow */
+ return 0;
+ }
+ ret->mon = x->mon + y->mon;
+
+ /* days */
+ if ((x->day > 0 && y->day > LONG_MAX - x->day) ||
+ (x->day < 0 && y->day <= LONG_MIN - x->day)) {
+ /* Overflow */
+ return 0;
+ }
+ ret->day = x->day + y->day;
+
+ /* seconds */
+ ret->sec = x->sec + y->sec;
+ if (ret->sec >= SECS_PER_DAY) {
+ if (ret->day == LONG_MAX) {
+ /* Overflow */
+ return 0;
+ }
+ ret->sec -= SECS_PER_DAY;
+ ret->day += 1;
+ }
+
+ /*
+ * are the results indeterminate? i.e. how do you subtract days from
+ * months or years?
+ */
+ if (ret->day >= 0) {
+ if (((ret->day > 0) || (ret->sec > 0)) && (ret->mon < 0))
+ return 0;
+ }
+ else {
+ if (ret->mon > 0)
+ return 0;
+ }
+ return 1;
+}
+
+/**
+ * _exsltDateAddDuration:
+ * @x: an #exsltDateDurValPtr
+ * @y: an #exsltDateDurValPtr
+ *
+ * Compute a new duration from @x and @y.
+ *
+ * Returns a duration pointer or NULL.
+ */
+static exsltDateDurValPtr
+_exsltDateAddDuration (exsltDateDurValPtr x, exsltDateDurValPtr y)
+{
+ exsltDateDurValPtr ret;
+
+ if ((x == NULL) || (y == NULL))
+ return NULL;
+
+ ret = exsltDateCreateDuration();
+ if (ret == NULL)
+ return NULL;
+
+ if (_exsltDateAddDurCalc(ret, x, y))
+ return ret;
+
+ exsltDateFreeDuration(ret);
+ return NULL;
+}
+
+/****************************************************************
+ * *
+ * EXSLT - Dates and Times functions *
+ * *
+ ****************************************************************/
+
+/**
+ * exsltDateDateTime:
+ *
+ * Implements the EXSLT - Dates and Times date-time() function:
+ * string date:date-time()
+ *
+ * Returns the current date and time as a date/time string.
+ */
+static xmlChar *
+exsltDateDateTime (void)
+{
+ xmlChar *ret = NULL;
+ exsltDateValPtr cur;
+
+ cur = exsltDateCurrent();
+ if (cur != NULL) {
+ ret = exsltDateFormatDateTime(cur);
+ exsltDateFreeDate(cur);
+ }
+
+ return ret;
+}
+
+/**
+ * exsltDateDate:
+ * @dateTime: a date/time string
+ *
+ * Implements the EXSLT - Dates and Times date() function:
+ * string date:date (string?)
+ *
+ * Returns the date specified in the date/time string given as the
+ * argument. If no argument is given, then the current local
+ * date/time, as returned by date:date-time is used as a default
+ * argument.
+ * The date/time string specified as an argument must be a string in
+ * the format defined as the lexical representation of either
+ * xs:dateTime or xs:date. If the argument is not in either of these
+ * formats, returns NULL.
+ */
+static xmlChar *
+exsltDateDate (const xmlChar *dateTime)
+{
+ exsltDateValPtr dt = NULL;
+ xmlChar *ret = NULL;
+
+ if (dateTime == NULL) {
+ dt = exsltDateCurrent();
+ if (dt == NULL)
+ return NULL;
+ } else {
+ dt = exsltDateParse(dateTime);
+ if (dt == NULL)
+ return NULL;
+ if ((dt->type != XS_DATETIME) && (dt->type != XS_DATE)) {
+ exsltDateFreeDate(dt);
+ return NULL;
+ }
+ }
+
+ ret = exsltDateFormatDate(dt);
+ exsltDateFreeDate(dt);
+
+ return ret;
+}
+
+/**
+ * exsltDateTime:
+ * @dateTime: a date/time string
+ *
+ * Implements the EXSLT - Dates and Times time() function:
+ * string date:time (string?)
+ *
+ * Returns the time specified in the date/time string given as the
+ * argument. If no argument is given, then the current local
+ * date/time, as returned by date:date-time is used as a default
+ * argument.
+ * The date/time string specified as an argument must be a string in
+ * the format defined as the lexical representation of either
+ * xs:dateTime or xs:time. If the argument is not in either of these
+ * formats, returns NULL.
+ */
+static xmlChar *
+exsltDateTime (const xmlChar *dateTime)
+{
+ exsltDateValPtr dt = NULL;
+ xmlChar *ret = NULL;
+
+ if (dateTime == NULL) {
+ dt = exsltDateCurrent();
+ if (dt == NULL)
+ return NULL;
+ } else {
+ dt = exsltDateParse(dateTime);
+ if (dt == NULL)
+ return NULL;
+ if ((dt->type != XS_DATETIME) && (dt->type != XS_TIME)) {
+ exsltDateFreeDate(dt);
+ return NULL;
+ }
+ }
+
+ ret = exsltDateFormatTime(dt);
+ exsltDateFreeDate(dt);
+
+ return ret;
+}
+
+/**
+ * exsltDateYear:
+ * @dateTime: a date/time string
+ *
+ * Implements the EXSLT - Dates and Times year() function
+ * number date:year (string?)
+ * Returns the year of a date as a number. If no argument is given,
+ * then the current local date/time, as returned by date:date-time is
+ * used as a default argument.
+ * The date/time string specified as the first argument must be a
+ * right-truncated string in the format defined as the lexical
+ * representation of xs:dateTime in one of the formats defined in [XML
+ * Schema Part 2: Datatypes]. The permitted formats are as follows:
+ * - xs:dateTime (CCYY-MM-DDThh:mm:ss)
+ * - xs:date (CCYY-MM-DD)
+ * - xs:gYearMonth (CCYY-MM)
+ * - xs:gYear (CCYY)
+ * If the date/time string is not in one of these formats, then NaN is
+ * returned.
+ */
+static double
+exsltDateYear (const xmlChar *dateTime)
+{
+ exsltDateValPtr dt;
+ long year;
+ double ret;
+
+ if (dateTime == NULL) {
+ dt = exsltDateCurrent();
+ if (dt == NULL)
+ return NAN;
+ } else {
+ dt = exsltDateParse(dateTime);
+ if (dt == NULL)
+ return NAN;
+ if ((dt->type != XS_DATETIME) && (dt->type != XS_DATE) &&
+ (dt->type != XS_GYEARMONTH) && (dt->type != XS_GYEAR)) {
+ exsltDateFreeDate(dt);
+ return NAN;
+ }
+ }
+
+ year = dt->year;
+ if (year <= 0) year -= 1; /* Adjust for missing year 0. */
+ ret = (double) year;
+ exsltDateFreeDate(dt);
+
+ return ret;
+}
+
+/**
+ * exsltDateLeapYear:
+ * @dateTime: a date/time string
+ *
+ * Implements the EXSLT - Dates and Times leap-year() function:
+ * boolean date:leap-yea (string?)
+ * Returns true if the year given in a date is a leap year. If no
+ * argument is given, then the current local date/time, as returned by
+ * date:date-time is used as a default argument.
+ * The date/time string specified as the first argument must be a
+ * right-truncated string in the format defined as the lexical
+ * representation of xs:dateTime in one of the formats defined in [XML
+ * Schema Part 2: Datatypes]. The permitted formats are as follows:
+ * - xs:dateTime (CCYY-MM-DDThh:mm:ss)
+ * - xs:date (CCYY-MM-DD)
+ * - xs:gYearMonth (CCYY-MM)
+ * - xs:gYear (CCYY)
+ * If the date/time string is not in one of these formats, then NaN is
+ * returned.
+ */
+static xmlXPathObjectPtr
+exsltDateLeapYear (const xmlChar *dateTime)
+{
+ exsltDateValPtr dt = NULL;
+ xmlXPathObjectPtr ret;
+
+ if (dateTime == NULL) {
+ dt = exsltDateCurrent();
+ } else {
+ dt = exsltDateParse(dateTime);
+ if ((dt != NULL) &&
+ (dt->type != XS_DATETIME) && (dt->type != XS_DATE) &&
+ (dt->type != XS_GYEARMONTH) && (dt->type != XS_GYEAR)) {
+ exsltDateFreeDate(dt);
+ dt = NULL;
+ }
+ }
+
+ if (dt == NULL) {
+ ret = xmlXPathNewFloat(NAN);
+ }
+ else {
+ ret = xmlXPathNewBoolean(IS_LEAP(dt->year));
+ exsltDateFreeDate(dt);
+ }
+
+ return ret;
+}
+
+/**
+ * exsltDateMonthInYear:
+ * @dateTime: a date/time string
+ *
+ * Implements the EXSLT - Dates and Times month-in-year() function:
+ * number date:month-in-year (string?)
+ * Returns the month of a date as a number. If no argument is given,
+ * then the current local date/time, as returned by date:date-time is
+ * used the default argument.
+ * The date/time string specified as the argument is a left or
+ * right-truncated string in the format defined as the lexical
+ * representation of xs:dateTime in one of the formats defined in [XML
+ * Schema Part 2: Datatypes]. The permitted formats are as follows:
+ * - xs:dateTime (CCYY-MM-DDThh:mm:ss)
+ * - xs:date (CCYY-MM-DD)
+ * - xs:gYearMonth (CCYY-MM)
+ * - xs:gMonth (--MM--)
+ * - xs:gMonthDay (--MM-DD)
+ * If the date/time string is not in one of these formats, then NaN is
+ * returned.
+ */
+static double
+exsltDateMonthInYear (const xmlChar *dateTime)
+{
+ exsltDateValPtr dt;
+ double ret;
+
+ if (dateTime == NULL) {
+ dt = exsltDateCurrent();
+ if (dt == NULL)
+ return NAN;
+ } else {
+ dt = exsltDateParse(dateTime);
+ if (dt == NULL)
+ return NAN;
+ if ((dt->type != XS_DATETIME) && (dt->type != XS_DATE) &&
+ (dt->type != XS_GYEARMONTH) && (dt->type != XS_GMONTH) &&
+ (dt->type != XS_GMONTHDAY)) {
+ exsltDateFreeDate(dt);
+ return NAN;
+ }
+ }
+
+ ret = (double) dt->mon;
+ exsltDateFreeDate(dt);
+
+ return ret;
+}
+
+/**
+ * exsltDateMonthName:
+ * @dateTime: a date/time string
+ *
+ * Implements the EXSLT - Dates and Time month-name() function
+ * string date:month-name (string?)
+ * Returns the full name of the month of a date. If no argument is
+ * given, then the current local date/time, as returned by
+ * date:date-time is used the default argument.
+ * The date/time string specified as the argument is a left or
+ * right-truncated string in the format defined as the lexical
+ * representation of xs:dateTime in one of the formats defined in [XML
+ * Schema Part 2: Datatypes]. The permitted formats are as follows:
+ * - xs:dateTime (CCYY-MM-DDThh:mm:ss)
+ * - xs:date (CCYY-MM-DD)
+ * - xs:gYearMonth (CCYY-MM)
+ * - xs:gMonth (--MM--)
+ * If the date/time string is not in one of these formats, then an
+ * empty string ('') is returned.
+ * The result is an English month name: one of 'January', 'February',
+ * 'March', 'April', 'May', 'June', 'July', 'August', 'September',
+ * 'October', 'November' or 'December'.
+ */
+static const xmlChar *
+exsltDateMonthName (const xmlChar *dateTime)
+{
+ static const xmlChar monthNames[13][10] = {
+ { 0 },
+ { 'J', 'a', 'n', 'u', 'a', 'r', 'y', 0 },
+ { 'F', 'e', 'b', 'r', 'u', 'a', 'r', 'y', 0 },
+ { 'M', 'a', 'r', 'c', 'h', 0 },
+ { 'A', 'p', 'r', 'i', 'l', 0 },
+ { 'M', 'a', 'y', 0 },
+ { 'J', 'u', 'n', 'e', 0 },
+ { 'J', 'u', 'l', 'y', 0 },
+ { 'A', 'u', 'g', 'u', 's', 't', 0 },
+ { 'S', 'e', 'p', 't', 'e', 'm', 'b', 'e', 'r', 0 },
+ { 'O', 'c', 't', 'o', 'b', 'e', 'r', 0 },
+ { 'N', 'o', 'v', 'e', 'm', 'b', 'e', 'r', 0 },
+ { 'D', 'e', 'c', 'e', 'm', 'b', 'e', 'r', 0 }
+ };
+ double month;
+ int index = 0;
+ month = exsltDateMonthInYear(dateTime);
+ if (!xmlXPathIsNaN(month) && (month >= 1.0) && (month <= 12.0))
+ index = (int) month;
+ return monthNames[index];
+}
+
+/**
+ * exsltDateMonthAbbreviation:
+ * @dateTime: a date/time string
+ *
+ * Implements the EXSLT - Dates and Time month-abbreviation() function
+ * string date:month-abbreviation (string?)
+ * Returns the abbreviation of the month of a date. If no argument is
+ * given, then the current local date/time, as returned by
+ * date:date-time is used the default argument.
+ * The date/time string specified as the argument is a left or
+ * right-truncated string in the format defined as the lexical
+ * representation of xs:dateTime in one of the formats defined in [XML
+ * Schema Part 2: Datatypes]. The permitted formats are as follows:
+ * - xs:dateTime (CCYY-MM-DDThh:mm:ss)
+ * - xs:date (CCYY-MM-DD)
+ * - xs:gYearMonth (CCYY-MM)
+ * - xs:gMonth (--MM--)
+ * If the date/time string is not in one of these formats, then an
+ * empty string ('') is returned.
+ * The result is an English month abbreviation: one of 'Jan', 'Feb',
+ * 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov' or
+ * 'Dec'.
+ */
+static const xmlChar *
+exsltDateMonthAbbreviation (const xmlChar *dateTime)
+{
+ static const xmlChar monthAbbreviations[13][4] = {
+ { 0 },
+ { 'J', 'a', 'n', 0 },
+ { 'F', 'e', 'b', 0 },
+ { 'M', 'a', 'r', 0 },
+ { 'A', 'p', 'r', 0 },
+ { 'M', 'a', 'y', 0 },
+ { 'J', 'u', 'n', 0 },
+ { 'J', 'u', 'l', 0 },
+ { 'A', 'u', 'g', 0 },
+ { 'S', 'e', 'p', 0 },
+ { 'O', 'c', 't', 0 },
+ { 'N', 'o', 'v', 0 },
+ { 'D', 'e', 'c', 0 }
+ };
+ double month;
+ int index = 0;
+ month = exsltDateMonthInYear(dateTime);
+ if (!xmlXPathIsNaN(month) && (month >= 1.0) && (month <= 12.0))
+ index = (int) month;
+ return monthAbbreviations[index];
+}
+
+/**
+ * exsltDateWeekInYear:
+ * @dateTime: a date/time string
+ *
+ * Implements the EXSLT - Dates and Times week-in-year() function
+ * number date:week-in-year (string?)
+ * Returns the week of the year as a number. If no argument is given,
+ * then the current local date/time, as returned by date:date-time is
+ * used as the default argument. For the purposes of numbering,
+ * counting follows ISO 8601: week 1 in a year is the week containing
+ * the first Thursday of the year, with new weeks beginning on a
+ * Monday.
+ * The date/time string specified as the argument is a right-truncated
+ * string in the format defined as the lexical representation of
+ * xs:dateTime in one of the formats defined in [XML Schema Part 2:
+ * Datatypes]. The permitted formats are as follows:
+ * - xs:dateTime (CCYY-MM-DDThh:mm:ss)
+ * - xs:date (CCYY-MM-DD)
+ * If the date/time string is not in one of these formats, then NaN is
+ * returned.
+ */
+static double
+exsltDateWeekInYear (const xmlChar *dateTime)
+{
+ exsltDateValPtr dt;
+ long diy, diw, year, ret;
+
+ if (dateTime == NULL) {
+ dt = exsltDateCurrent();
+ if (dt == NULL)
+ return NAN;
+ } else {
+ dt = exsltDateParse(dateTime);
+ if (dt == NULL)
+ return NAN;
+ if ((dt->type != XS_DATETIME) && (dt->type != XS_DATE)) {
+ exsltDateFreeDate(dt);
+ return NAN;
+ }
+ }
+
+ diy = DAY_IN_YEAR(dt->day, dt->mon, dt->year);
+
+ /*
+ * Determine day-in-week (0=Sun, 1=Mon, etc.) then adjust so Monday
+ * is the first day-in-week
+ */
+ diw = (_exsltDateDayInWeek(diy, dt->year) + 6) % 7;
+
+ /* ISO 8601 adjustment, 3 is Thu */
+ diy += (3 - diw);
+ if(diy < 1) {
+ year = dt->year - 1;
+ if(year == 0) year--;
+ diy = DAY_IN_YEAR(31, 12, year) + diy;
+ } else if (diy > (long)DAY_IN_YEAR(31, 12, dt->year)) {
+ diy -= DAY_IN_YEAR(31, 12, dt->year);
+ }
+
+ ret = ((diy - 1) / 7) + 1;
+
+ exsltDateFreeDate(dt);
+
+ return (double) ret;
+}
+
+/**
+ * exsltDateWeekInMonth:
+ * @dateTime: a date/time string
+ *
+ * Implements the EXSLT - Dates and Times week-in-month() function
+ * number date:week-in-month (string?)
+ * The date:week-in-month function returns the week in a month of a
+ * date as a number. If no argument is given, then the current local
+ * date/time, as returned by date:date-time is used the default
+ * argument. For the purposes of numbering, the first day of the month
+ * is in week 1 and new weeks begin on a Monday (so the first and last
+ * weeks in a month will often have less than 7 days in them).
+ * The date/time string specified as the argument is a right-truncated
+ * string in the format defined as the lexical representation of
+ * xs:dateTime in one of the formats defined in [XML Schema Part 2:
+ * Datatypes]. The permitted formats are as follows:
+ * - xs:dateTime (CCYY-MM-DDThh:mm:ss)
+ * - xs:date (CCYY-MM-DD)
+ * If the date/time string is not in one of these formats, then NaN is
+ * returned.
+ */
+static double
+exsltDateWeekInMonth (const xmlChar *dateTime)
+{
+ exsltDateValPtr dt;
+ long fdiy, fdiw, ret;
+
+ if (dateTime == NULL) {
+ dt = exsltDateCurrent();
+ if (dt == NULL)
+ return NAN;
+ } else {
+ dt = exsltDateParse(dateTime);
+ if (dt == NULL)
+ return NAN;
+ if ((dt->type != XS_DATETIME) && (dt->type != XS_DATE)) {
+ exsltDateFreeDate(dt);
+ return NAN;
+ }
+ }
+
+ fdiy = DAY_IN_YEAR(1, dt->mon, dt->year);
+ /*
+ * Determine day-in-week (0=Sun, 1=Mon, etc.) then adjust so Monday
+ * is the first day-in-week
+ */
+ fdiw = (_exsltDateDayInWeek(fdiy, dt->year) + 6) % 7;
+
+ ret = ((dt->day + fdiw - 1) / 7) + 1;
+
+ exsltDateFreeDate(dt);
+
+ return (double) ret;
+}
+
+/**
+ * exsltDateDayInYear:
+ * @dateTime: a date/time string
+ *
+ * Implements the EXSLT - Dates and Times day-in-year() function
+ * number date:day-in-year (string?)
+ * Returns the day of a date in a year as a number. If no argument is
+ * given, then the current local date/time, as returned by
+ * date:date-time is used the default argument.
+ * The date/time string specified as the argument is a right-truncated
+ * string in the format defined as the lexical representation of
+ * xs:dateTime in one of the formats defined in [XML Schema Part 2:
+ * Datatypes]. The permitted formats are as follows:
+ * - xs:dateTime (CCYY-MM-DDThh:mm:ss)
+ * - xs:date (CCYY-MM-DD)
+ * If the date/time string is not in one of these formats, then NaN is
+ * returned.
+ */
+static double
+exsltDateDayInYear (const xmlChar *dateTime)
+{
+ exsltDateValPtr dt;
+ long ret;
+
+ if (dateTime == NULL) {
+ dt = exsltDateCurrent();
+ if (dt == NULL)
+ return NAN;
+ } else {
+ dt = exsltDateParse(dateTime);
+ if (dt == NULL)
+ return NAN;
+ if ((dt->type != XS_DATETIME) && (dt->type != XS_DATE)) {
+ exsltDateFreeDate(dt);
+ return NAN;
+ }
+ }
+
+ ret = DAY_IN_YEAR(dt->day, dt->mon, dt->year);
+
+ exsltDateFreeDate(dt);
+
+ return (double) ret;
+}
+
+/**
+ * exsltDateDayInMonth:
+ * @dateTime: a date/time string
+ *
+ * Implements the EXSLT - Dates and Times day-in-month() function:
+ * number date:day-in-month (string?)
+ * Returns the day of a date as a number. If no argument is given,
+ * then the current local date/time, as returned by date:date-time is
+ * used the default argument.
+ * The date/time string specified as the argument is a left or
+ * right-truncated string in the format defined as the lexical
+ * representation of xs:dateTime in one of the formats defined in [XML
+ * Schema Part 2: Datatypes]. The permitted formats are as follows:
+ * - xs:dateTime (CCYY-MM-DDThh:mm:ss)
+ * - xs:date (CCYY-MM-DD)
+ * - xs:gMonthDay (--MM-DD)
+ * - xs:gDay (---DD)
+ * If the date/time string is not in one of these formats, then NaN is
+ * returned.
+ */
+static double
+exsltDateDayInMonth (const xmlChar *dateTime)
+{
+ exsltDateValPtr dt;
+ double ret;
+
+ if (dateTime == NULL) {
+ dt = exsltDateCurrent();
+ if (dt == NULL)
+ return NAN;
+ } else {
+ dt = exsltDateParse(dateTime);
+ if (dt == NULL)
+ return NAN;
+ if ((dt->type != XS_DATETIME) && (dt->type != XS_DATE) &&
+ (dt->type != XS_GMONTHDAY) && (dt->type != XS_GDAY)) {
+ exsltDateFreeDate(dt);
+ return NAN;
+ }
+ }
+
+ ret = (double) dt->day;
+ exsltDateFreeDate(dt);
+
+ return ret;
+}
+
+/**
+ * exsltDateDayOfWeekInMonth:
+ * @dateTime: a date/time string
+ *
+ * Implements the EXSLT - Dates and Times day-of-week-in-month() function:
+ * number date:day-of-week-in-month (string?)
+ * Returns the day-of-the-week in a month of a date as a number
+ * (e.g. 3 for the 3rd Tuesday in May). If no argument is
+ * given, then the current local date/time, as returned by
+ * date:date-time is used the default argument.
+ * The date/time string specified as the argument is a right-truncated
+ * string in the format defined as the lexical representation of
+ * xs:dateTime in one of the formats defined in [XML Schema Part 2:
+ * Datatypes]. The permitted formats are as follows:
+ * - xs:dateTime (CCYY-MM-DDThh:mm:ss)
+ * - xs:date (CCYY-MM-DD)
+ * If the date/time string is not in one of these formats, then NaN is
+ * returned.
+ */
+static double
+exsltDateDayOfWeekInMonth (const xmlChar *dateTime)
+{
+ exsltDateValPtr dt;
+ long ret;
+
+ if (dateTime == NULL) {
+ dt = exsltDateCurrent();
+ if (dt == NULL)
+ return NAN;
+ } else {
+ dt = exsltDateParse(dateTime);
+ if (dt == NULL)
+ return NAN;
+ if ((dt->type != XS_DATETIME) && (dt->type != XS_DATE)) {
+ exsltDateFreeDate(dt);
+ return NAN;
+ }
+ }
+
+ ret = ((dt->day -1) / 7) + 1;
+
+ exsltDateFreeDate(dt);
+
+ return (double) ret;
+}
+
+/**
+ * exsltDateDayInWeek:
+ * @dateTime: a date/time string
+ *
+ * Implements the EXSLT - Dates and Times day-in-week() function:
+ * number date:day-in-week (string?)
+ * Returns the day of the week given in a date as a number. If no
+ * argument is given, then the current local date/time, as returned by
+ * date:date-time is used the default argument.
+ * The date/time string specified as the argument is a left or
+ * right-truncated string in the format defined as the lexical
+ * representation of xs:dateTime in one of the formats defined in [XML
+ * Schema Part 2: Datatypes]. The permitted formats are as follows:
+ * - xs:dateTime (CCYY-MM-DDThh:mm:ss)
+ * - xs:date (CCYY-MM-DD)
+ * If the date/time string is not in one of these formats, then NaN is
+ * returned.
+ * The numbering of days of the week starts at 1 for Sunday, 2 for
+ * Monday and so on up to 7 for Saturday.
+ */
+static double
+exsltDateDayInWeek (const xmlChar *dateTime)
+{
+ exsltDateValPtr dt;
+ long diy, ret;
+
+ if (dateTime == NULL) {
+ dt = exsltDateCurrent();
+ if (dt == NULL)
+ return NAN;
+ } else {
+ dt = exsltDateParse(dateTime);
+ if (dt == NULL)
+ return NAN;
+ if ((dt->type != XS_DATETIME) && (dt->type != XS_DATE)) {
+ exsltDateFreeDate(dt);
+ return NAN;
+ }
+ }
+
+ diy = DAY_IN_YEAR(dt->day, dt->mon, dt->year);
+
+ ret = _exsltDateDayInWeek(diy, dt->year) + 1;
+
+ exsltDateFreeDate(dt);
+
+ return (double) ret;
+}
+
+/**
+ * exsltDateDayName:
+ * @dateTime: a date/time string
+ *
+ * Implements the EXSLT - Dates and Time day-name() function
+ * string date:day-name (string?)
+ * Returns the full name of the day of the week of a date. If no
+ * argument is given, then the current local date/time, as returned by
+ * date:date-time is used the default argument.
+ * The date/time string specified as the argument is a left or
+ * right-truncated string in the format defined as the lexical
+ * representation of xs:dateTime in one of the formats defined in [XML
+ * Schema Part 2: Datatypes]. The permitted formats are as follows:
+ * - xs:dateTime (CCYY-MM-DDThh:mm:ss)
+ * - xs:date (CCYY-MM-DD)
+ * If the date/time string is not in one of these formats, then an
+ * empty string ('') is returned.
+ * The result is an English day name: one of 'Sunday', 'Monday',
+ * 'Tuesday', 'Wednesday', 'Thursday' or 'Friday'.
+ */
+static const xmlChar *
+exsltDateDayName (const xmlChar *dateTime)
+{
+ static const xmlChar dayNames[8][10] = {
+ { 0 },
+ { 'S', 'u', 'n', 'd', 'a', 'y', 0 },
+ { 'M', 'o', 'n', 'd', 'a', 'y', 0 },
+ { 'T', 'u', 'e', 's', 'd', 'a', 'y', 0 },
+ { 'W', 'e', 'd', 'n', 'e', 's', 'd', 'a', 'y', 0 },
+ { 'T', 'h', 'u', 'r', 's', 'd', 'a', 'y', 0 },
+ { 'F', 'r', 'i', 'd', 'a', 'y', 0 },
+ { 'S', 'a', 't', 'u', 'r', 'd', 'a', 'y', 0 }
+ };
+ double day;
+ int index = 0;
+ day = exsltDateDayInWeek(dateTime);
+ if(!xmlXPathIsNaN(day) && (day >= 1.0) && (day <= 7.0))
+ index = (int) day;
+ return dayNames[index];
+}
+
+/**
+ * exsltDateDayAbbreviation:
+ * @dateTime: a date/time string
+ *
+ * Implements the EXSLT - Dates and Time day-abbreviation() function
+ * string date:day-abbreviation (string?)
+ * Returns the abbreviation of the day of the week of a date. If no
+ * argument is given, then the current local date/time, as returned by
+ * date:date-time is used the default argument.
+ * The date/time string specified as the argument is a left or
+ * right-truncated string in the format defined as the lexical
+ * representation of xs:dateTime in one of the formats defined in [XML
+ * Schema Part 2: Datatypes]. The permitted formats are as follows:
+ * - xs:dateTime (CCYY-MM-DDThh:mm:ss)
+ * - xs:date (CCYY-MM-DD)
+ * If the date/time string is not in one of these formats, then an
+ * empty string ('') is returned.
+ * The result is a three-letter English day abbreviation: one of
+ * 'Sun', 'Mon', 'Tue', 'Wed', 'Thu' or 'Fri'.
+ */
+static const xmlChar *
+exsltDateDayAbbreviation (const xmlChar *dateTime)
+{
+ static const xmlChar dayAbbreviations[8][4] = {
+ { 0 },
+ { 'S', 'u', 'n', 0 },
+ { 'M', 'o', 'n', 0 },
+ { 'T', 'u', 'e', 0 },
+ { 'W', 'e', 'd', 0 },
+ { 'T', 'h', 'u', 0 },
+ { 'F', 'r', 'i', 0 },
+ { 'S', 'a', 't', 0 }
+ };
+ double day;
+ int index = 0;
+ day = exsltDateDayInWeek(dateTime);
+ if(!xmlXPathIsNaN(day) && (day >= 1.0) && (day <= 7.0))
+ index = (int) day;
+ return dayAbbreviations[index];
+}
+
+/**
+ * exsltDateHourInDay:
+ * @dateTime: a date/time string
+ *
+ * Implements the EXSLT - Dates and Times day-in-month() function:
+ * number date:day-in-month (string?)
+ * Returns the hour of the day as a number. If no argument is given,
+ * then the current local date/time, as returned by date:date-time is
+ * used the default argument.
+ * The date/time string specified as the argument is a left or
+ * right-truncated string in the format defined as the lexical
+ * representation of xs:dateTime in one of the formats defined in [XML
+ * Schema Part 2: Datatypes]. The permitted formats are as follows:
+ * - xs:dateTime (CCYY-MM-DDThh:mm:ss)
+ * - xs:time (hh:mm:ss)
+ * If the date/time string is not in one of these formats, then NaN is
+ * returned.
+ */
+static double
+exsltDateHourInDay (const xmlChar *dateTime)
+{
+ exsltDateValPtr dt;
+ double ret;
+
+ if (dateTime == NULL) {
+ dt = exsltDateCurrent();
+ if (dt == NULL)
+ return NAN;
+ } else {
+ dt = exsltDateParse(dateTime);
+ if (dt == NULL)
+ return NAN;
+ if ((dt->type != XS_DATETIME) && (dt->type != XS_TIME)) {
+ exsltDateFreeDate(dt);
+ return NAN;
+ }
+ }
+
+ ret = (double) dt->hour;
+ exsltDateFreeDate(dt);
+
+ return ret;
+}
+
+/**
+ * exsltDateMinuteInHour:
+ * @dateTime: a date/time string
+ *
+ * Implements the EXSLT - Dates and Times day-in-month() function:
+ * number date:day-in-month (string?)
+ * Returns the minute of the hour as a number. If no argument is
+ * given, then the current local date/time, as returned by
+ * date:date-time is used the default argument.
+ * The date/time string specified as the argument is a left or
+ * right-truncated string in the format defined as the lexical
+ * representation of xs:dateTime in one of the formats defined in [XML
+ * Schema Part 2: Datatypes]. The permitted formats are as follows:
+ * - xs:dateTime (CCYY-MM-DDThh:mm:ss)
+ * - xs:time (hh:mm:ss)
+ * If the date/time string is not in one of these formats, then NaN is
+ * returned.
+ */
+static double
+exsltDateMinuteInHour (const xmlChar *dateTime)
+{
+ exsltDateValPtr dt;
+ double ret;
+
+ if (dateTime == NULL) {
+ dt = exsltDateCurrent();
+ if (dt == NULL)
+ return NAN;
+ } else {
+ dt = exsltDateParse(dateTime);
+ if (dt == NULL)
+ return NAN;
+ if ((dt->type != XS_DATETIME) && (dt->type != XS_TIME)) {
+ exsltDateFreeDate(dt);
+ return NAN;
+ }
+ }
+
+ ret = (double) dt->min;
+ exsltDateFreeDate(dt);
+
+ return ret;
+}
+
+/**
+ * exsltDateSecondInMinute:
+ * @dateTime: a date/time string
+ *
+ * Implements the EXSLT - Dates and Times second-in-minute() function:
+ * number date:day-in-month (string?)
+ * Returns the second of the minute as a number. If no argument is
+ * given, then the current local date/time, as returned by
+ * date:date-time is used the default argument.
+ * The date/time string specified as the argument is a left or
+ * right-truncated string in the format defined as the lexical
+ * representation of xs:dateTime in one of the formats defined in [XML
+ * Schema Part 2: Datatypes]. The permitted formats are as follows:
+ * - xs:dateTime (CCYY-MM-DDThh:mm:ss)
+ * - xs:time (hh:mm:ss)
+ * If the date/time string is not in one of these formats, then NaN is
+ * returned.
+ *
+ * Returns the second or NaN.
+ */
+static double
+exsltDateSecondInMinute (const xmlChar *dateTime)
+{
+ exsltDateValPtr dt;
+ double ret;
+
+ if (dateTime == NULL) {
+ dt = exsltDateCurrent();
+ if (dt == NULL)
+ return NAN;
+ } else {
+ dt = exsltDateParse(dateTime);
+ if (dt == NULL)
+ return NAN;
+ if ((dt->type != XS_DATETIME) && (dt->type != XS_TIME)) {
+ exsltDateFreeDate(dt);
+ return NAN;
+ }
+ }
+
+ ret = dt->sec;
+ exsltDateFreeDate(dt);
+
+ return ret;
+}
+
+/**
+ * exsltDateAdd:
+ * @xstr: date/time string
+ * @ystr: date/time string
+ *
+ * Implements the date:add (string,string) function which returns the
+ * date/time * resulting from adding a duration to a date/time.
+ * The first argument (@xstr) must be right-truncated date/time
+ * strings in one of the formats defined in [XML Schema Part 2:
+ * Datatypes]. The permitted formats are as follows:
+ * - xs:dateTime (CCYY-MM-DDThh:mm:ss)
+ * - xs:date (CCYY-MM-DD)
+ * - xs:gYearMonth (CCYY-MM)
+ * - xs:gYear (CCYY)
+ * The second argument (@ystr) is a string in the format defined for
+ * xs:duration in [3.2.6 duration] of [XML Schema Part 2: Datatypes].
+ * The return value is a right-truncated date/time strings in one of
+ * the formats defined in [XML Schema Part 2: Datatypes] and listed
+ * above. This value is calculated using the algorithm described in
+ * [Appendix E Adding durations to dateTimes] of [XML Schema Part 2:
+ * Datatypes].
+
+ * Returns date/time string or NULL.
+ */
+static xmlChar *
+exsltDateAdd (const xmlChar *xstr, const xmlChar *ystr)
+{
+ exsltDateValPtr dt, res;
+ exsltDateDurValPtr dur;
+ xmlChar *ret;
+
+ if ((xstr == NULL) || (ystr == NULL))
+ return NULL;
+
+ dt = exsltDateParse(xstr);
+ if (dt == NULL)
+ return NULL;
+ else if ((dt->type < XS_GYEAR) || (dt->type > XS_DATETIME)) {
+ exsltDateFreeDate(dt);
+ return NULL;
+ }
+
+ dur = exsltDateParseDuration(ystr);
+ if (dur == NULL) {
+ exsltDateFreeDate(dt);
+ return NULL;
+ }
+
+ res = _exsltDateAdd(dt, dur);
+
+ exsltDateFreeDate(dt);
+ exsltDateFreeDuration(dur);
+
+ if (res == NULL)
+ return NULL;
+
+ ret = exsltDateFormat(res);
+ exsltDateFreeDate(res);
+
+ return ret;
+}
+
+/**
+ * exsltDateAddDuration:
+ * @xstr: first duration string
+ * @ystr: second duration string
+ *
+ * Implements the date:add-duration (string,string) function which returns
+ * the duration resulting from adding two durations together.
+ * Both arguments are strings in the format defined for xs:duration
+ * in [3.2.6 duration] of [XML Schema Part 2: Datatypes]. If either
+ * argument is not in this format, the function returns an empty string
+ * ('').
+ * The return value is a string in the format defined for xs:duration
+ * in [3.2.6 duration] of [XML Schema Part 2: Datatypes].
+ * The durations can usually be added by summing the numbers given for
+ * each of the components in the durations. However, if the durations
+ * are differently signed, then this sometimes results in durations
+ * that are impossible to express in this syntax (e.g. 'P1M' + '-P1D').
+ * In these cases, the function returns an empty string ('').
+ *
+ * Returns duration string or NULL.
+ */
+static xmlChar *
+exsltDateAddDuration (const xmlChar *xstr, const xmlChar *ystr)
+{
+ exsltDateDurValPtr x, y, res;
+ xmlChar *ret;
+
+ if ((xstr == NULL) || (ystr == NULL))
+ return NULL;
+
+ x = exsltDateParseDuration(xstr);
+ if (x == NULL)
+ return NULL;
+
+ y = exsltDateParseDuration(ystr);
+ if (y == NULL) {
+ exsltDateFreeDuration(x);
+ return NULL;
+ }
+
+ res = _exsltDateAddDuration(x, y);
+
+ exsltDateFreeDuration(x);
+ exsltDateFreeDuration(y);
+
+ if (res == NULL)
+ return NULL;
+
+ ret = exsltDateFormatDuration(res);
+ exsltDateFreeDuration(res);
+
+ return ret;
+}
+
+/**
+ * exsltDateSumFunction:
+ * @ns: a node set of duration strings
+ *
+ * The date:sum function adds a set of durations together.
+ * The string values of the nodes in the node set passed as an argument
+ * are interpreted as durations and added together as if using the
+ * date:add-duration function. (from exslt.org)
+ *
+ * The return value is a string in the format defined for xs:duration
+ * in [3.2.6 duration] of [XML Schema Part 2: Datatypes].
+ * The durations can usually be added by summing the numbers given for
+ * each of the components in the durations. However, if the durations
+ * are differently signed, then this sometimes results in durations
+ * that are impossible to express in this syntax (e.g. 'P1M' + '-P1D').
+ * In these cases, the function returns an empty string ('').
+ *
+ * Returns duration string or NULL.
+ */
+static void
+exsltDateSumFunction (xmlXPathParserContextPtr ctxt, int nargs)
+{
+ xmlNodeSetPtr ns;
+ void *user = NULL;
+ xmlChar *tmp;
+ exsltDateDurValPtr x, total;
+ xmlChar *ret;
+ int i;
+
+ if (nargs != 1) {
+ xmlXPathSetArityError (ctxt);
+ return;
+ }
+
+ /* We need to delay the freeing of value->user */
+ if ((ctxt->value != NULL) && ctxt->value->boolval != 0) {
+ user = ctxt->value->user;
+ ctxt->value->boolval = 0;
+ ctxt->value->user = NULL;
+ }
+
+ ns = xmlXPathPopNodeSet (ctxt);
+ if (xmlXPathCheckError (ctxt))
+ return;
+
+ if ((ns == NULL) || (ns->nodeNr == 0)) {
+ xmlXPathReturnEmptyString (ctxt);
+ if (ns != NULL)
+ xmlXPathFreeNodeSet (ns);
+ return;
+ }
+
+ total = exsltDateCreateDuration ();
+ if (total == NULL) {
+ xmlXPathFreeNodeSet (ns);
+ return;
+ }
+
+ for (i = 0; i < ns->nodeNr; i++) {
+ int result;
+ tmp = xmlXPathCastNodeToString (ns->nodeTab[i]);
+ if (tmp == NULL) {
+ xmlXPathFreeNodeSet (ns);
+ exsltDateFreeDuration (total);
+ return;
+ }
+
+ x = exsltDateParseDuration (tmp);
+ if (x == NULL) {
+ xmlFree (tmp);
+ exsltDateFreeDuration (total);
+ xmlXPathFreeNodeSet (ns);
+ xmlXPathReturnEmptyString (ctxt);
+ return;
+ }
+
+ result = _exsltDateAddDurCalc(total, total, x);
+
+ exsltDateFreeDuration (x);
+ xmlFree (tmp);
+ if (!result) {
+ exsltDateFreeDuration (total);
+ xmlXPathFreeNodeSet (ns);
+ xmlXPathReturnEmptyString (ctxt);
+ return;
+ }
+ }
+
+ ret = exsltDateFormatDuration (total);
+ exsltDateFreeDuration (total);
+
+ xmlXPathFreeNodeSet (ns);
+ if (user != NULL)
+ xmlFreeNodeList ((xmlNodePtr) user);
+
+ if (ret == NULL)
+ xmlXPathReturnEmptyString (ctxt);
+ else
+ xmlXPathReturnString (ctxt, ret);
+}
+
+/**
+ * exsltDateSeconds:
+ * @dateTime: a date/time string
+ *
+ * Implements the EXSLT - Dates and Times seconds() function:
+ * number date:seconds(string?)
+ * The date:seconds function returns the number of seconds specified
+ * by the argument string. If no argument is given, then the current
+ * local date/time, as returned by exsltDateCurrent() is used as the
+ * default argument. If the date/time string is a xs:duration, then the
+ * years and months must be zero (or not present). Parsing a duration
+ * converts the fields to seconds. If the date/time string is not a
+ * duration (and not null), then the legal formats are:
+ * - xs:dateTime (CCYY-MM-DDThh:mm:ss)
+ * - xs:date (CCYY-MM-DD)
+ * - xs:gYearMonth (CCYY-MM)
+ * - xs:gYear (CCYY)
+ * In these cases the difference between the @dateTime and
+ * 1970-01-01T00:00:00Z is calculated and converted to seconds.
+ *
+ * Note that there was some confusion over whether "difference" meant
+ * that a dateTime of 1970-01-01T00:00:01Z should be a positive one or
+ * a negative one. After correspondence with exslt.org, it was determined
+ * that the intent of the specification was to have it positive. The
+ * coding was modified in July 2003 to reflect this.
+ *
+ * Returns seconds or Nan.
+ */
+static double
+exsltDateSeconds (const xmlChar *dateTime)
+{
+ exsltDateValPtr dt;
+ exsltDateDurValPtr dur = NULL;
+ double ret = NAN;
+
+ if (dateTime == NULL) {
+ dt = exsltDateCurrent();
+ if (dt == NULL)
+ return NAN;
+ } else {
+ dt = exsltDateParse(dateTime);
+ if (dt == NULL)
+ dur = exsltDateParseDuration(dateTime);
+ }
+
+ if ((dt != NULL) && (dt->type >= XS_GYEAR)) {
+ exsltDateValPtr y;
+ exsltDateDurValPtr diff;
+
+ /*
+ * compute the difference between the given (or current) date
+ * and epoch date
+ */
+ y = exsltDateCreateDate(XS_DATETIME);
+ if (y != NULL) {
+ y->year = 1970;
+ y->mon = 1;
+ y->day = 1;
+ y->tz_flag = 1;
+
+ diff = _exsltDateDifference(y, dt, 1);
+ if (diff != NULL) {
+ ret = (double)diff->day * SECS_PER_DAY + diff->sec;
+ exsltDateFreeDuration(diff);
+ }
+ exsltDateFreeDate(y);
+ }
+
+ } else if ((dur != NULL) && (dur->mon == 0)) {
+ ret = (double)dur->day * SECS_PER_DAY + dur->sec;
+ }
+
+ if (dt != NULL)
+ exsltDateFreeDate(dt);
+ if (dur != NULL)
+ exsltDateFreeDuration(dur);
+
+ return ret;
+}
+
+/**
+ * exsltDateDifference:
+ * @xstr: date/time string
+ * @ystr: date/time string
+ *
+ * Implements the date:difference (string,string) function which returns
+ * the duration between the first date and the second date. If the first
+ * date occurs before the second date, then the result is a positive
+ * duration; if it occurs after the second date, the result is a
+ * negative duration. The two dates must both be right-truncated
+ * date/time strings in one of the formats defined in [XML Schema Part
+ * 2: Datatypes]. The date/time with the most specific format (i.e. the
+ * least truncation) is converted into the same format as the date with
+ * the least specific format (i.e. the most truncation). The permitted
+ * formats are as follows, from most specific to least specific:
+ * - xs:dateTime (CCYY-MM-DDThh:mm:ss)
+ * - xs:date (CCYY-MM-DD)
+ * - xs:gYearMonth (CCYY-MM)
+ * - xs:gYear (CCYY)
+ * If either of the arguments is not in one of these formats,
+ * date:difference returns the empty string ('').
+ * The difference between the date/times is returned as a string in the
+ * format defined for xs:duration in [3.2.6 duration] of [XML Schema
+ * Part 2: Datatypes].
+ * If the date/time string with the least specific format is in either
+ * xs:gYearMonth or xs:gYear format, then the number of days, hours,
+ * minutes and seconds in the duration string must be equal to zero.
+ * (The format of the string will be PnYnM.) The number of months
+ * specified in the duration must be less than 12.
+ * Otherwise, the number of years and months in the duration string
+ * must be equal to zero. (The format of the string will be
+ * PnDTnHnMnS.) The number of seconds specified in the duration string
+ * must be less than 60; the number of minutes must be less than 60;
+ * the number of hours must be less than 24.
+ *
+ * Returns duration string or NULL.
+ */
+static xmlChar *
+exsltDateDifference (const xmlChar *xstr, const xmlChar *ystr)
+{
+ exsltDateValPtr x, y;
+ exsltDateDurValPtr dur;
+ xmlChar *ret = NULL;
+
+ if ((xstr == NULL) || (ystr == NULL))
+ return NULL;
+
+ x = exsltDateParse(xstr);
+ if (x == NULL)
+ return NULL;
+
+ y = exsltDateParse(ystr);
+ if (y == NULL) {
+ exsltDateFreeDate(x);
+ return NULL;
+ }
+
+ if (((x->type < XS_GYEAR) || (x->type > XS_DATETIME)) ||
+ ((y->type < XS_GYEAR) || (y->type > XS_DATETIME))) {
+ exsltDateFreeDate(x);
+ exsltDateFreeDate(y);
+ return NULL;
+ }
+
+ dur = _exsltDateDifference(x, y, 0);
+
+ exsltDateFreeDate(x);
+ exsltDateFreeDate(y);
+
+ if (dur == NULL)
+ return NULL;
+
+ ret = exsltDateFormatDuration(dur);
+ exsltDateFreeDuration(dur);
+
+ return ret;
+}
+
+/**
+ * exsltDateDuration:
+ * @number: a xmlChar string
+ *
+ * Implements the The date:duration function returns a duration string
+ * representing the number of seconds specified by the argument string.
+ * If no argument is given, then the result of calling date:seconds
+ * without any arguments is used as a default argument.
+ * The duration is returned as a string in the format defined for
+ * xs:duration in [3.2.6 duration] of [XML Schema Part 2: Datatypes].
+ * The number of years and months in the duration string must be equal
+ * to zero. (The format of the string will be PnDTnHnMnS.) The number
+ * of seconds specified in the duration string must be less than 60;
+ * the number of minutes must be less than 60; the number of hours must
+ * be less than 24.
+ * If the argument is Infinity, -Infinity or NaN, then date:duration
+ * returns an empty string ('').
+ *
+ * Returns duration string or NULL.
+ */
+static xmlChar *
+exsltDateDuration (const xmlChar *number)
+{
+ exsltDateDurValPtr dur;
+ double secs, days;
+ xmlChar *ret;
+
+ if (number == NULL)
+ secs = exsltDateSeconds(number);
+ else
+ secs = xmlXPathCastStringToNumber(number);
+
+ if (xmlXPathIsNaN(secs))
+ return NULL;
+
+ days = floor(secs / SECS_PER_DAY);
+ if ((days <= (double)LONG_MIN) || (days >= (double)LONG_MAX))
+ return NULL;
+
+ dur = exsltDateCreateDuration();
+ if (dur == NULL)
+ return NULL;
+
+ dur->day = (long)days;
+ dur->sec = secs - days * SECS_PER_DAY;
+
+ ret = exsltDateFormatDuration(dur);
+ exsltDateFreeDuration(dur);
+
+ return ret;
+}
+
+/****************************************************************
+ * *
+ * Wrappers for use by the XPath engine *
+ * *
+ ****************************************************************/
+
+/**
+ * exsltDateDateTimeFunction:
+ * @ctxt: an XPath parser context
+ * @nargs : the number of arguments
+ *
+ * Wraps exsltDateDateTime() for use by the XPath engine.
+ */
+static void
+exsltDateDateTimeFunction (xmlXPathParserContextPtr ctxt, int nargs)
+{
+ xmlChar *ret;
+
+ if (nargs != 0) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+
+ ret = exsltDateDateTime();
+ if (ret == NULL)
+ xmlXPathReturnEmptyString(ctxt);
+ else
+ xmlXPathReturnString(ctxt, ret);
+}
+
+/**
+ * exsltDateDateFunction:
+ * @ctxt: an XPath parser context
+ * @nargs : the number of arguments
+ *
+ * Wraps exsltDateDate() for use by the XPath engine.
+ */
+static void
+exsltDateDateFunction (xmlXPathParserContextPtr ctxt, int nargs)
+{
+ xmlChar *ret, *dt = NULL;
+
+ if ((nargs < 0) || (nargs > 1)) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+ if (nargs == 1) {
+ dt = xmlXPathPopString(ctxt);
+ if (xmlXPathCheckError(ctxt)) {
+ xmlXPathSetTypeError(ctxt);
+ return;
+ }
+ }
+
+ ret = exsltDateDate(dt);
+
+ if (ret == NULL) {
+ xsltGenericDebug(xsltGenericDebugContext,
+ "{http://exslt.org/dates-and-times}date: "
+ "invalid date or format %s\n", dt);
+ xmlXPathReturnEmptyString(ctxt);
+ } else {
+ xmlXPathReturnString(ctxt, ret);
+ }
+
+ if (dt != NULL)
+ xmlFree(dt);
+}
+
+/**
+ * exsltDateTimeFunction:
+ * @ctxt: an XPath parser context
+ * @nargs : the number of arguments
+ *
+ * Wraps exsltDateTime() for use by the XPath engine.
+ */
+static void
+exsltDateTimeFunction (xmlXPathParserContextPtr ctxt, int nargs)
+{
+ xmlChar *ret, *dt = NULL;
+
+ if ((nargs < 0) || (nargs > 1)) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+ if (nargs == 1) {
+ dt = xmlXPathPopString(ctxt);
+ if (xmlXPathCheckError(ctxt)) {
+ xmlXPathSetTypeError(ctxt);
+ return;
+ }
+ }
+
+ ret = exsltDateTime(dt);
+
+ if (ret == NULL) {
+ xsltGenericDebug(xsltGenericDebugContext,
+ "{http://exslt.org/dates-and-times}time: "
+ "invalid date or format %s\n", dt);
+ xmlXPathReturnEmptyString(ctxt);
+ } else {
+ xmlXPathReturnString(ctxt, ret);
+ }
+
+ if (dt != NULL)
+ xmlFree(dt);
+}
+
+/**
+ * exsltDateYearFunction:
+ * @ctxt: an XPath parser context
+ * @nargs : the number of arguments
+ *
+ * Wraps exsltDateYear() for use by the XPath engine.
+ */
+static void
+exsltDateYearFunction (xmlXPathParserContextPtr ctxt, int nargs)
+{
+ xmlChar *dt = NULL;
+ double ret;
+
+ if ((nargs < 0) || (nargs > 1)) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+
+ if (nargs == 1) {
+ dt = xmlXPathPopString(ctxt);
+ if (xmlXPathCheckError(ctxt)) {
+ xmlXPathSetTypeError(ctxt);
+ return;
+ }
+ }
+
+ ret = exsltDateYear(dt);
+
+ if (dt != NULL)
+ xmlFree(dt);
+
+ xmlXPathReturnNumber(ctxt, ret);
+}
+
+/**
+ * exsltDateLeapYearFunction:
+ * @ctxt: an XPath parser context
+ * @nargs : the number of arguments
+ *
+ * Wraps exsltDateLeapYear() for use by the XPath engine.
+ */
+static void
+exsltDateLeapYearFunction (xmlXPathParserContextPtr ctxt, int nargs)
+{
+ xmlChar *dt = NULL;
+ xmlXPathObjectPtr ret;
+
+ if ((nargs < 0) || (nargs > 1)) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+
+ if (nargs == 1) {
+ dt = xmlXPathPopString(ctxt);
+ if (xmlXPathCheckError(ctxt)) {
+ xmlXPathSetTypeError(ctxt);
+ return;
+ }
+ }
+
+ ret = exsltDateLeapYear(dt);
+
+ if (dt != NULL)
+ xmlFree(dt);
+
+ valuePush(ctxt, ret);
+}
+
+#define X_IN_Y(x, y) \
+static void \
+exsltDate##x##In##y##Function (xmlXPathParserContextPtr ctxt, \
+ int nargs) { \
+ xmlChar *dt = NULL; \
+ double ret; \
+ \
+ if ((nargs < 0) || (nargs > 1)) { \
+ xmlXPathSetArityError(ctxt); \
+ return; \
+ } \
+ \
+ if (nargs == 1) { \
+ dt = xmlXPathPopString(ctxt); \
+ if (xmlXPathCheckError(ctxt)) { \
+ xmlXPathSetTypeError(ctxt); \
+ return; \
+ } \
+ } \
+ \
+ ret = exsltDate##x##In##y(dt); \
+ \
+ if (dt != NULL) \
+ xmlFree(dt); \
+ \
+ xmlXPathReturnNumber(ctxt, ret); \
+}
+
+/**
+ * exsltDateMonthInYearFunction:
+ * @ctxt: an XPath parser context
+ * @nargs : the number of arguments
+ *
+ * Wraps exsltDateMonthInYear() for use by the XPath engine.
+ */
+X_IN_Y(Month,Year)
+
+/**
+ * exsltDateMonthNameFunction:
+ * @ctxt: an XPath parser context
+ * @nargs : the number of arguments
+ *
+ * Wraps exsltDateMonthName() for use by the XPath engine.
+ */
+static void
+exsltDateMonthNameFunction (xmlXPathParserContextPtr ctxt, int nargs)
+{
+ xmlChar *dt = NULL;
+ const xmlChar *ret;
+
+ if ((nargs < 0) || (nargs > 1)) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+
+ if (nargs == 1) {
+ dt = xmlXPathPopString(ctxt);
+ if (xmlXPathCheckError(ctxt)) {
+ xmlXPathSetTypeError(ctxt);
+ return;
+ }
+ }
+
+ ret = exsltDateMonthName(dt);
+
+ if (dt != NULL)
+ xmlFree(dt);
+
+ if (ret == NULL)
+ xmlXPathReturnEmptyString(ctxt);
+ else
+ xmlXPathReturnString(ctxt, xmlStrdup(ret));
+}
+
+/**
+ * exsltDateMonthAbbreviationFunction:
+ * @ctxt: an XPath parser context
+ * @nargs : the number of arguments
+ *
+ * Wraps exsltDateMonthAbbreviation() for use by the XPath engine.
+ */
+static void
+exsltDateMonthAbbreviationFunction (xmlXPathParserContextPtr ctxt, int nargs)
+{
+ xmlChar *dt = NULL;
+ const xmlChar *ret;
+
+ if ((nargs < 0) || (nargs > 1)) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+
+ if (nargs == 1) {
+ dt = xmlXPathPopString(ctxt);
+ if (xmlXPathCheckError(ctxt)) {
+ xmlXPathSetTypeError(ctxt);
+ return;
+ }
+ }
+
+ ret = exsltDateMonthAbbreviation(dt);
+
+ if (dt != NULL)
+ xmlFree(dt);
+
+ if (ret == NULL)
+ xmlXPathReturnEmptyString(ctxt);
+ else
+ xmlXPathReturnString(ctxt, xmlStrdup(ret));
+}
+
+/**
+ * exsltDateWeekInYearFunction:
+ * @ctxt: an XPath parser context
+ * @nargs : the number of arguments
+ *
+ * Wraps exsltDateWeekInYear() for use by the XPath engine.
+ */
+X_IN_Y(Week,Year)
+
+/**
+ * exsltDateWeekInMonthFunction:
+ * @ctxt: an XPath parser context
+ * @nargs : the number of arguments
+ *
+ * Wraps exsltDateWeekInMonthYear() for use by the XPath engine.
+ */
+X_IN_Y(Week,Month)
+
+/**
+ * exsltDateDayInYearFunction:
+ * @ctxt: an XPath parser context
+ * @nargs : the number of arguments
+ *
+ * Wraps exsltDateDayInYear() for use by the XPath engine.
+ */
+X_IN_Y(Day,Year)
+
+/**
+ * exsltDateDayInMonthFunction:
+ * @ctxt: an XPath parser context
+ * @nargs : the number of arguments
+ *
+ * Wraps exsltDateDayInMonth() for use by the XPath engine.
+ */
+X_IN_Y(Day,Month)
+
+/**
+ * exsltDateDayOfWeekInMonthFunction:
+ * @ctxt: an XPath parser context
+ * @nargs : the number of arguments
+ *
+ * Wraps exsltDayOfWeekInMonth() for use by the XPath engine.
+ */
+X_IN_Y(DayOfWeek,Month)
+
+/**
+ * exsltDateDayInWeekFunction:
+ * @ctxt: an XPath parser context
+ * @nargs : the number of arguments
+ *
+ * Wraps exsltDateDayInWeek() for use by the XPath engine.
+ */
+X_IN_Y(Day,Week)
+
+/**
+ * exsltDateDayNameFunction:
+ * @ctxt: an XPath parser context
+ * @nargs : the number of arguments
+ *
+ * Wraps exsltDateDayName() for use by the XPath engine.
+ */
+static void
+exsltDateDayNameFunction (xmlXPathParserContextPtr ctxt, int nargs)
+{
+ xmlChar *dt = NULL;
+ const xmlChar *ret;
+
+ if ((nargs < 0) || (nargs > 1)) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+
+ if (nargs == 1) {
+ dt = xmlXPathPopString(ctxt);
+ if (xmlXPathCheckError(ctxt)) {
+ xmlXPathSetTypeError(ctxt);
+ return;
+ }
+ }
+
+ ret = exsltDateDayName(dt);
+
+ if (dt != NULL)
+ xmlFree(dt);
+
+ if (ret == NULL)
+ xmlXPathReturnEmptyString(ctxt);
+ else
+ xmlXPathReturnString(ctxt, xmlStrdup(ret));
+}
+
+/**
+ * exsltDateMonthDayFunction:
+ * @ctxt: an XPath parser context
+ * @nargs : the number of arguments
+ *
+ * Wraps exsltDateDayAbbreviation() for use by the XPath engine.
+ */
+static void
+exsltDateDayAbbreviationFunction (xmlXPathParserContextPtr ctxt, int nargs)
+{
+ xmlChar *dt = NULL;
+ const xmlChar *ret;
+
+ if ((nargs < 0) || (nargs > 1)) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+
+ if (nargs == 1) {
+ dt = xmlXPathPopString(ctxt);
+ if (xmlXPathCheckError(ctxt)) {
+ xmlXPathSetTypeError(ctxt);
+ return;
+ }
+ }
+
+ ret = exsltDateDayAbbreviation(dt);
+
+ if (dt != NULL)
+ xmlFree(dt);
+
+ if (ret == NULL)
+ xmlXPathReturnEmptyString(ctxt);
+ else
+ xmlXPathReturnString(ctxt, xmlStrdup(ret));
+}
+
+
+/**
+ * exsltDateHourInDayFunction:
+ * @ctxt: an XPath parser context
+ * @nargs : the number of arguments
+ *
+ * Wraps exsltDateHourInDay() for use by the XPath engine.
+ */
+X_IN_Y(Hour,Day)
+
+/**
+ * exsltDateMinuteInHourFunction:
+ * @ctxt: an XPath parser context
+ * @nargs : the number of arguments
+ *
+ * Wraps exsltDateMinuteInHour() for use by the XPath engine.
+ */
+X_IN_Y(Minute,Hour)
+
+/**
+ * exsltDateSecondInMinuteFunction:
+ * @ctxt: an XPath parser context
+ * @nargs : the number of arguments
+ *
+ * Wraps exsltDateSecondInMinute() for use by the XPath engine.
+ */
+X_IN_Y(Second,Minute)
+
+/**
+ * exsltDateSecondsFunction:
+ * @ctxt: an XPath parser context
+ * @nargs : the number of arguments
+ *
+ * Wraps exsltDateSeconds() for use by the XPath engine.
+ */
+static void
+exsltDateSecondsFunction (xmlXPathParserContextPtr ctxt, int nargs)
+{
+ xmlChar *str = NULL;
+ double ret;
+
+ if (nargs > 1) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+
+ if (nargs == 1) {
+ str = xmlXPathPopString(ctxt);
+ if (xmlXPathCheckError(ctxt)) {
+ xmlXPathSetTypeError(ctxt);
+ return;
+ }
+ }
+
+ ret = exsltDateSeconds(str);
+ if (str != NULL)
+ xmlFree(str);
+
+ xmlXPathReturnNumber(ctxt, ret);
+}
+
+/**
+ * exsltDateAddFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Wraps exsltDateAdd() for use by the XPath processor.
+ */
+static void
+exsltDateAddFunction (xmlXPathParserContextPtr ctxt, int nargs)
+{
+ xmlChar *ret, *xstr, *ystr;
+
+ if (nargs != 2) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+ ystr = xmlXPathPopString(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ xstr = xmlXPathPopString(ctxt);
+ if (xmlXPathCheckError(ctxt)) {
+ xmlFree(ystr);
+ return;
+ }
+
+ ret = exsltDateAdd(xstr, ystr);
+
+ xmlFree(ystr);
+ xmlFree(xstr);
+
+ if (ret == NULL)
+ xmlXPathReturnEmptyString(ctxt);
+ else
+ xmlXPathReturnString(ctxt, ret);
+}
+
+/**
+ * exsltDateAddDurationFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Wraps exsltDateAddDuration() for use by the XPath processor.
+ */
+static void
+exsltDateAddDurationFunction (xmlXPathParserContextPtr ctxt, int nargs)
+{
+ xmlChar *ret, *xstr, *ystr;
+
+ if (nargs != 2) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+ ystr = xmlXPathPopString(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ xstr = xmlXPathPopString(ctxt);
+ if (xmlXPathCheckError(ctxt)) {
+ xmlFree(ystr);
+ return;
+ }
+
+ ret = exsltDateAddDuration(xstr, ystr);
+
+ xmlFree(ystr);
+ xmlFree(xstr);
+
+ if (ret == NULL)
+ xmlXPathReturnEmptyString(ctxt);
+ else
+ xmlXPathReturnString(ctxt, ret);
+}
+
+/**
+ * exsltDateDifferenceFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Wraps exsltDateDifference() for use by the XPath processor.
+ */
+static void
+exsltDateDifferenceFunction (xmlXPathParserContextPtr ctxt, int nargs)
+{
+ xmlChar *ret, *xstr, *ystr;
+
+ if (nargs != 2) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+ ystr = xmlXPathPopString(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ xstr = xmlXPathPopString(ctxt);
+ if (xmlXPathCheckError(ctxt)) {
+ xmlFree(ystr);
+ return;
+ }
+
+ ret = exsltDateDifference(xstr, ystr);
+
+ xmlFree(ystr);
+ xmlFree(xstr);
+
+ if (ret == NULL)
+ xmlXPathReturnEmptyString(ctxt);
+ else
+ xmlXPathReturnString(ctxt, ret);
+}
+
+/**
+ * exsltDateDurationFunction:
+ * @ctxt: an XPath parser context
+ * @nargs : the number of arguments
+ *
+ * Wraps exsltDateDuration() for use by the XPath engine
+ */
+static void
+exsltDateDurationFunction (xmlXPathParserContextPtr ctxt, int nargs)
+{
+ xmlChar *ret;
+ xmlChar *number = NULL;
+
+ if ((nargs < 0) || (nargs > 1)) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+
+ if (nargs == 1) {
+ number = xmlXPathPopString(ctxt);
+ if (xmlXPathCheckError(ctxt)) {
+ xmlXPathSetTypeError(ctxt);
+ return;
+ }
+ }
+
+ ret = exsltDateDuration(number);
+
+ if (number != NULL)
+ xmlFree(number);
+
+ if (ret == NULL)
+ xmlXPathReturnEmptyString(ctxt);
+ else
+ xmlXPathReturnString(ctxt, ret);
+}
+
+/**
+ * exsltDateRegister:
+ *
+ * Registers the EXSLT - Dates and Times module
+ */
+void
+exsltDateRegister (void)
+{
+ xsltRegisterExtModuleFunction ((const xmlChar *) "add",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateAddFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "add-duration",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateAddDurationFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "date",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateDateFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "date-time",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateDateTimeFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "day-abbreviation",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateDayAbbreviationFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "day-in-month",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateDayInMonthFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "day-in-week",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateDayInWeekFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "day-in-year",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateDayInYearFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "day-name",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateDayNameFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "day-of-week-in-month",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateDayOfWeekInMonthFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "difference",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateDifferenceFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "duration",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateDurationFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "hour-in-day",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateHourInDayFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "leap-year",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateLeapYearFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "minute-in-hour",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateMinuteInHourFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "month-abbreviation",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateMonthAbbreviationFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "month-in-year",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateMonthInYearFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "month-name",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateMonthNameFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "second-in-minute",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateSecondInMinuteFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "seconds",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateSecondsFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "sum",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateSumFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "time",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateTimeFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "week-in-month",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateWeekInMonthFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "week-in-year",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateWeekInYearFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "year",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateYearFunction);
+}
+
+/**
+ * exsltDateXpathCtxtRegister:
+ *
+ * Registers the EXSLT - Dates and Times module for use outside XSLT
+ */
+int
+exsltDateXpathCtxtRegister (xmlXPathContextPtr ctxt, const xmlChar *prefix)
+{
+ if (ctxt
+ && prefix
+ && !xmlXPathRegisterNs(ctxt,
+ prefix,
+ (const xmlChar *) EXSLT_DATE_NAMESPACE)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "add",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateAddFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "add-duration",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateAddDurationFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "date",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateDateFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "date-time",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateDateTimeFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "day-abbreviation",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateDayAbbreviationFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "day-in-month",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateDayInMonthFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "day-in-week",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateDayInWeekFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "day-in-year",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateDayInYearFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "day-name",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateDayNameFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "day-of-week-in-month",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateDayOfWeekInMonthFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "difference",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateDifferenceFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "duration",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateDurationFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "hour-in-day",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateHourInDayFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "leap-year",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateLeapYearFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "minute-in-hour",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateMinuteInHourFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "month-abbreviation",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateMonthAbbreviationFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "month-in-year",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateMonthInYearFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "month-name",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateMonthNameFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "second-in-minute",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateSecondInMinuteFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "seconds",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateSecondsFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "sum",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateSumFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "time",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateTimeFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "week-in-month",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateWeekInMonthFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "week-in-year",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateWeekInYearFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "year",
+ (const xmlChar *) EXSLT_DATE_NAMESPACE,
+ exsltDateYearFunction)) {
+ return 0;
+ }
+ return -1;
+}
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/libexslt/dynamic.c chromium-145.0.7632.159/third_party/libxslt/src/libexslt/dynamic.c
--- chromium-145.0.7632.116/third_party/libxslt/src/libexslt/dynamic.c 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/libexslt/dynamic.c 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,296 @@
+/*
+ * dynamic.c: Implementation of the EXSLT -- Dynamic module
+ *
+ * References:
+ * http://www.exslt.org/dyn/dyn.html
+ *
+ * See Copyright for the status of this software.
+ *
+ * Authors:
+ * Mark Vakoc
+ * Thomas Broyer
+ *
+ * TODO:
+ * elements:
+ * functions:
+ * min
+ * max
+ * sum
+ * map
+ * closure
+ */
+
+#define IN_LIBEXSLT
+#include "libexslt/libexslt.h"
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+
+#include "exslt.h"
+
+/**
+ * exsltDynEvaluateFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Evaluates the string as an XPath expression and returns the result
+ * value, which may be a boolean, number, string, node set, result tree
+ * fragment or external object.
+ */
+
+static void
+exsltDynEvaluateFunction(xmlXPathParserContextPtr ctxt, int nargs) {
+ xmlChar *str = NULL;
+ xmlXPathObjectPtr ret = NULL;
+
+ if (ctxt == NULL)
+ return;
+ if (nargs != 1) {
+ xsltPrintErrorContext(xsltXPathGetTransformContext(ctxt), NULL, NULL);
+ xsltGenericError(xsltGenericErrorContext,
+ "dyn:evalute() : invalid number of args %d\n", nargs);
+ ctxt->error = XPATH_INVALID_ARITY;
+ return;
+ }
+ str = xmlXPathPopString(ctxt);
+ /* return an empty node-set if an empty string is passed in */
+ if (!str||!xmlStrlen(str)) {
+ if (str) xmlFree(str);
+ valuePush(ctxt,xmlXPathNewNodeSet(NULL));
+ return;
+ }
+#if LIBXML_VERSION >= 20911
+ /*
+ * Recursive evaluation can grow the call stack quickly.
+ */
+ ctxt->context->depth += 5;
+#endif
+ ret = xmlXPathEval(str,ctxt->context);
+#if LIBXML_VERSION >= 20911
+ ctxt->context->depth -= 5;
+#endif
+ if (ret)
+ valuePush(ctxt,ret);
+ else {
+ xsltGenericError(xsltGenericErrorContext,
+ "dyn:evaluate() : unable to evaluate expression '%s'\n",str);
+ valuePush(ctxt,xmlXPathNewNodeSet(NULL));
+ }
+ xmlFree(str);
+ return;
+}
+
+/**
+ * exsltDynMapFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Evaluates the string as an XPath expression and returns the result
+ * value, which may be a boolean, number, string, node set, result tree
+ * fragment or external object.
+ */
+
+static void
+exsltDynMapFunction(xmlXPathParserContextPtr ctxt, int nargs)
+{
+ xmlChar *str = NULL;
+ xmlNodeSetPtr nodeset = NULL;
+ xsltTransformContextPtr tctxt;
+ xmlXPathCompExprPtr comp = NULL;
+ xmlXPathObjectPtr ret = NULL;
+ xmlDocPtr oldDoc, container = NULL;
+ xmlNodePtr oldNode;
+ int oldContextSize;
+ int oldProximityPosition;
+ int i, j;
+
+
+ if (nargs != 2) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+ str = xmlXPathPopString(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ goto cleanup;
+
+ nodeset = xmlXPathPopNodeSet(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ goto cleanup;
+
+ ret = xmlXPathNewNodeSet(NULL);
+ if (ret == NULL) {
+ xsltGenericError(xsltGenericErrorContext,
+ "exsltDynMapFunction: ret == NULL\n");
+ goto cleanup;
+ }
+
+ tctxt = xsltXPathGetTransformContext(ctxt);
+ if (tctxt == NULL) {
+ xsltTransformError(xsltXPathGetTransformContext(ctxt), NULL, NULL,
+ "dyn:map : internal error tctxt == NULL\n");
+ goto cleanup;
+ }
+
+ if (str == NULL || !xmlStrlen(str) ||
+ !(comp = xmlXPathCtxtCompile(tctxt->xpathCtxt, str)))
+ goto cleanup;
+
+ oldDoc = ctxt->context->doc;
+ oldNode = ctxt->context->node;
+ oldContextSize = ctxt->context->contextSize;
+ oldProximityPosition = ctxt->context->proximityPosition;
+
+ /**
+ * since we really don't know we're going to be adding node(s)
+ * down the road we create the RVT regardless
+ */
+ container = xsltCreateRVT(tctxt);
+ if (container == NULL) {
+ xsltTransformError(tctxt, NULL, NULL,
+ "dyn:map : internal error container == NULL\n");
+ goto cleanup;
+ }
+ xsltRegisterLocalRVT(tctxt, container);
+ if (nodeset && nodeset->nodeNr > 0) {
+ xmlXPathNodeSetSort(nodeset);
+ ctxt->context->contextSize = nodeset->nodeNr;
+ ctxt->context->proximityPosition = 0;
+ for (i = 0; i < nodeset->nodeNr; i++) {
+ xmlXPathObjectPtr subResult = NULL;
+ xmlNodePtr cur = nodeset->nodeTab[i];
+
+ ctxt->context->proximityPosition++;
+ ctxt->context->node = cur;
+
+ if (cur->type == XML_NAMESPACE_DECL) {
+ /*
+ * The XPath module sets the owner element of a ns-node on
+ * the ns->next field.
+ */
+ cur = (xmlNodePtr) ((xmlNsPtr) cur)->next;
+ if ((cur == NULL) || (cur->type != XML_ELEMENT_NODE)) {
+ xsltGenericError(xsltGenericErrorContext,
+ "Internal error in exsltDynMapFunction: "
+ "Cannot retrieve the doc of a namespace node.\n");
+ continue;
+ }
+ ctxt->context->doc = cur->doc;
+ } else {
+ ctxt->context->doc = cur->doc;
+ }
+
+ subResult = xmlXPathCompiledEval(comp, ctxt->context);
+ if (subResult != NULL) {
+ switch (subResult->type) {
+ case XPATH_NODESET:
+ if (subResult->nodesetval != NULL)
+ for (j = 0; j < subResult->nodesetval->nodeNr;
+ j++)
+ xmlXPathNodeSetAdd(ret->nodesetval,
+ subResult->nodesetval->
+ nodeTab[j]);
+ break;
+ case XPATH_BOOLEAN:
+ if (container != NULL) {
+ xmlNodePtr newChildNode =
+ xmlNewTextChild((xmlNodePtr) container, NULL,
+ BAD_CAST "boolean",
+ BAD_CAST (subResult->
+ boolval ? "true" : ""));
+ if (newChildNode != NULL) {
+ newChildNode->ns =
+ xmlNewNs(newChildNode,
+ BAD_CAST
+ "http://exslt.org/common",
+ BAD_CAST "exsl");
+ xmlXPathNodeSetAddUnique(ret->nodesetval,
+ newChildNode);
+ }
+ }
+ break;
+ case XPATH_NUMBER:
+ if (container != NULL) {
+ xmlChar *val =
+ xmlXPathCastNumberToString(subResult->
+ floatval);
+ xmlNodePtr newChildNode =
+ xmlNewTextChild((xmlNodePtr) container, NULL,
+ BAD_CAST "number", val);
+ if (val != NULL)
+ xmlFree(val);
+
+ if (newChildNode != NULL) {
+ newChildNode->ns =
+ xmlNewNs(newChildNode,
+ BAD_CAST
+ "http://exslt.org/common",
+ BAD_CAST "exsl");
+ xmlXPathNodeSetAddUnique(ret->nodesetval,
+ newChildNode);
+ }
+ }
+ break;
+ case XPATH_STRING:
+ if (container != NULL) {
+ xmlNodePtr newChildNode =
+ xmlNewTextChild((xmlNodePtr) container, NULL,
+ BAD_CAST "string",
+ subResult->stringval);
+ if (newChildNode != NULL) {
+ newChildNode->ns =
+ xmlNewNs(newChildNode,
+ BAD_CAST
+ "http://exslt.org/common",
+ BAD_CAST "exsl");
+ xmlXPathNodeSetAddUnique(ret->nodesetval,
+ newChildNode);
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ xmlXPathFreeObject(subResult);
+ }
+ }
+ }
+ ctxt->context->doc = oldDoc;
+ ctxt->context->node = oldNode;
+ ctxt->context->contextSize = oldContextSize;
+ ctxt->context->proximityPosition = oldProximityPosition;
+
+
+ cleanup:
+ /* restore the xpath context */
+ if (comp != NULL)
+ xmlXPathFreeCompExpr(comp);
+ if (nodeset != NULL)
+ xmlXPathFreeNodeSet(nodeset);
+ if (str != NULL)
+ xmlFree(str);
+ valuePush(ctxt, ret);
+ return;
+}
+
+
+/**
+ * exsltDynRegister:
+ *
+ * Registers the EXSLT - Dynamic module
+ */
+
+void
+exsltDynRegister (void) {
+ xsltRegisterExtModuleFunction ((const xmlChar *) "evaluate",
+ EXSLT_DYNAMIC_NAMESPACE,
+ exsltDynEvaluateFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "map",
+ EXSLT_DYNAMIC_NAMESPACE,
+ exsltDynMapFunction);
+
+}
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/libexslt/exslt.c chromium-145.0.7632.159/third_party/libxslt/src/libexslt/exslt.c
--- chromium-145.0.7632.116/third_party/libxslt/src/libexslt/exslt.c 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/libexslt/exslt.c 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,35 @@
+#define IN_LIBEXSLT
+#include "libexslt/libexslt.h"
+
+#include
+
+#include
+#include "exslt.h"
+
+const char *exsltLibraryVersion = LIBEXSLT_VERSION_STRING
+ LIBEXSLT_VERSION_EXTRA;
+const int exsltLibexsltVersion = LIBEXSLT_VERSION;
+const int exsltLibxsltVersion = LIBXSLT_VERSION;
+const int exsltLibxmlVersion = LIBXML_VERSION;
+
+/**
+ * exsltRegisterAll:
+ *
+ * Registers all available EXSLT extensions
+ */
+void
+exsltRegisterAll (void) {
+ xsltInitGlobals();
+ exsltCommonRegister();
+#ifdef EXSLT_CRYPTO_ENABLED
+ exsltCryptoRegister();
+#endif
+ exsltMathRegister();
+ exsltSetsRegister();
+ exsltFuncRegister();
+ exsltStrRegister();
+ exsltDateRegister();
+ exsltSaxonRegister();
+ exsltDynRegister();
+}
+
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/libexslt/exslt.h chromium-145.0.7632.159/third_party/libxslt/src/libexslt/exslt.h
--- chromium-145.0.7632.116/third_party/libxslt/src/libexslt/exslt.h 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/libexslt/exslt.h 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,108 @@
+/*
+ * Summary: main header file
+ *
+ * Copy: See Copyright for the status of this software.
+ */
+
+
+#ifndef __EXSLT_H__
+#define __EXSLT_H__
+
+#include
+#include
+#include "exsltexports.h"
+#include
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EXSLTPUBVAR const char *exsltLibraryVersion;
+EXSLTPUBVAR const int exsltLibexsltVersion;
+EXSLTPUBVAR const int exsltLibxsltVersion;
+EXSLTPUBVAR const int exsltLibxmlVersion;
+
+/**
+ * EXSLT_COMMON_NAMESPACE:
+ *
+ * Namespace for EXSLT common functions
+ */
+#define EXSLT_COMMON_NAMESPACE ((const xmlChar *) "http://exslt.org/common")
+/**
+ * EXSLT_CRYPTO_NAMESPACE:
+ *
+ * Namespace for EXSLT crypto functions
+ */
+#define EXSLT_CRYPTO_NAMESPACE ((const xmlChar *) "http://exslt.org/crypto")
+/**
+ * EXSLT_MATH_NAMESPACE:
+ *
+ * Namespace for EXSLT math functions
+ */
+#define EXSLT_MATH_NAMESPACE ((const xmlChar *) "http://exslt.org/math")
+/**
+ * EXSLT_SETS_NAMESPACE:
+ *
+ * Namespace for EXSLT set functions
+ */
+#define EXSLT_SETS_NAMESPACE ((const xmlChar *) "http://exslt.org/sets")
+/**
+ * EXSLT_FUNCTIONS_NAMESPACE:
+ *
+ * Namespace for EXSLT functions extension functions
+ */
+#define EXSLT_FUNCTIONS_NAMESPACE ((const xmlChar *) "http://exslt.org/functions")
+/**
+ * EXSLT_STRINGS_NAMESPACE:
+ *
+ * Namespace for EXSLT strings functions
+ */
+#define EXSLT_STRINGS_NAMESPACE ((const xmlChar *) "http://exslt.org/strings")
+/**
+ * EXSLT_DATE_NAMESPACE:
+ *
+ * Namespace for EXSLT date functions
+ */
+#define EXSLT_DATE_NAMESPACE ((const xmlChar *) "http://exslt.org/dates-and-times")
+/**
+ * EXSLT_DYNAMIC_NAMESPACE:
+ *
+ * Namespace for EXSLT dynamic functions
+ */
+#define EXSLT_DYNAMIC_NAMESPACE ((const xmlChar *) "http://exslt.org/dynamic")
+
+/**
+ * SAXON_NAMESPACE:
+ *
+ * Namespace for SAXON extensions functions
+ */
+#define SAXON_NAMESPACE ((const xmlChar *) "http://icl.com/saxon")
+
+EXSLTPUBFUN void EXSLTCALL exsltCommonRegister (void);
+#ifdef EXSLT_CRYPTO_ENABLED
+EXSLTPUBFUN void EXSLTCALL exsltCryptoRegister (void);
+#endif
+EXSLTPUBFUN void EXSLTCALL exsltMathRegister (void);
+EXSLTPUBFUN void EXSLTCALL exsltSetsRegister (void);
+EXSLTPUBFUN void EXSLTCALL exsltFuncRegister (void);
+EXSLTPUBFUN void EXSLTCALL exsltStrRegister (void);
+EXSLTPUBFUN void EXSLTCALL exsltDateRegister (void);
+EXSLTPUBFUN void EXSLTCALL exsltSaxonRegister (void);
+EXSLTPUBFUN void EXSLTCALL exsltDynRegister(void);
+
+EXSLTPUBFUN void EXSLTCALL exsltRegisterAll (void);
+
+EXSLTPUBFUN int EXSLTCALL exsltDateXpathCtxtRegister (xmlXPathContextPtr ctxt,
+ const xmlChar *prefix);
+EXSLTPUBFUN int EXSLTCALL exsltMathXpathCtxtRegister (xmlXPathContextPtr ctxt,
+ const xmlChar *prefix);
+EXSLTPUBFUN int EXSLTCALL exsltSetsXpathCtxtRegister (xmlXPathContextPtr ctxt,
+ const xmlChar *prefix);
+EXSLTPUBFUN int EXSLTCALL exsltStrXpathCtxtRegister (xmlXPathContextPtr ctxt,
+ const xmlChar *prefix);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* __EXSLT_H__ */
+
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/libexslt/exsltconfig.h.in chromium-145.0.7632.159/third_party/libxslt/src/libexslt/exsltconfig.h.in
--- chromium-145.0.7632.116/third_party/libxslt/src/libexslt/exsltconfig.h.in 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/libexslt/exsltconfig.h.in 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,70 @@
+/*
+ * exsltconfig.h: compile-time version information for the EXSLT library
+ *
+ * See Copyright for the status of this software.
+ *
+ * daniel@veillard.com
+ */
+
+#ifndef __XML_EXSLTCONFIG_H__
+#define __XML_EXSLTCONFIG_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * LIBEXSLT_DOTTED_VERSION:
+ *
+ * the version string like "1.2.3"
+ */
+#define LIBEXSLT_DOTTED_VERSION "@LIBEXSLT_VERSION@"
+
+/**
+ * LIBEXSLT_VERSION:
+ *
+ * the version number: 1.2.3 value is 10203
+ */
+#define LIBEXSLT_VERSION @LIBEXSLT_VERSION_NUMBER@
+
+/**
+ * LIBEXSLT_VERSION_STRING:
+ *
+ * the version number string, 1.2.3 value is "10203"
+ */
+#define LIBEXSLT_VERSION_STRING "@LIBEXSLT_VERSION_NUMBER@"
+
+/**
+ * LIBEXSLT_VERSION_EXTRA:
+ *
+ * extra version information, used to show a Git commit description
+ */
+#define LIBEXSLT_VERSION_EXTRA "@LIBEXSLT_VERSION_EXTRA@"
+
+/**
+ * WITH_CRYPTO:
+ *
+ * Whether crypto support is configured into exslt
+ */
+#if @WITH_CRYPTO@
+#define EXSLT_CRYPTO_ENABLED
+#endif
+
+/**
+ * ATTRIBUTE_UNUSED:
+ *
+ * This macro is used to flag unused function parameters to GCC
+ */
+#ifdef __GNUC__
+#ifndef ATTRIBUTE_UNUSED
+#define ATTRIBUTE_UNUSED __attribute__((unused))
+#endif
+#else
+#define ATTRIBUTE_UNUSED
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __XML_EXSLTCONFIG_H__ */
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/libexslt/exsltexports.h chromium-145.0.7632.159/third_party/libxslt/src/libexslt/exsltexports.h
--- chromium-145.0.7632.116/third_party/libxslt/src/libexslt/exsltexports.h 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/libexslt/exsltexports.h 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,63 @@
+/*
+ * Summary: macros for marking symbols as exportable/importable.
+ *
+ * Copy: See Copyright for the status of this software.
+ */
+
+#ifndef __EXSLT_EXPORTS_H__
+#define __EXSLT_EXPORTS_H__
+
+#if defined(_WIN32) || defined(__CYGWIN__)
+/** DOC_DISABLE */
+
+#ifdef LIBEXSLT_STATIC
+ #define EXSLTPUBLIC
+#elif defined(IN_LIBEXSLT)
+ #define EXSLTPUBLIC __declspec(dllexport)
+#else
+ #define EXSLTPUBLIC __declspec(dllimport)
+#endif
+
+#define EXSLTCALL __cdecl
+
+/** DOC_ENABLE */
+#else /* not Windows */
+
+/**
+ * EXSLTPUBLIC:
+ *
+ * Macro which declares a public symbol
+ */
+#define EXSLTPUBLIC
+
+/**
+ * EXSLTCALL:
+ *
+ * Macro which declares the calling convention for exported functions
+ */
+#define EXSLTCALL
+
+#endif /* platform switch */
+
+/*
+ * EXSLTPUBFUN:
+ *
+ * Macro which declares an exportable function
+ */
+#define EXSLTPUBFUN EXSLTPUBLIC
+
+/**
+ * EXSLTPUBVAR:
+ *
+ * Macro which declares an exportable variable
+ */
+#define EXSLTPUBVAR EXSLTPUBLIC extern
+
+/* Compatibility */
+#if !defined(LIBEXSLT_PUBLIC)
+#define LIBEXSLT_PUBLIC EXSLTPUBVAR
+#endif
+
+#endif /* __EXSLT_EXPORTS_H__ */
+
+
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/libexslt/functions.c chromium-145.0.7632.159/third_party/libxslt/src/libexslt/functions.c
--- chromium-145.0.7632.116/third_party/libxslt/src/libexslt/functions.c 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/libexslt/functions.c 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,837 @@
+#define IN_LIBEXSLT
+#include "libexslt/libexslt.h"
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "exslt.h"
+
+typedef struct _exsltFuncFunctionData exsltFuncFunctionData;
+struct _exsltFuncFunctionData {
+ int nargs; /* number of arguments to the function */
+ xmlNodePtr content; /* the func:fuction template content */
+};
+
+typedef struct _exsltFuncData exsltFuncData;
+struct _exsltFuncData {
+ xmlHashTablePtr funcs; /* pointer to the stylesheet module data */
+ xmlXPathObjectPtr result; /* returned by func:result */
+ xsltStackElemPtr ctxtVar; /* context variable */
+ int error; /* did an error occur? */
+};
+
+typedef struct _exsltFuncResultPreComp exsltFuncResultPreComp;
+struct _exsltFuncResultPreComp {
+ xsltElemPreComp comp;
+ xmlXPathCompExprPtr select;
+ xmlNsPtr *nsList;
+ int nsNr;
+};
+
+/* Used for callback function in exsltInitFunc */
+typedef struct _exsltFuncImportRegData exsltFuncImportRegData;
+struct _exsltFuncImportRegData {
+ xsltTransformContextPtr ctxt;
+ xmlHashTablePtr hash;
+};
+
+static void exsltFuncFunctionFunction (xmlXPathParserContextPtr ctxt,
+ int nargs);
+static exsltFuncFunctionData *exsltFuncNewFunctionData(void);
+
+/*static const xmlChar *exsltResultDataID = (const xmlChar *) "EXSLT Result";*/
+
+/**
+ * exsltFuncRegisterFunc:
+ * @func: the #exsltFuncFunctionData for the function
+ * @ctxt: an XSLT transformation context
+ * @URI: the function namespace URI
+ * @name: the function name
+ *
+ * Registers a function declared by a func:function element
+ */
+static void
+exsltFuncRegisterFunc (void *payload, void *vctxt,
+ const xmlChar *URI, const xmlChar *name,
+ ATTRIBUTE_UNUSED const xmlChar *ignored) {
+ exsltFuncFunctionData *data = (exsltFuncFunctionData *) payload;
+ xsltTransformContextPtr ctxt = (xsltTransformContextPtr) vctxt;
+
+ if ((data == NULL) || (ctxt == NULL) || (URI == NULL) || (name == NULL))
+ return;
+
+ xsltGenericDebug(xsltGenericDebugContext,
+ "exsltFuncRegisterFunc: register {%s}%s\n",
+ URI, name);
+ xsltRegisterExtFunction(ctxt, name, URI,
+ exsltFuncFunctionFunction);
+}
+
+/*
+ * exsltFuncRegisterImportFunc
+ * @data: the exsltFuncFunctionData for the function
+ * @ch: structure containing context and hash table
+ * @URI: the function namespace URI
+ * @name: the function name
+ *
+ * Checks if imported function is already registered in top-level
+ * stylesheet. If not, copies function data and registers function
+ */
+static void
+exsltFuncRegisterImportFunc (void *payload, void *vctxt,
+ const xmlChar *URI, const xmlChar *name,
+ ATTRIBUTE_UNUSED const xmlChar *ignored) {
+ exsltFuncFunctionData *data = (exsltFuncFunctionData *) payload;
+ exsltFuncImportRegData *ch = (exsltFuncImportRegData *) vctxt;
+ exsltFuncFunctionData *func=NULL;
+
+ if ((data == NULL) || (ch == NULL) || (URI == NULL) || (name == NULL))
+ return;
+
+ if (ch->ctxt == NULL || ch->hash == NULL)
+ return;
+
+ /* Check if already present */
+ func = (exsltFuncFunctionData*)xmlHashLookup2(ch->hash, URI, name);
+ if (func == NULL) { /* Not yet present - copy it in */
+ func = exsltFuncNewFunctionData();
+ if (func == NULL)
+ return;
+ memcpy(func, data, sizeof(exsltFuncFunctionData));
+ if (xmlHashAddEntry2(ch->hash, URI, name, func) < 0) {
+ xsltGenericError(xsltGenericErrorContext,
+ "Failed to register function {%s}%s\n",
+ URI, name);
+ xmlFree(func);
+ } else { /* Do the registration */
+ xsltGenericDebug(xsltGenericDebugContext,
+ "exsltFuncRegisterImportFunc: register {%s}%s\n",
+ URI, name);
+ xsltRegisterExtFunction(ch->ctxt, name, URI,
+ exsltFuncFunctionFunction);
+ }
+ }
+}
+
+/**
+ * exsltFuncInit:
+ * @ctxt: an XSLT transformation context
+ * @URI: the namespace URI for the extension
+ *
+ * Initializes the EXSLT - Functions module.
+ * Called at transformation-time; merges all
+ * functions declared in the import tree taking
+ * import precedence into account, i.e. overriding
+ * functions with lower import precedence.
+ *
+ * Returns the data for this transformation
+ */
+static void *
+exsltFuncInit (xsltTransformContextPtr ctxt, const xmlChar *URI) {
+ exsltFuncData *ret;
+ xsltStylesheetPtr tmp;
+ exsltFuncImportRegData ch;
+ xmlHashTablePtr hash;
+
+ ret = (exsltFuncData *) xmlMalloc (sizeof(exsltFuncData));
+ if (ret == NULL) {
+ xsltGenericError(xsltGenericErrorContext,
+ "exsltFuncInit: not enough memory\n");
+ return(NULL);
+ }
+ memset(ret, 0, sizeof(exsltFuncData));
+
+ ret->result = NULL;
+ ret->error = 0;
+
+ ch.hash = (xmlHashTablePtr) xsltStyleGetExtData(ctxt->style, URI);
+ ret->funcs = ch.hash;
+ xmlHashScanFull(ch.hash, exsltFuncRegisterFunc, ctxt);
+ tmp = ctxt->style;
+ ch.ctxt = ctxt;
+ while ((tmp=xsltNextImport(tmp))!=NULL) {
+ hash = xsltGetExtInfo(tmp, URI);
+ if (hash != NULL) {
+ xmlHashScanFull(hash, exsltFuncRegisterImportFunc, &ch);
+ }
+ }
+
+ return(ret);
+}
+
+/**
+ * exsltFuncShutdown:
+ * @ctxt: an XSLT transformation context
+ * @URI: the namespace URI for the extension
+ * @data: the module data to free up
+ *
+ * Shutdown the EXSLT - Functions module
+ * Called at transformation-time.
+ */
+static void
+exsltFuncShutdown (xsltTransformContextPtr ctxt ATTRIBUTE_UNUSED,
+ const xmlChar *URI ATTRIBUTE_UNUSED,
+ void *vdata) {
+ exsltFuncData *data = (exsltFuncData *) vdata;
+
+ if (data != NULL) {
+ if (data->result != NULL)
+ xmlXPathFreeObject(data->result);
+ xmlFree(data);
+ }
+}
+
+/**
+ * exsltFuncStyleInit:
+ * @style: an XSLT stylesheet
+ * @URI: the namespace URI for the extension
+ *
+ * Allocates the stylesheet data for EXSLT - Function
+ * Called at compile-time.
+ *
+ * Returns the allocated data
+ */
+static void *
+exsltFuncStyleInit (xsltStylesheetPtr style ATTRIBUTE_UNUSED,
+ const xmlChar *URI ATTRIBUTE_UNUSED) {
+ return xmlHashCreate(1);
+}
+
+static void
+exsltFuncFreeDataEntry(void *payload, const xmlChar *name ATTRIBUTE_UNUSED) {
+ xmlFree(payload);
+}
+
+/**
+ * exsltFuncStyleShutdown:
+ * @style: an XSLT stylesheet
+ * @URI: the namespace URI for the extension
+ * @data: the stylesheet data to free up
+ *
+ * Shutdown the EXSLT - Function module
+ * Called at compile-time.
+ */
+static void
+exsltFuncStyleShutdown (xsltStylesheetPtr style ATTRIBUTE_UNUSED,
+ const xmlChar *URI ATTRIBUTE_UNUSED,
+ void *vdata) {
+ xmlHashTablePtr data = (xmlHashTablePtr) vdata;
+ xmlHashFree(data, exsltFuncFreeDataEntry);
+}
+
+/**
+ * exsltFuncNewFunctionData:
+ *
+ * Allocates an #exslFuncFunctionData object
+ *
+ * Returns the new structure
+ */
+static exsltFuncFunctionData *
+exsltFuncNewFunctionData (void) {
+ exsltFuncFunctionData *ret;
+
+ ret = (exsltFuncFunctionData *) xmlMalloc (sizeof(exsltFuncFunctionData));
+ if (ret == NULL) {
+ xsltGenericError(xsltGenericErrorContext,
+ "exsltFuncNewFunctionData: not enough memory\n");
+ return (NULL);
+ }
+ memset(ret, 0, sizeof(exsltFuncFunctionData));
+
+ ret->nargs = 0;
+ ret->content = NULL;
+
+ return(ret);
+}
+
+/**
+ * exsltFreeFuncResultPreComp:
+ * @comp: the #exsltFuncResultPreComp to free up
+ *
+ * Deallocates an #exsltFuncResultPreComp
+ */
+static void
+exsltFreeFuncResultPreComp (xsltElemPreCompPtr ecomp) {
+ exsltFuncResultPreComp *comp = (exsltFuncResultPreComp *) ecomp;
+
+ if (comp == NULL)
+ return;
+
+ if (comp->select != NULL)
+ xmlXPathFreeCompExpr (comp->select);
+ if (comp->nsList != NULL)
+ xmlFree(comp->nsList);
+ xmlFree(comp);
+}
+
+/**
+ * exsltFuncFunctionFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Evaluates the func:function element that defines the called function.
+ */
+static void
+exsltFuncFunctionFunction (xmlXPathParserContextPtr ctxt, int nargs) {
+ xmlXPathObjectPtr oldResult, ret;
+ exsltFuncData *data;
+ exsltFuncFunctionData *func;
+ xmlNodePtr paramNode, oldInsert, oldXPNode, fake;
+ int oldBase, newBase;
+ void *oldCtxtVar;
+ xsltStackElemPtr params = NULL, param;
+ xsltTransformContextPtr tctxt = xsltXPathGetTransformContext(ctxt);
+ int i;
+ xmlXPathObjectPtr *args = NULL;
+
+ /*
+ * retrieve func:function template
+ */
+ data = (exsltFuncData *) xsltGetExtData (tctxt,
+ EXSLT_FUNCTIONS_NAMESPACE);
+ oldResult = data->result;
+ data->result = NULL;
+
+ func = (exsltFuncFunctionData*) xmlHashLookup2 (data->funcs,
+ ctxt->context->functionURI,
+ ctxt->context->function);
+ if (func == NULL) {
+ /* Should never happen */
+ xsltGenericError(xsltGenericErrorContext,
+ "{%s}%s: not found\n",
+ ctxt->context->functionURI, ctxt->context->function);
+ ctxt->error = XPATH_UNKNOWN_FUNC_ERROR;
+ return;
+ }
+
+ /*
+ * params handling
+ */
+ if (nargs > func->nargs) {
+ xsltGenericError(xsltGenericErrorContext,
+ "{%s}%s: called with too many arguments\n",
+ ctxt->context->functionURI, ctxt->context->function);
+ ctxt->error = XPATH_INVALID_ARITY;
+ return;
+ }
+ if (func->content != NULL) {
+ paramNode = func->content->prev;
+ }
+ else
+ paramNode = NULL;
+ if ((paramNode == NULL) && (func->nargs != 0)) {
+ xsltGenericError(xsltGenericErrorContext,
+ "exsltFuncFunctionFunction: nargs != 0 and "
+ "param == NULL\n");
+ return;
+ }
+
+ /*
+ * When a function is called recursively during evaluation of its
+ * arguments, the recursion check in xsltApplySequenceConstructor
+ * isn't reached.
+ */
+ if (tctxt->depth >= tctxt->maxTemplateDepth) {
+ xsltTransformError(tctxt, NULL, NULL,
+ "exsltFuncFunctionFunction: Potentially infinite recursion "
+ "detected in function {%s}%s.\n",
+ ctxt->context->functionURI, ctxt->context->function);
+ tctxt->state = XSLT_STATE_STOPPED;
+ return;
+ }
+ tctxt->depth++;
+
+ /* Evaluating templates can change the XPath context node. */
+ oldXPNode = tctxt->xpathCtxt->node;
+
+ fake = xmlNewDocNode(tctxt->output, NULL,
+ (const xmlChar *)"fake", NULL);
+ if (fake == NULL)
+ goto error;
+ /*
+ * We have a problem with the evaluation of function parameters.
+ * The original library code did not evaluate XPath expressions until
+ * the last moment. After version 1.1.17 of the libxslt, the logic
+ * of other parts of the library was changed, and the evaluation of
+ * XPath expressions within parameters now takes place as soon as the
+ * parameter is parsed/evaluated (xsltParseStylesheetCallerParam).
+ * This means that the parameters need to be evaluated in lexical
+ * order (since a variable is "in scope" as soon as it is declared).
+ * However, on entry to this routine, the values (from the caller) are
+ * in reverse order (held on the XPath context variable stack). To
+ * accomplish what is required, I have added code to pop the XPath
+ * objects off of the stack at the beginning and save them, then use
+ * them (in the reverse order) as the params are evaluated. This
+ * requires an xmlMalloc/xmlFree for each param set by the caller,
+ * which is not very nice. There is probably a much better solution
+ * (like change other code to delay the evaluation).
+ */
+ /*
+ * In order to give the function params and variables a new 'scope'
+ * we change varsBase in the context.
+ */
+ newBase = tctxt->varsNr;
+ /* If there are any parameters */
+ if (paramNode != NULL) {
+ if (nargs > 0) {
+ args = (xmlXPathObjectPtr *) xmlMalloc(sizeof(*args) * nargs);
+ if (args == NULL)
+ goto error;
+ /* Fetch the stored argument values from the caller */
+ for (i = nargs - 1; i >= 0; i--) {
+ args[i] = valuePop(ctxt);
+ }
+ }
+
+ /*
+ * Prepare to process params in reverse order. First, go to
+ * the beginning of the param chain.
+ */
+ for (i = 1; i <= func->nargs; i++) {
+ if (paramNode->prev == NULL)
+ break;
+ paramNode = paramNode->prev;
+ }
+ /*
+ * i has total # params found, nargs is number which are present
+ * as arguments from the caller
+ * Calculate the number of un-set parameters
+ */
+ for (i = 0; i < func->nargs; i++) {
+ param = xsltParseStylesheetCallerParam (tctxt, paramNode);
+ if (param == NULL) {
+ xsltLocalVariablePop(tctxt, newBase, -2);
+ xsltFreeStackElemList(params);
+ for (; i < nargs; i++)
+ xmlXPathFreeObject(args[i]);
+ goto error;
+ }
+ if (i < nargs) { /* if parameter value set */
+ param->computed = 1;
+ if (param->value != NULL)
+ xmlXPathFreeObject(param->value);
+ param->value = args[i];
+ }
+ xsltLocalVariablePush(tctxt, param, -1);
+ param->next = params;
+ params = param;
+ paramNode = paramNode->next;
+ }
+ }
+ /*
+ * Actual processing. The context variable is cleared and restored
+ * when func:result is evaluated.
+ */
+ oldBase = tctxt->varsBase;
+ oldInsert = tctxt->insert;
+ oldCtxtVar = data->ctxtVar;
+ data->ctxtVar = tctxt->contextVariable;
+ tctxt->varsBase = newBase;
+ tctxt->insert = fake;
+ tctxt->contextVariable = NULL;
+ xsltApplyOneTemplate (tctxt, tctxt->node,
+ func->content, NULL, NULL);
+ xsltLocalVariablePop(tctxt, tctxt->varsBase, -2);
+ tctxt->insert = oldInsert;
+ tctxt->contextVariable = data->ctxtVar;
+ tctxt->varsBase = oldBase; /* restore original scope */
+ data->ctxtVar = oldCtxtVar;
+ if (params != NULL)
+ xsltFreeStackElemList(params);
+ tctxt->xpathCtxt->node = oldXPNode;
+
+ if (data->error != 0)
+ goto error;
+
+ if (data->result != NULL) {
+ ret = data->result;
+ /*
+ * IMPORTANT: This enables previously tree fragments marked as
+ * being results of a function, to be garbage-collected after
+ * the calling process exits.
+ */
+ xsltFlagRVTs(tctxt, ret, XSLT_RVT_LOCAL);
+ } else
+ ret = xmlXPathNewCString("");
+
+ data->result = oldResult;
+
+ /*
+ * It is an error if the instantiation of the template results in
+ * the generation of result nodes.
+ */
+ if (fake->children != NULL) {
+ xsltGenericError(xsltGenericErrorContext,
+ "{%s}%s: cannot write to result tree while "
+ "executing a function\n",
+ ctxt->context->functionURI, ctxt->context->function);
+ xmlXPathFreeObject(ret);
+ goto error;
+ }
+ valuePush(ctxt, ret);
+
+error:
+ xmlFree(args);
+ xmlFreeNode(fake);
+ tctxt->depth--;
+}
+
+
+static void
+exsltFuncFunctionComp (xsltStylesheetPtr style, xmlNodePtr inst) {
+ xmlChar *name, *prefix;
+ xmlNsPtr ns;
+ xmlHashTablePtr data;
+ exsltFuncFunctionData *func;
+
+ if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE))
+ return;
+
+ {
+ xmlChar *qname;
+
+ qname = xmlGetProp(inst, (const xmlChar *) "name");
+ name = xmlSplitQName2 (qname, &prefix);
+ xmlFree(qname);
+ }
+ if ((name == NULL) || (prefix == NULL)) {
+ xsltGenericError(xsltGenericErrorContext,
+ "func:function: not a QName\n");
+ if (name != NULL)
+ xmlFree(name);
+ return;
+ }
+ /* namespace lookup */
+ ns = xmlSearchNs (inst->doc, inst, prefix);
+ if (ns == NULL) {
+ xsltGenericError(xsltGenericErrorContext,
+ "func:function: undeclared prefix %s\n",
+ prefix);
+ xmlFree(name);
+ xmlFree(prefix);
+ return;
+ }
+ xmlFree(prefix);
+
+ xsltParseTemplateContent(style, inst);
+
+ /*
+ * Create function data
+ */
+ func = exsltFuncNewFunctionData();
+ if (func == NULL) {
+ xmlFree(name);
+ return;
+ }
+ func->content = inst->children;
+ while (IS_XSLT_ELEM(func->content) &&
+ IS_XSLT_NAME(func->content, "param")) {
+ func->content = func->content->next;
+ func->nargs++;
+ }
+
+ /*
+ * Register the function data such that it can be retrieved
+ * by exslFuncFunctionFunction
+ */
+#ifdef XSLT_REFACTORED
+ /*
+ * Ensure that the hash table will be stored in the *current*
+ * stylesheet level in order to correctly evaluate the
+ * import precedence.
+ */
+ data = (xmlHashTablePtr)
+ xsltStyleStylesheetLevelGetExtData(style,
+ EXSLT_FUNCTIONS_NAMESPACE);
+#else
+ data = (xmlHashTablePtr)
+ xsltStyleGetExtData (style, EXSLT_FUNCTIONS_NAMESPACE);
+#endif
+ if (data == NULL) {
+ xsltGenericError(xsltGenericErrorContext,
+ "exsltFuncFunctionComp: no stylesheet data\n");
+ xmlFree(name);
+ xmlFree(func);
+ return;
+ }
+
+ if (xmlHashAddEntry2 (data, ns->href, name, func) < 0) {
+ xsltTransformError(NULL, style, inst,
+ "Failed to register function {%s}%s\n",
+ ns->href, name);
+ style->errors++;
+ xmlFree(func);
+ } else {
+ xsltGenericDebug(xsltGenericDebugContext,
+ "exsltFuncFunctionComp: register {%s}%s\n",
+ ns->href, name);
+ }
+ xmlFree(name);
+}
+
+static xsltElemPreCompPtr
+exsltFuncResultComp (xsltStylesheetPtr style, xmlNodePtr inst,
+ xsltTransformFunction function) {
+ xmlNodePtr test;
+ xmlChar *sel;
+ exsltFuncResultPreComp *ret;
+
+ if ((style == NULL) || (inst == NULL) || (inst->type != XML_ELEMENT_NODE))
+ return (NULL);
+
+ /*
+ * "Validity" checking
+ */
+ /* it is an error to have any following sibling elements aside
+ * from the xsl:fallback element.
+ */
+ for (test = inst->next; test != NULL; test = test->next) {
+ if (test->type != XML_ELEMENT_NODE)
+ continue;
+ if (IS_XSLT_ELEM(test) && IS_XSLT_NAME(test, "fallback"))
+ continue;
+ xsltGenericError(xsltGenericErrorContext,
+ "exsltFuncResultElem: only xsl:fallback is "
+ "allowed to follow func:result\n");
+ style->errors++;
+ return (NULL);
+ }
+ /* it is an error for a func:result element to not be a descendant
+ * of func:function.
+ * it is an error if a func:result occurs within a func:result
+ * element.
+ * it is an error if instanciating the content of a variable
+ * binding element (i.e. xsl:variable, xsl:param) results in the
+ * instanciation of a func:result element.
+ */
+ for (test = inst->parent; test != NULL; test = test->parent) {
+ if (/* Traversal has reached the top-level document without
+ * finding a func:function ancestor. */
+ (test != NULL && test->type == XML_DOCUMENT_NODE) ||
+ /* Traversal reached a stylesheet-namespace node,
+ * and has left the function namespace. */
+ (IS_XSLT_ELEM(test) &&
+ IS_XSLT_NAME(test, "stylesheet"))) {
+ xsltGenericError(xsltGenericErrorContext,
+ "func:result element not a descendant "
+ "of a func:function\n");
+ style->errors++;
+ return (NULL);
+ }
+ if ((test->ns != NULL) &&
+ (xmlStrEqual(test->ns->href, EXSLT_FUNCTIONS_NAMESPACE))) {
+ if (xmlStrEqual(test->name, (const xmlChar *) "function")) {
+ break;
+ }
+ if (xmlStrEqual(test->name, (const xmlChar *) "result")) {
+ xsltGenericError(xsltGenericErrorContext,
+ "func:result element not allowed within"
+ " another func:result element\n");
+ style->errors++;
+ return (NULL);
+ }
+ }
+ if (IS_XSLT_ELEM(test) &&
+ (IS_XSLT_NAME(test, "variable") ||
+ IS_XSLT_NAME(test, "param"))) {
+ xsltGenericError(xsltGenericErrorContext,
+ "func:result element not allowed within"
+ " a variable binding element\n");
+ style->errors++;
+ return (NULL);
+ }
+ }
+
+ /*
+ * Precomputation
+ */
+ ret = (exsltFuncResultPreComp *)
+ xmlMalloc (sizeof(exsltFuncResultPreComp));
+ if (ret == NULL) {
+ xsltPrintErrorContext(NULL, NULL, NULL);
+ xsltGenericError(xsltGenericErrorContext,
+ "exsltFuncResultComp : malloc failed\n");
+ style->errors++;
+ return (NULL);
+ }
+ memset(ret, 0, sizeof(exsltFuncResultPreComp));
+
+ xsltInitElemPreComp ((xsltElemPreCompPtr) ret, style, inst, function,
+ exsltFreeFuncResultPreComp);
+ ret->select = NULL;
+
+ /*
+ * Precompute the select attribute
+ */
+ sel = xmlGetNsProp(inst, (const xmlChar *) "select", NULL);
+ if (sel != NULL) {
+ ret->select = xsltXPathCompileFlags(style, sel, 0);
+ xmlFree(sel);
+ }
+ /*
+ * Precompute the namespace list
+ */
+ ret->nsList = xmlGetNsList(inst->doc, inst);
+ if (ret->nsList != NULL) {
+ int i = 0;
+ while (ret->nsList[i] != NULL)
+ i++;
+ ret->nsNr = i;
+ }
+ return ((xsltElemPreCompPtr) ret);
+}
+
+static void
+exsltFuncResultElem (xsltTransformContextPtr ctxt,
+ xmlNodePtr node ATTRIBUTE_UNUSED, xmlNodePtr inst,
+ xsltElemPreCompPtr ecomp) {
+ exsltFuncResultPreComp *comp = (exsltFuncResultPreComp *) ecomp;
+ exsltFuncData *data;
+ xmlXPathObjectPtr ret;
+
+
+ /* It is an error if instantiating the content of the
+ * func:function element results in the instantiation of more than
+ * one func:result elements.
+ */
+ data = (exsltFuncData *) xsltGetExtData (ctxt, EXSLT_FUNCTIONS_NAMESPACE);
+ if (data == NULL) {
+ xsltGenericError(xsltGenericErrorContext,
+ "exsltFuncReturnElem: data == NULL\n");
+ return;
+ }
+ if (data->result != NULL) {
+ xsltGenericError(xsltGenericErrorContext,
+ "func:result already instanciated\n");
+ data->error = 1;
+ return;
+ }
+ /*
+ * Restore context variable, so that it will receive the function
+ * result RVTs.
+ */
+ ctxt->contextVariable = data->ctxtVar;
+ /*
+ * Processing
+ */
+ if (comp->select != NULL) {
+ xmlNsPtr *oldXPNsList;
+ int oldXPNsNr;
+ xmlNodePtr oldXPContextNode;
+ /* If the func:result element has a select attribute, then the
+ * value of the attribute must be an expression and the
+ * returned value is the object that results from evaluating
+ * the expression. In this case, the content must be empty.
+ */
+ if (inst->children != NULL) {
+ xsltGenericError(xsltGenericErrorContext,
+ "func:result content must be empty if"
+ " the function has a select attribute\n");
+ data->error = 1;
+ return;
+ }
+ oldXPNsList = ctxt->xpathCtxt->namespaces;
+ oldXPNsNr = ctxt->xpathCtxt->nsNr;
+ oldXPContextNode = ctxt->xpathCtxt->node;
+
+ ctxt->xpathCtxt->namespaces = comp->nsList;
+ ctxt->xpathCtxt->nsNr = comp->nsNr;
+ ctxt->xpathCtxt->node = ctxt->node;
+
+ ret = xmlXPathCompiledEval(comp->select, ctxt->xpathCtxt);
+
+ ctxt->xpathCtxt->node = oldXPContextNode;
+ ctxt->xpathCtxt->nsNr = oldXPNsNr;
+ ctxt->xpathCtxt->namespaces = oldXPNsList;
+
+ if (ret == NULL) {
+ xsltGenericError(xsltGenericErrorContext,
+ "exsltFuncResultElem: ret == NULL\n");
+ return;
+ }
+ /*
+ * Mark it as a function result in order to avoid garbage
+ * collecting of tree fragments before the function exits.
+ */
+ xsltFlagRVTs(ctxt, ret, XSLT_RVT_FUNC_RESULT);
+ } else if (inst->children != NULL) {
+ /* If the func:result element does not have a select attribute
+ * and has non-empty content (i.e. the func:result element has
+ * one or more child nodes), then the content of the
+ * func:result element specifies the value.
+ */
+ xmlNodePtr oldInsert;
+ xmlDocPtr container;
+
+ container = xsltCreateRVT(ctxt);
+ if (container == NULL) {
+ xsltGenericError(xsltGenericErrorContext,
+ "exsltFuncResultElem: out of memory\n");
+ data->error = 1;
+ return;
+ }
+ /* Mark as function result. */
+ xsltRegisterLocalRVT(ctxt, container);
+ container->compression = XSLT_RVT_FUNC_RESULT;
+
+ oldInsert = ctxt->insert;
+ ctxt->insert = (xmlNodePtr) container;
+ xsltApplyOneTemplate (ctxt, ctxt->node,
+ inst->children, NULL, NULL);
+ ctxt->insert = oldInsert;
+
+ ret = xmlXPathNewValueTree((xmlNodePtr) container);
+ if (ret == NULL) {
+ xsltGenericError(xsltGenericErrorContext,
+ "exsltFuncResultElem: ret == NULL\n");
+ data->error = 1;
+ } else {
+ /*
+ * This stops older libxml2 versions from freeing the nodes
+ * in the tree.
+ */
+ ret->boolval = 0;
+ }
+ } else {
+ /* If the func:result element has empty content and does not
+ * have a select attribute, then the returned value is an
+ * empty string.
+ */
+ ret = xmlXPathNewCString("");
+ }
+ data->result = ret;
+}
+
+/**
+ * exsltFuncRegister:
+ *
+ * Registers the EXSLT - Functions module
+ */
+void
+exsltFuncRegister (void) {
+ xsltRegisterExtModuleFull (EXSLT_FUNCTIONS_NAMESPACE,
+ exsltFuncInit,
+ exsltFuncShutdown,
+ exsltFuncStyleInit,
+ exsltFuncStyleShutdown);
+
+ xsltRegisterExtModuleTopLevel ((const xmlChar *) "function",
+ EXSLT_FUNCTIONS_NAMESPACE,
+ exsltFuncFunctionComp);
+ xsltRegisterExtModuleElement ((const xmlChar *) "result",
+ EXSLT_FUNCTIONS_NAMESPACE,
+ exsltFuncResultComp,
+ exsltFuncResultElem);
+}
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/libexslt/libexslt.3 chromium-145.0.7632.159/third_party/libxslt/src/libexslt/libexslt.3
--- chromium-145.0.7632.116/third_party/libxslt/src/libexslt/libexslt.3 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/libexslt/libexslt.3 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,270 @@
+.TH LIBEXSLT 3 "04 November 2003" libxslt
+.SH NAME
+libexslt \- extension library for XSLT
+.SH SYNOPSIS
+.B #include
+.sp
+.B void exsltCommonRegister(void);
+.br
+.B void exsltDateRegister(void);
+.br
+.B void exsltDynRegister(void);
+.br
+.B void exsltFuncRegister(void);
+.br
+.B void exsltMathRegister(void);
+.br
+.B void exsltSetsRegister(void);
+.br
+.B void exsltStrRegister(void);
+.br
+.B void exsltRegisterAll(void);
+.br
+.B void exsltSaxonRegister(void);
+.SH DESCRIPTION
+The
+.B libexslt
+library is used to provide extensions to
+.SM XSLT
+functions. These extensions come from the
+.SM EXSLT
+project
+.LP
+.SH USAGE
+To make use of these functions in
+.SM XSLT
+the appropriate namespace must be defined on the
+.B xsl:stylesheet
+element. To enable support for them in
+.BR libxslt (3)
+you must call the appropriate functions (listed in the
+.B SYNOPSIS
+section) to register the extensions. The
+.I xslt-config
+shell script can be used to obtain the necessary flags for
+the pre-processor and linker.
+The supported extensions are:
+.SS COMMON
+.TP 2.2i
+Namespace: http://exslt.org/common
+.TP 2.2i
+See http://www.exslt.org/exsl/index.html for a description.
+.TP 2.2i
+.B node-set()
+convert the given RTF into a node-set.
+.TP
+.B object-type()
+returns the type of the given argument.
+.TP
+.B document
+Create multiple output documents. See http://www.exslt.org/exsl/elements/document/index.html
+
+.SS MATH
+.TP 2.2i
+Namespace: http://exslt.org/math
+.TP 2.2i
+See http://www.exslt.org/math/index.html for a description.
+.TP 2.2i
+.B min()
+returns the minimum value of the given node-set
+.TP
+.B max()
+returns the maximum value of the given node-set
+.TP
+.B highest()
+returns the nodes in the node-set whose value is the maximum value for the node-set.
+.TP
+.B lowest()
+returns the nodes in the node-set whose value is the minimum value for the node-set.
+.TP
+.B constant()
+returns a number value of the given constant with the given precision. The constants are PI, E, SQRRT2, LN2, LN10, LOG2E, and SQRT1_2.
+.TP
+.B random()
+returns a random number between 0 and 1 inclusive.
+.TP
+.B abs()
+returns the absolute value of the argument.
+.TP
+.B sqrt()
+returns the square root of the argument.
+.TP
+.B power()
+returns the power base and power arguments.
+.TP
+.B log()
+returns the natural log of the argument.
+.TP
+.B sin()
+returns the sine of the argument.
+.TP
+.B cos()
+returns the cosine of the argument.
+.TP
+.B tan()
+returns the tangent of the argument.
+.TP
+.B asin()
+returns the arc sine of the argument.
+.TP
+.B acos()
+returns the arc cosine of the argument.
+.TP
+.B atan()
+returns the arc tangent of the argument.
+.TP
+.B atan2()
+returns the arc tangent function of the y/x arguments.
+.TP
+.B exp()
+returns the exponential function of the argument.
+
+.SS SETS
+.TP 2.2i
+Namespace: http://exslt.org/sets
+.TP 2.2i
+See http://www.exslt.org/set/index.html for a description.
+.TP 2.2i
+.B difference()
+returns the difference between the two given node-sets.
+.TP
+.B intersection()
+returns a node-set of the nodes within both given node-sets.
+.TP
+.B distinct()
+returns a node-set of all nodes in the first argument that are not in the seconds argument.
+.TP
+.B has-same-node()
+returns TRUE if there is an intersection between the two given node-sets.
+.TP
+.B leading()
+returns a node-set of all nodes in the first argument that precede the first node in the second argument.
+.TP
+.B trailing()
+returns a node-set of all nodes in the first argument that follow the first node in the second argument.
+
+.SS "DATES and TIMES"
+.TP 2.2i
+Namespace: http://exslt.org/dates-and-times
+.TP 2.2i
+See http://www.exslt.org/date/date.html for a description.
+.TP 2.2i
+.B date-time()
+returns the current date and time as a date/time string.
+.TP
+.B date()
+returns the date specified in the given date/time string.
+.TP
+.B time()
+returns the time specified in the date/time string given as the argument.
+.TP
+.B year()
+returns the year of a date as a number.
+.TP
+.B leap-year()
+returns true if the year given in a date is a leap year.
+.TP
+.B month-in-year()
+returns the month of a date as a number.
+.TP
+.B month-name()
+returns the full name of the month of a date.
+.TP
+.B month-abbreviation()
+returns the abbreviation of the month of a date.
+.TP
+.B week-in-year()
+returns the week of the year as a number.
+.TP
+.B week-in-month()
+returns the week in a month of a date as a number.
+.TP
+.B day-in-year()
+returns the month of a date as a number.
+.TP
+.B day-in-month()
+returns the day of a date as a number.
+.TP
+.B day-of-week-in-month()
+returns the day-of-the-week in a month of a date as a number.
+.TP
+.B day-in-week()
+returns the day of the week given in a date as a number.
+.TP
+.B day-name()
+returns the full name of the day of the week of a date.
+.TP
+.B day-abbreviation()
+returns the abbreviation of the day of the week of a date.
+.TP
+.B hour-in-day()
+returns the hour of the day as a number.
+.TP
+.B minute-in-hour()
+returns the minute of the hour as a number.
+.TP
+.B second-in-minute()
+returns the second of the minute as a number.
+.TP
+.B seconds()
+returns the number of seconds specified by the argument string.
+.TP
+.B add()
+returns the date/time resulting from adding a duration to a date/time.
+.TP
+.B add-duration()
+returns the duration resulting from adding two given durations together.
+.TP
+.B difference()
+returns the duration between the first date and the second date.
+.TP
+.B duration()
+returns a duration string that represents the given number of seconds since 1970-01-01T00:00:00.
+
+.SS STRINGS
+.TP 2.2i
+Namespace: http://exslt.org/strings
+.TP 2.2i
+See http://www.exslt.org/str/index.html for a description.
+.TP 2.2i
+.B tokenize()
+returns a node set of token elements, each containing one token from the string.
+.TP
+.B padding()
+returns a string padded to a certain length.
+.TP
+.B align()
+returns a string aligned within another string.
+.TP
+.B concat()
+returns the concatenation of the string values of the nodes in that node set.
+
+.SS FUNCTIONS
+.TP 2.2i
+Namespace: http://exslt.org/functions
+.TP 2.2i
+See http://www.exslt.org/func/index.html for a description.
+.TP 2.2i
+.B function
+declares an extension function.
+.TP
+.B result
+returns the result of an extension function declared in function().
+.SH FILES
+.TP
+.I /usr/bin/xslt-config
+shell script giving pre-processor and linker flags.
+.TP
+.I /usr/lib/libexslt.a
+static library
+.TP
+.I /usr/lib/libexslt.so
+sharable library
+.SH AUTHORS
+Manual page by Heiko W. Rupp (hwr@pilhuhn.de)
+.SH "SEE ALSO"
+.BR libxml (3),
+.BR libxslt (3),
+.BR xmllint (1)
+.BR xsltproc (1),
+.\" end of manual page
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/libexslt/libexslt.h chromium-145.0.7632.159/third_party/libxslt/src/libexslt/libexslt.h
--- chromium-145.0.7632.116/third_party/libxslt/src/libexslt/libexslt.h 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/libexslt/libexslt.h 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,35 @@
+/*
+ * libexslt.h: internal header only used during the compilation of libexslt
+ *
+ * See COPYRIGHT for the status of this software
+ *
+ * Author: daniel@veillard.com
+ */
+
+#ifndef __XSLT_LIBEXSLT_H__
+#define __XSLT_LIBEXSLT_H__
+
+#if defined(_WIN32) && !defined (__MINGW32__)
+#include
+#else
+#include "config.h"
+#endif
+
+#include
+#include
+
+#if !defined LIBEXSLT_PUBLIC
+#if (defined (__CYGWIN__) || defined _MSC_VER) && !defined IN_LIBEXSLT && !defined LIBEXSLT_STATIC
+#define LIBEXSLT_PUBLIC __declspec(dllimport)
+#else
+#define LIBEXSLT_PUBLIC
+#endif
+#endif
+
+#ifdef __GNUC__
+#define ATTRIBUTE_UNUSED __attribute__((unused))
+#else
+#define ATTRIBUTE_UNUSED
+#endif
+
+#endif /* ! __XSLT_LIBEXSLT_H__ */
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/libexslt/math.c chromium-145.0.7632.159/third_party/libxslt/src/libexslt/math.c
--- chromium-145.0.7632.116/third_party/libxslt/src/libexslt/math.c 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/libexslt/math.c 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,1173 @@
+#define IN_LIBEXSLT
+#include "libexslt/libexslt.h"
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+
+#include
+#include
+
+#include "exslt.h"
+
+/**
+ * exsltMathMin:
+ * @ns: a node-set
+ *
+ * Implements the EXSLT - Math min() function:
+ * number math:min (node-set)
+ *
+ * Returns the minimum value of the nodes passed as the argument, or
+ * NAN if @ns is NULL or empty or if one of the nodes
+ * turns into NaN.
+ */
+static double
+exsltMathMin (xmlNodeSetPtr ns) {
+ double ret, cur;
+ int i;
+
+ if ((ns == NULL) || (ns->nodeNr == 0))
+ return(NAN);
+ ret = xmlXPathCastNodeToNumber(ns->nodeTab[0]);
+ if (xmlXPathIsNaN(ret))
+ return(NAN);
+ for (i = 1; i < ns->nodeNr; i++) {
+ cur = xmlXPathCastNodeToNumber(ns->nodeTab[i]);
+ if (xmlXPathIsNaN(cur))
+ return(NAN);
+ if (cur < ret)
+ ret = cur;
+ }
+ return(ret);
+}
+
+/**
+ * exsltMathMinFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Wraps #exsltMathMin for use by the XPath processor.
+ */
+static void
+exsltMathMinFunction (xmlXPathParserContextPtr ctxt, int nargs) {
+ xmlNodeSetPtr ns;
+ double ret;
+ void *user = NULL;
+
+ if (nargs != 1) {
+ xsltGenericError(xsltGenericErrorContext,
+ "math:min: invalid number of arguments\n");
+ ctxt->error = XPATH_INVALID_ARITY;
+ return;
+ }
+ /* We need to delay the freeing of value->user */
+ if ((ctxt->value != NULL) && (ctxt->value->boolval != 0)) {
+ user = ctxt->value->user;
+ ctxt->value->boolval = 0;
+ ctxt->value->user = NULL;
+ }
+ ns = xmlXPathPopNodeSet(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ ret = exsltMathMin(ns);
+
+ xmlXPathFreeNodeSet(ns);
+ if (user != NULL)
+ xmlFreeNodeList((xmlNodePtr)user);
+
+ xmlXPathReturnNumber(ctxt, ret);
+}
+
+/**
+ * exsltMathMax:
+ * @ns: a node-set
+ *
+ * Implements the EXSLT - Math max() function:
+ * number math:max (node-set)
+ *
+ * Returns the maximum value of the nodes passed as arguments, or
+ * NAN if @ns is NULL or empty or if one of the nodes
+ * turns into NaN.
+ */
+static double
+exsltMathMax (xmlNodeSetPtr ns) {
+ double ret, cur;
+ int i;
+
+ if ((ns == NULL) || (ns->nodeNr == 0))
+ return(NAN);
+ ret = xmlXPathCastNodeToNumber(ns->nodeTab[0]);
+ if (xmlXPathIsNaN(ret))
+ return(NAN);
+ for (i = 1; i < ns->nodeNr; i++) {
+ cur = xmlXPathCastNodeToNumber(ns->nodeTab[i]);
+ if (xmlXPathIsNaN(cur))
+ return(NAN);
+ if (cur > ret)
+ ret = cur;
+ }
+ return(ret);
+}
+
+/**
+ * exsltMathMaxFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Wraps #exsltMathMax for use by the XPath processor.
+ */
+static void
+exsltMathMaxFunction (xmlXPathParserContextPtr ctxt, int nargs) {
+ xmlNodeSetPtr ns;
+ double ret;
+ void *user = NULL;
+
+ if (nargs != 1) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+
+ /* We need to delay the freeing of value->user */
+ if ((ctxt->value != NULL) && (ctxt->value->boolval != 0)) {
+ user = ctxt->value->user;
+ ctxt->value->boolval = 0;
+ ctxt->value->user = 0;
+ }
+ ns = xmlXPathPopNodeSet(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ ret = exsltMathMax(ns);
+
+ xmlXPathFreeNodeSet(ns);
+
+ if (user != NULL)
+ xmlFreeNodeList((xmlNodePtr)user);
+ xmlXPathReturnNumber(ctxt, ret);
+}
+
+/**
+ * exsltMathHighest:
+ * @ns: a node-set
+ *
+ * Implements the EXSLT - Math highest() function:
+ * node-set math:highest (node-set)
+ *
+ * Returns the nodes in the node-set whose value is the maximum value
+ * for the node-set.
+ */
+static xmlNodeSetPtr
+exsltMathHighest (xmlNodeSetPtr ns) {
+ xmlNodeSetPtr ret = xmlXPathNodeSetCreate(NULL);
+ double max, cur;
+ int i;
+
+ if ((ns == NULL) || (ns->nodeNr == 0))
+ return(ret);
+
+ max = xmlXPathCastNodeToNumber(ns->nodeTab[0]);
+ if (xmlXPathIsNaN(max))
+ return(ret);
+ else
+ xmlXPathNodeSetAddUnique(ret, ns->nodeTab[0]);
+
+ for (i = 1; i < ns->nodeNr; i++) {
+ cur = xmlXPathCastNodeToNumber(ns->nodeTab[i]);
+ if (xmlXPathIsNaN(cur)) {
+ xmlXPathEmptyNodeSet(ret);
+ return(ret);
+ }
+ if (cur < max)
+ continue;
+ if (cur > max) {
+ max = cur;
+ xmlXPathEmptyNodeSet(ret);
+ xmlXPathNodeSetAddUnique(ret, ns->nodeTab[i]);
+ continue;
+ }
+ xmlXPathNodeSetAddUnique(ret, ns->nodeTab[i]);
+ }
+ return(ret);
+}
+
+/**
+ * exsltMathHighestFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Wraps #exsltMathHighest for use by the XPath processor
+ */
+static void
+exsltMathHighestFunction (xmlXPathParserContextPtr ctxt, int nargs) {
+ xmlNodeSetPtr ns, ret;
+ void *user = NULL;
+
+ if (nargs != 1) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+
+ /* We need to delay the freeing of value->user */
+ if ((ctxt->value != NULL) && ctxt->value->boolval != 0) {
+ user = ctxt->value->user;
+ ctxt->value->boolval = 0;
+ ctxt->value->user = NULL;
+ }
+ ns = xmlXPathPopNodeSet(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ ret = exsltMathHighest(ns);
+
+ xmlXPathFreeNodeSet(ns);
+ if (user != NULL)
+ xmlFreeNodeList((xmlNodePtr)user);
+
+ xmlXPathReturnNodeSet(ctxt, ret);
+}
+
+/**
+ * exsltMathLowest:
+ * @ns: a node-set
+ *
+ * Implements the EXSLT - Math lowest() function
+ * node-set math:lowest (node-set)
+ *
+ * Returns the nodes in the node-set whose value is the minimum value
+ * for the node-set.
+ */
+static xmlNodeSetPtr
+exsltMathLowest (xmlNodeSetPtr ns) {
+ xmlNodeSetPtr ret = xmlXPathNodeSetCreate(NULL);
+ double min, cur;
+ int i;
+
+ if ((ns == NULL) || (ns->nodeNr == 0))
+ return(ret);
+
+ min = xmlXPathCastNodeToNumber(ns->nodeTab[0]);
+ if (xmlXPathIsNaN(min))
+ return(ret);
+ else
+ xmlXPathNodeSetAddUnique(ret, ns->nodeTab[0]);
+
+ for (i = 1; i < ns->nodeNr; i++) {
+ cur = xmlXPathCastNodeToNumber(ns->nodeTab[i]);
+ if (xmlXPathIsNaN(cur)) {
+ xmlXPathEmptyNodeSet(ret);
+ return(ret);
+ }
+ if (cur > min)
+ continue;
+ if (cur < min) {
+ min = cur;
+ xmlXPathEmptyNodeSet(ret);
+ xmlXPathNodeSetAddUnique(ret, ns->nodeTab[i]);
+ continue;
+ }
+ xmlXPathNodeSetAddUnique(ret, ns->nodeTab[i]);
+ }
+ return(ret);
+}
+
+/**
+ * exsltMathLowestFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Wraps #exsltMathLowest for use by the XPath processor
+ */
+static void
+exsltMathLowestFunction (xmlXPathParserContextPtr ctxt, int nargs) {
+ xmlNodeSetPtr ns, ret;
+ void *user = NULL;
+
+
+ if (nargs != 1) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+
+ /* We need to delay the freeing of value->user */
+ if ((ctxt->value != NULL) && (ctxt->value->boolval != 0)) {
+ user = ctxt->value->user;
+ ctxt->value->boolval = 0;
+ ctxt->value->user = NULL;
+ }
+ ns = xmlXPathPopNodeSet(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ ret = exsltMathLowest(ns);
+
+ xmlXPathFreeNodeSet(ns);
+ if (user != NULL)
+ xmlFreeNodeList((xmlNodePtr)user);
+
+ xmlXPathReturnNodeSet(ctxt, ret);
+}
+
+/* math other functions */
+
+/* constant values */
+#define EXSLT_PI (const xmlChar *) \
+ "3.1415926535897932384626433832795028841971693993751"
+#define EXSLT_E (const xmlChar *) \
+ "2.71828182845904523536028747135266249775724709369996"
+#define EXSLT_SQRRT2 (const xmlChar *) \
+ "1.41421356237309504880168872420969807856967187537694"
+#define EXSLT_LN2 (const xmlChar *) \
+ "0.69314718055994530941723212145817656807550013436025"
+#define EXSLT_LN10 (const xmlChar *) \
+ "2.30258509299404568402"
+#define EXSLT_LOG2E (const xmlChar *) \
+ "1.4426950408889634074"
+#define EXSLT_SQRT1_2 (const xmlChar *) \
+ "0.70710678118654752440"
+
+/**
+ * exsltMathConstant
+ * @name: string
+ * @precision: number
+ *
+ * Implements the EXSLT - Math constant function:
+ * number math:constant(string, number)
+ *
+ * Returns a number value of the given constant with the given precision or
+ * NAN if name is unknown.
+ * The constants are PI, E, SQRRT2, LN2, LN10, LOG2E, and SQRT1_2
+ */
+static double
+exsltMathConstant (xmlChar *name, double precision) {
+ xmlChar *str;
+ double ret;
+
+ if ((name == NULL) || (xmlXPathIsNaN(precision)) || (precision < 1.0)) {
+ return NAN;
+ }
+
+ if (xmlStrEqual(name, BAD_CAST "PI")) {
+ int len = xmlStrlen(EXSLT_PI);
+
+ if (precision <= len)
+ len = (int)precision;
+
+ str = xmlStrsub(EXSLT_PI, 0, len);
+
+ } else if (xmlStrEqual(name, BAD_CAST "E")) {
+ int len = xmlStrlen(EXSLT_E);
+
+ if (precision <= len)
+ len = (int)precision;
+
+ str = xmlStrsub(EXSLT_E, 0, len);
+
+ } else if (xmlStrEqual(name, BAD_CAST "SQRRT2")) {
+ int len = xmlStrlen(EXSLT_SQRRT2);
+
+ if (precision <= len)
+ len = (int)precision;
+
+ str = xmlStrsub(EXSLT_SQRRT2, 0, len);
+
+ } else if (xmlStrEqual(name, BAD_CAST "LN2")) {
+ int len = xmlStrlen(EXSLT_LN2);
+
+ if (precision <= len)
+ len = (int)precision;
+
+ str = xmlStrsub(EXSLT_LN2, 0, len);
+
+ } else if (xmlStrEqual(name, BAD_CAST "LN10")) {
+ int len = xmlStrlen(EXSLT_LN10);
+
+ if (precision <= len)
+ len = (int)precision;
+
+ str = xmlStrsub(EXSLT_LN10, 0, len);
+
+ } else if (xmlStrEqual(name, BAD_CAST "LOG2E")) {
+ int len = xmlStrlen(EXSLT_LOG2E);
+
+ if (precision <= len)
+ len = (int)precision;
+
+ str = xmlStrsub(EXSLT_LOG2E, 0, len);
+
+ } else if (xmlStrEqual(name, BAD_CAST "SQRT1_2")) {
+ int len = xmlStrlen(EXSLT_SQRT1_2);
+
+ if (precision <= len)
+ len = (int)precision;
+
+ str = xmlStrsub(EXSLT_SQRT1_2, 0, len);
+
+ } else {
+ str = NULL;
+ }
+ if (str == NULL)
+ return NAN;
+ ret = xmlXPathCastStringToNumber(str);
+ xmlFree(str);
+ return ret;
+}
+
+/**
+ * exsltMathConstantFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Wraps #exsltMathConstant for use by the XPath processor.
+ */
+static void
+exsltMathConstantFunction (xmlXPathParserContextPtr ctxt, int nargs) {
+ double ret;
+ xmlChar *name;
+
+ if (nargs != 2) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+ ret = xmlXPathPopNumber(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ name = xmlXPathPopString(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ ret = exsltMathConstant(name, ret);
+ if (name != NULL)
+ xmlFree(name);
+
+ xmlXPathReturnNumber(ctxt, ret);
+}
+
+/**
+ * exsltMathRandom:
+ *
+ * Implements the EXSLT - Math random() function:
+ * number math:random ()
+ *
+ * Returns a random number between 0 and 1 inclusive.
+ */
+static double
+exsltMathRandom (void) {
+ double ret;
+ int num;
+
+ num = rand();
+ ret = (double)num / (double)RAND_MAX;
+ return(ret);
+}
+
+/**
+ * exsltMathRandomFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Wraps #exsltMathRandom for use by the XPath processor.
+ */
+static void
+exsltMathRandomFunction (xmlXPathParserContextPtr ctxt, int nargs) {
+ double ret;
+
+ if (nargs != 0) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+
+ ret = exsltMathRandom();
+
+ xmlXPathReturnNumber(ctxt, ret);
+}
+
+/**
+ * exsltMathAbs:
+ * @num: a double
+ *
+ * Implements the EXSLT - Math abs() function:
+ * number math:abs (number)
+ *
+ * Returns the absolute value of the argument, or NAN if @num is Nan.
+ */
+static double
+exsltMathAbs (double num) {
+ double ret;
+
+ if (xmlXPathIsNaN(num))
+ return(NAN);
+ ret = fabs(num);
+ return(ret);
+}
+
+/**
+ * exsltMathAbsFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Wraps #exsltMathAbs for use by the XPath processor.
+ */
+static void
+exsltMathAbsFunction (xmlXPathParserContextPtr ctxt, int nargs) {
+ double ret;
+
+ if (nargs != 1) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+ ret = xmlXPathPopNumber(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ ret = exsltMathAbs(ret);
+
+ xmlXPathReturnNumber(ctxt, ret);
+}
+
+/**
+ * exsltMathSqrt:
+ * @num: a double
+ *
+ * Implements the EXSLT - Math sqrt() function:
+ * number math:sqrt (number)
+ *
+ * Returns the square root of the argument, or NAN if @num is Nan.
+ */
+static double
+exsltMathSqrt (double num) {
+ double ret;
+
+ if (xmlXPathIsNaN(num))
+ return(NAN);
+ ret = sqrt(num);
+ return(ret);
+}
+
+/**
+ * exsltMathSqrtFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Wraps #exsltMathSqrt for use by the XPath processor.
+ */
+static void
+exsltMathSqrtFunction (xmlXPathParserContextPtr ctxt, int nargs) {
+ double ret;
+
+ if (nargs != 1) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+ ret = xmlXPathPopNumber(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ ret = exsltMathSqrt(ret);
+
+ xmlXPathReturnNumber(ctxt, ret);
+}
+
+/**
+ * exsltMathPower:
+ * @base: a double
+ * @power: a double
+ *
+ * Implements the EXSLT - Math power() function:
+ * number math:power (number, number)
+ *
+ * Returns the power base and power arguments, or NAN
+ * if either @base or @power is Nan.
+ */
+static double
+exsltMathPower (double base, double power) {
+ double ret;
+
+ if ((xmlXPathIsNaN(base) || xmlXPathIsNaN(power)))
+ return(NAN);
+ ret = pow(base, power);
+ return(ret);
+}
+
+/**
+ * exsltMathPower:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Wraps #exsltMathPower for use by the XPath processor.
+ */
+static void
+exsltMathPowerFunction (xmlXPathParserContextPtr ctxt, int nargs) {
+ double ret, base;
+
+ if (nargs != 2) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+ ret = xmlXPathPopNumber(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ /* power */
+ base = xmlXPathPopNumber(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ ret = exsltMathPower(base, ret);
+
+ xmlXPathReturnNumber(ctxt, ret);
+}
+
+/**
+ * exsltMathLog:
+ * @num: a double
+ *
+ * Implements the EXSLT - Math log() function:
+ * number math:log (number)
+ *
+ * Returns the natural log of the argument, or NAN if @num is Nan.
+ */
+static double
+exsltMathLog (double num) {
+ double ret;
+
+ if (xmlXPathIsNaN(num))
+ return(NAN);
+ ret = log(num);
+ return(ret);
+}
+
+/**
+ * exsltMathLogFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Wraps #exsltMathLog for use by the XPath processor.
+ */
+static void
+exsltMathLogFunction (xmlXPathParserContextPtr ctxt, int nargs) {
+ double ret;
+
+ if (nargs != 1) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+ ret = xmlXPathPopNumber(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ ret = exsltMathLog(ret);
+
+ xmlXPathReturnNumber(ctxt, ret);
+}
+
+/**
+ * exsltMathSin:
+ * @num: a double
+ *
+ * Implements the EXSLT - Math sin() function:
+ * number math:sin (number)
+ *
+ * Returns the sine of the argument, or NAN if @num is Nan.
+ */
+static double
+exsltMathSin (double num) {
+ double ret;
+
+ if (xmlXPathIsNaN(num))
+ return(NAN);
+ ret = sin(num);
+ return(ret);
+}
+
+/**
+ * exsltMathSinFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Wraps #exsltMathSin for use by the XPath processor.
+ */
+static void
+exsltMathSinFunction (xmlXPathParserContextPtr ctxt, int nargs) {
+ double ret;
+
+ if (nargs != 1) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+ ret = xmlXPathPopNumber(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ ret = exsltMathSin(ret);
+
+ xmlXPathReturnNumber(ctxt, ret);
+}
+
+/**
+ * exsltMathCos:
+ * @num: a double
+ *
+ * Implements the EXSLT - Math cos() function:
+ * number math:cos (number)
+ *
+ * Returns the cosine of the argument, or NAN if @num is Nan.
+ */
+static double
+exsltMathCos (double num) {
+ double ret;
+
+ if (xmlXPathIsNaN(num))
+ return(NAN);
+ ret = cos(num);
+ return(ret);
+}
+
+/**
+ * exsltMathCosFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Wraps #exsltMathCos for use by the XPath processor.
+ */
+static void
+exsltMathCosFunction (xmlXPathParserContextPtr ctxt, int nargs) {
+ double ret;
+
+ if (nargs != 1) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+ ret = xmlXPathPopNumber(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ ret = exsltMathCos(ret);
+
+ xmlXPathReturnNumber(ctxt, ret);
+}
+
+/**
+ * exsltMathTan:
+ * @num: a double
+ *
+ * Implements the EXSLT - Math tan() function:
+ * number math:tan (number)
+ *
+ * Returns the tangent of the argument, or NAN if @num is Nan.
+ */
+static double
+exsltMathTan (double num) {
+ double ret;
+
+ if (xmlXPathIsNaN(num))
+ return(NAN);
+ ret = tan(num);
+ return(ret);
+}
+
+/**
+ * exsltMathTanFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Wraps #exsltMathTan for use by the XPath processor.
+ */
+static void
+exsltMathTanFunction (xmlXPathParserContextPtr ctxt, int nargs) {
+ double ret;
+
+ if (nargs != 1) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+ ret = xmlXPathPopNumber(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ ret = exsltMathTan(ret);
+
+ xmlXPathReturnNumber(ctxt, ret);
+}
+
+/**
+ * exsltMathAsin:
+ * @num: a double
+ *
+ * Implements the EXSLT - Math asin() function:
+ * number math:asin (number)
+ *
+ * Returns the arc sine of the argument, or NAN if @num is Nan.
+ */
+static double
+exsltMathAsin (double num) {
+ double ret;
+
+ if (xmlXPathIsNaN(num))
+ return(NAN);
+ ret = asin(num);
+ return(ret);
+}
+
+/**
+ * exsltMathAsinFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Wraps #exsltMathAsin for use by the XPath processor.
+ */
+static void
+exsltMathAsinFunction (xmlXPathParserContextPtr ctxt, int nargs) {
+ double ret;
+
+ if (nargs != 1) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+ ret = xmlXPathPopNumber(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ ret = exsltMathAsin(ret);
+
+ xmlXPathReturnNumber(ctxt, ret);
+}
+
+/**
+ * exsltMathAcos:
+ * @num: a double
+ *
+ * Implements the EXSLT - Math acos() function:
+ * number math:acos (number)
+ *
+ * Returns the arc cosine of the argument, or NAN if @num is Nan.
+ */
+static double
+exsltMathAcos (double num) {
+ double ret;
+
+ if (xmlXPathIsNaN(num))
+ return(NAN);
+ ret = acos(num);
+ return(ret);
+}
+
+/**
+ * exsltMathAcosFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Wraps #exsltMathAcos for use by the XPath processor.
+ */
+static void
+exsltMathAcosFunction (xmlXPathParserContextPtr ctxt, int nargs) {
+ double ret;
+
+ if (nargs != 1) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+ ret = xmlXPathPopNumber(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ ret = exsltMathAcos(ret);
+
+ xmlXPathReturnNumber(ctxt, ret);
+}
+
+/**
+ * exsltMathAtan:
+ * @num: a double
+ *
+ * Implements the EXSLT - Math atan() function:
+ * number math:atan (number)
+ *
+ * Returns the arc tangent of the argument, or NAN if @num is Nan.
+ */
+static double
+exsltMathAtan (double num) {
+ double ret;
+
+ if (xmlXPathIsNaN(num))
+ return(NAN);
+ ret = atan(num);
+ return(ret);
+}
+
+/**
+ * exsltMathAtanFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Wraps #exsltMathAtan for use by the XPath processor.
+ */
+static void
+exsltMathAtanFunction (xmlXPathParserContextPtr ctxt, int nargs) {
+ double ret;
+
+ if (nargs != 1) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+ ret = xmlXPathPopNumber(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ ret = exsltMathAtan(ret);
+
+ xmlXPathReturnNumber(ctxt, ret);
+}
+
+/**
+ * exsltMathAtan2:
+ * @y: a double
+ * @x: a double
+ *
+ * Implements the EXSLT - Math atan2() function:
+ * number math:atan2 (number, number)
+ *
+ * Returns the arc tangent function of the y/x arguments, or NAN
+ * if either @y or @x is Nan.
+ */
+static double
+exsltMathAtan2 (double y, double x) {
+ double ret;
+
+ if ((xmlXPathIsNaN(y) || xmlXPathIsNaN(x)))
+ return(NAN);
+ ret = atan2(y, x);
+ return(ret);
+}
+
+/**
+ * exsltMathAtan2Function:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Wraps #exsltMathAtan2 for use by the XPath processor.
+ */
+static void
+exsltMathAtan2Function (xmlXPathParserContextPtr ctxt, int nargs) {
+ double ret, x;
+
+ if (nargs != 2) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+ x = xmlXPathPopNumber(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ /* y */
+ ret = xmlXPathPopNumber(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ ret = exsltMathAtan2(ret, x);
+
+ xmlXPathReturnNumber(ctxt, ret);
+}
+
+/**
+ * exsltMathExp:
+ * @num: a double
+ *
+ * Implements the EXSLT - Math exp() function:
+ * number math:exp (number)
+ *
+ * Returns the exponential function of the argument, or NAN if
+ * @num is Nan.
+ */
+static double
+exsltMathExp (double num) {
+ double ret;
+
+ if (xmlXPathIsNaN(num))
+ return(NAN);
+ ret = exp(num);
+ return(ret);
+}
+
+/**
+ * exsltMathExpFunction:
+ * @ctxt: an XPath parser context
+ * @nargs: the number of arguments
+ *
+ * Wraps #exsltMathExp for use by the XPath processor.
+ */
+static void
+exsltMathExpFunction (xmlXPathParserContextPtr ctxt, int nargs) {
+ double ret;
+
+ if (nargs != 1) {
+ xmlXPathSetArityError(ctxt);
+ return;
+ }
+ ret = xmlXPathPopNumber(ctxt);
+ if (xmlXPathCheckError(ctxt))
+ return;
+
+ ret = exsltMathExp(ret);
+
+ xmlXPathReturnNumber(ctxt, ret);
+}
+
+/**
+ * exsltMathRegister:
+ *
+ * Registers the EXSLT - Math module
+ */
+
+void
+exsltMathRegister (void) {
+ xsltRegisterExtModuleFunction ((const xmlChar *) "min",
+ EXSLT_MATH_NAMESPACE,
+ exsltMathMinFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "max",
+ EXSLT_MATH_NAMESPACE,
+ exsltMathMaxFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "highest",
+ EXSLT_MATH_NAMESPACE,
+ exsltMathHighestFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "lowest",
+ EXSLT_MATH_NAMESPACE,
+ exsltMathLowestFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "constant",
+ EXSLT_MATH_NAMESPACE,
+ exsltMathConstantFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "random",
+ EXSLT_MATH_NAMESPACE,
+ exsltMathRandomFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "abs",
+ EXSLT_MATH_NAMESPACE,
+ exsltMathAbsFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "sqrt",
+ EXSLT_MATH_NAMESPACE,
+ exsltMathSqrtFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "power",
+ EXSLT_MATH_NAMESPACE,
+ exsltMathPowerFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "log",
+ EXSLT_MATH_NAMESPACE,
+ exsltMathLogFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "sin",
+ EXSLT_MATH_NAMESPACE,
+ exsltMathSinFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "cos",
+ EXSLT_MATH_NAMESPACE,
+ exsltMathCosFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "tan",
+ EXSLT_MATH_NAMESPACE,
+ exsltMathTanFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "asin",
+ EXSLT_MATH_NAMESPACE,
+ exsltMathAsinFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "acos",
+ EXSLT_MATH_NAMESPACE,
+ exsltMathAcosFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "atan",
+ EXSLT_MATH_NAMESPACE,
+ exsltMathAtanFunction);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "atan2",
+ EXSLT_MATH_NAMESPACE,
+ exsltMathAtan2Function);
+ xsltRegisterExtModuleFunction ((const xmlChar *) "exp",
+ EXSLT_MATH_NAMESPACE,
+ exsltMathExpFunction);
+}
+
+/**
+ * exsltMathXpathCtxtRegister:
+ *
+ * Registers the EXSLT - Math module for use outside XSLT
+ */
+int
+exsltMathXpathCtxtRegister (xmlXPathContextPtr ctxt, const xmlChar *prefix)
+{
+ if (ctxt
+ && prefix
+ && !xmlXPathRegisterNs(ctxt,
+ prefix,
+ (const xmlChar *) EXSLT_MATH_NAMESPACE)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "min",
+ (const xmlChar *) EXSLT_MATH_NAMESPACE,
+ exsltMathMinFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "max",
+ (const xmlChar *) EXSLT_MATH_NAMESPACE,
+ exsltMathMaxFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "highest",
+ (const xmlChar *) EXSLT_MATH_NAMESPACE,
+ exsltMathHighestFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "lowest",
+ (const xmlChar *) EXSLT_MATH_NAMESPACE,
+ exsltMathLowestFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "random",
+ (const xmlChar *) EXSLT_MATH_NAMESPACE,
+ exsltMathRandomFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "abs",
+ (const xmlChar *) EXSLT_MATH_NAMESPACE,
+ exsltMathAbsFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "sqrt",
+ (const xmlChar *) EXSLT_MATH_NAMESPACE,
+ exsltMathSqrtFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "power",
+ (const xmlChar *) EXSLT_MATH_NAMESPACE,
+ exsltMathPowerFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "log",
+ (const xmlChar *) EXSLT_MATH_NAMESPACE,
+ exsltMathLogFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "sin",
+ (const xmlChar *) EXSLT_MATH_NAMESPACE,
+ exsltMathSinFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "cos",
+ (const xmlChar *) EXSLT_MATH_NAMESPACE,
+ exsltMathCosFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "tan",
+ (const xmlChar *) EXSLT_MATH_NAMESPACE,
+ exsltMathTanFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "asin",
+ (const xmlChar *) EXSLT_MATH_NAMESPACE,
+ exsltMathAsinFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "acos",
+ (const xmlChar *) EXSLT_MATH_NAMESPACE,
+ exsltMathAcosFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "atan",
+ (const xmlChar *) EXSLT_MATH_NAMESPACE,
+ exsltMathAtanFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "atan2",
+ (const xmlChar *) EXSLT_MATH_NAMESPACE,
+ exsltMathAtan2Function)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "exp",
+ (const xmlChar *) EXSLT_MATH_NAMESPACE,
+ exsltMathExpFunction)
+ && !xmlXPathRegisterFuncNS(ctxt,
+ (const xmlChar *) "constant",
+ (const xmlChar *) EXSLT_MATH_NAMESPACE,
+ exsltMathConstantFunction)) {
+ return 0;
+ }
+ return -1;
+}
diff -Nru chromium-145.0.7632.116/third_party/libxslt/src/libexslt/saxon.c chromium-145.0.7632.159/third_party/libxslt/src/libexslt/saxon.c
--- chromium-145.0.7632.116/third_party/libxslt/src/libexslt/saxon.c 1970-01-01 00:00:00.000000000 +0000
+++ chromium-145.0.7632.159/third_party/libxslt/src/libexslt/saxon.c 2026-03-02 23:00:09.000000000 +0000
@@ -0,0 +1,318 @@
+#define IN_LIBEXSLT
+#include "libexslt/libexslt.h"
+
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include