Version in base suite: 140.4.0esr-1~deb13u1 Version in overlay suite: 140.5.0esr-1~deb13u1 Base version: firefox-esr_140.5.0esr-1~deb13u1 Target version: firefox-esr_140.6.0esr-1~deb13u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/f/firefox-esr/firefox-esr_140.5.0esr-1~deb13u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/f/firefox-esr/firefox-esr_140.6.0esr-1~deb13u1.dsc /srv/release.debian.org/tmp/fArLLQpgL0/firefox-esr-140.6.0esr/third_party/zucchini/tests/gtest/testdata/chrome64_1.exe |binary /srv/release.debian.org/tmp/fArLLQpgL0/firefox-esr-140.6.0esr/third_party/zucchini/tests/gtest/testdata/chrome64_2.exe |binary /srv/release.debian.org/tmp/fArLLQpgL0/firefox-esr-140.6.0esr/third_party/zucchini/tests/gtest/testdata/setup1.exe |binary /srv/release.debian.org/tmp/fArLLQpgL0/firefox-esr-140.6.0esr/third_party/zucchini/tests/gtest/testdata/setup2.exe |binary /srv/release.debian.org/tmp/fArLLQpgL0/firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/data/partial_zucchini.mar |binary /srv/release.debian.org/tmp/fArLLQpgL0/firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/data/partial_zucchini_mac.mar |binary firefox-esr-140.6.0esr/CLOBBER | 2 firefox-esr-140.6.0esr/browser/components/aboutlogins/content/components/login-item.mjs | 14 firefox-esr-140.6.0esr/browser/components/enterprisepolicies/tests/browser/browser_policy_disable_password_reveal.js | 35 firefox-esr-140.6.0esr/browser/components/firefoxview/history.mjs | 3 firefox-esr-140.6.0esr/browser/components/resistfingerprinting/test/browser/browser_bug1975753_site_specific_zoom_level.js | 33 firefox-esr-140.6.0esr/browser/components/sidebar/sidebar-history.mjs | 5 firefox-esr-140.6.0esr/browser/components/sidebar/sidebar-syncedtabs.mjs | 6 firefox-esr-140.6.0esr/browser/components/urlbar/private/AddonSuggestions.sys.mjs | 7 firefox-esr-140.6.0esr/browser/components/urlbar/tests/quicksuggest/QuickSuggestTestUtils.sys.mjs | 6 firefox-esr-140.6.0esr/browser/components/urlbar/tests/quicksuggest/unit/head.js | 56 firefox-esr-140.6.0esr/browser/config/mozconfigs/win32/mingwclang | 1 firefox-esr-140.6.0esr/browser/config/mozconfigs/win64/mingwclang | 1 firefox-esr-140.6.0esr/browser/config/version.txt | 2 firefox-esr-140.6.0esr/browser/config/version_display.txt | 2 firefox-esr-140.6.0esr/browser/extensions/webcompat/data/interventions.json | 32 firefox-esr-140.6.0esr/browser/extensions/webcompat/injections/js/bug1950282-f1tv.formula1.com-unblock-firefox.js | 122 firefox-esr-140.6.0esr/browser/extensions/webcompat/manifest.json | 2 firefox-esr-140.6.0esr/browser/locales/en-US/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/browser/locales/l10n-changesets.json | 206 firefox-esr-140.6.0esr/browser/modules/PermissionUI.sys.mjs | 20 firefox-esr-140.6.0esr/build/moz.configure/update-programs.configure | 43 firefox-esr-140.6.0esr/config/milestone.txt | 2 firefox-esr-140.6.0esr/debian/changelog | 10 firefox-esr-140.6.0esr/devtools/client/netmonitor/test/browser_net_curl-utils.js | 15 firefox-esr-140.6.0esr/devtools/client/shared/curl.js | 12 firefox-esr-140.6.0esr/dom/base/test/jsmodules/importmaps/chrome.toml | 7 firefox-esr-140.6.0esr/dom/base/test/jsmodules/importmaps/module_1979050.mjs | 3 firefox-esr-140.6.0esr/dom/base/test/jsmodules/importmaps/scope1/module_1979050.mjs | 5 firefox-esr-140.6.0esr/dom/base/test/jsmodules/importmaps/scope1/scope2/module_1979050.mjs | 5 firefox-esr-140.6.0esr/dom/base/test/jsmodules/importmaps/test_1979050.html | 50 firefox-esr-140.6.0esr/dom/base/test/jsmodules/importmaps/test_1979050_2.html | 69 firefox-esr-140.6.0esr/dom/canvas/TexUnpackBlob.cpp | 12 firefox-esr-140.6.0esr/dom/media/tools/generateGmpJson.py | 2 firefox-esr-140.6.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp | 42 firefox-esr-140.6.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h | 2 firefox-esr-140.6.0esr/dom/permission/PermissionStatusSink.cpp | 42 firefox-esr-140.6.0esr/dom/permission/PermissionStatusSink.h | 4 firefox-esr-140.6.0esr/dom/webtransport/api/WebTransport.cpp | 3 firefox-esr-140.6.0esr/editor/libeditor/EditorBase.cpp | 9 firefox-esr-140.6.0esr/editor/libeditor/EditorBase.h | 54 firefox-esr-140.6.0esr/editor/libeditor/HTMLEditor.cpp | 1 firefox-esr-140.6.0esr/editor/libeditor/TextEditor.cpp | 4 firefox-esr-140.6.0esr/image/imgLoader.cpp | 14 firefox-esr-140.6.0esr/js/loader/ImportMap.cpp | 31 firefox-esr-140.6.0esr/js/src/jit-test/tests/bigint/loosely-equal.js | 18 firefox-esr-140.6.0esr/js/src/jit/CacheIR.cpp | 16 firefox-esr-140.6.0esr/js/src/jit/riscv64/MacroAssembler-riscv64.h | 4 firefox-esr-140.6.0esr/js/src/jit/shared/IonAssemblerBufferWithConstantPools.h | 6 firefox-esr-140.6.0esr/js/src/vm/BigIntType.cpp | 36 firefox-esr-140.6.0esr/js/src/vm/BigIntType.h | 2 firefox-esr-140.6.0esr/js/src/vm/EqualityOperations.cpp | 101 firefox-esr-140.6.0esr/l10n-ach/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-ach/browser/browser/preferences/formAutofill.ftl | 17 firefox-esr-140.6.0esr/l10n-ach/browser/browser/preferences/preferences.ftl | 36 firefox-esr-140.6.0esr/l10n-ach/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-ach/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-ach/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-af/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-af/browser/browser/preferences/preferences.ftl | 32 firefox-esr-140.6.0esr/l10n-af/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-an/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-an/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-an/browser/browser/preferences/preferences.ftl | 38 firefox-esr-140.6.0esr/l10n-an/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-an/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-an/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-ar/browser/browser/browser.ftl | 40 firefox-esr-140.6.0esr/l10n-ar/browser/browser/contextual-manager.ftl | 2 firefox-esr-140.6.0esr/l10n-ar/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-ar/browser/browser/newtab/asrouter.ftl | 19 firefox-esr-140.6.0esr/l10n-ar/browser/browser/newtab/newtab.ftl | 41 firefox-esr-140.6.0esr/l10n-ar/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-ar/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-ar/browser/browser/preferences/preferences.ftl | 71 firefox-esr-140.6.0esr/l10n-ar/browser/browser/profiles.ftl | 2 firefox-esr-140.6.0esr/l10n-ar/browser/browser/sidebar.ftl | 51 firefox-esr-140.6.0esr/l10n-ar/browser/browser/tabbrowser.ftl | 4 firefox-esr-140.6.0esr/l10n-ar/browser/browser/webauthnDialog.ftl | 39 firefox-esr-140.6.0esr/l10n-ar/browser/chrome/browser/browser.properties | 2 firefox-esr-140.6.0esr/l10n-ar/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-ar/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-ar/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-ar/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-ar/toolkit/toolkit/neterror/certError.ftl | 1 firefox-esr-140.6.0esr/l10n-ast/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-ast/browser/browser/preferences/formAutofill.ftl | 31 firefox-esr-140.6.0esr/l10n-ast/browser/browser/preferences/preferences.ftl | 37 firefox-esr-140.6.0esr/l10n-ast/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-ast/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-ast/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-az/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-az/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-az/browser/browser/preferences/preferences.ftl | 34 firefox-esr-140.6.0esr/l10n-az/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-az/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-az/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-be/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-be/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-be/browser/browser/backupSettings.ftl | 252 firefox-esr-140.6.0esr/l10n-be/browser/browser/browser.ftl | 51 firefox-esr-140.6.0esr/l10n-be/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-be/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-be/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-be/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-be/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-be/browser/browser/genai.ftl | 6 firefox-esr-140.6.0esr/l10n-be/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-be/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-be/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-be/browser/browser/newtab/newtab.ftl | 25 firefox-esr-140.6.0esr/l10n-be/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-be/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-be/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-be/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-be/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-be/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-be/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-be/browser/browser/preferences/permissions.ftl | 13 firefox-esr-140.6.0esr/l10n-be/browser/browser/preferences/preferences.ftl | 205 firefox-esr-140.6.0esr/l10n-be/browser/browser/profiles.ftl | 116 firefox-esr-140.6.0esr/l10n-be/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-be/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-be/browser/browser/tabContextMenu.ftl | 4 firefox-esr-140.6.0esr/l10n-be/browser/browser/tabbrowser.ftl | 31 firefox-esr-140.6.0esr/l10n-be/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-be/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-be/browser/browser/unifiedExtensions.ftl | 33 firefox-esr-140.6.0esr/l10n-be/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-be/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-be/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-be/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-be/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-be/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-be/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-be/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-be/dom/chrome/dom/dom.properties | 11 firefox-esr-140.6.0esr/l10n-be/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-be/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/about/aboutAddons.ftl | 14 firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/about/aboutGlean.ftl | 38 firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/pdfviewer/viewer.ftl | 54 firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-bg/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-bg/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-bg/browser/browser/backupSettings.ftl | 68 firefox-esr-140.6.0esr/l10n-bg/browser/browser/browser.ftl | 99 firefox-esr-140.6.0esr/l10n-bg/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-bg/browser/browser/contextual-manager.ftl | 33 firefox-esr-140.6.0esr/l10n-bg/browser/browser/featureCallout.ftl | 6 firefox-esr-140.6.0esr/l10n-bg/browser/browser/firefoxRelay.ftl | 1 firefox-esr-140.6.0esr/l10n-bg/browser/browser/genai.ftl | 49 firefox-esr-140.6.0esr/l10n-bg/browser/browser/menubar.ftl | 7 firefox-esr-140.6.0esr/l10n-bg/browser/browser/newtab/asrouter.ftl | 10 firefox-esr-140.6.0esr/l10n-bg/browser/browser/newtab/newtab.ftl | 48 firefox-esr-140.6.0esr/l10n-bg/browser/browser/pageInfo.ftl | 2 firefox-esr-140.6.0esr/l10n-bg/browser/browser/policies/policies-descriptions.ftl | 3 firefox-esr-140.6.0esr/l10n-bg/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-bg/browser/browser/preferences/formAutofill.ftl | 55 firefox-esr-140.6.0esr/l10n-bg/browser/browser/preferences/fxaPairDevice.ftl | 7 firefox-esr-140.6.0esr/l10n-bg/browser/browser/preferences/preferences.ftl | 62 firefox-esr-140.6.0esr/l10n-bg/browser/browser/profiles.ftl | 12 firefox-esr-140.6.0esr/l10n-bg/browser/browser/screenshots.ftl | 12 firefox-esr-140.6.0esr/l10n-bg/browser/browser/sidebar.ftl | 73 firefox-esr-140.6.0esr/l10n-bg/browser/browser/tabContextMenu.ftl | 8 firefox-esr-140.6.0esr/l10n-bg/browser/browser/tabbrowser.ftl | 52 firefox-esr-140.6.0esr/l10n-bg/browser/browser/taskbartabs.ftl | 11 firefox-esr-140.6.0esr/l10n-bg/browser/browser/unexpectedScript.ftl | 5 firefox-esr-140.6.0esr/l10n-bg/browser/browser/webauthnDialog.ftl | 37 firefox-esr-140.6.0esr/l10n-bg/devtools/client/accessibility.ftl | 3 firefox-esr-140.6.0esr/l10n-bg/devtools/client/accessibility.properties | 8 firefox-esr-140.6.0esr/l10n-bg/devtools/client/application.ftl | 20 firefox-esr-140.6.0esr/l10n-bg/devtools/client/boxmodel.properties | 8 firefox-esr-140.6.0esr/l10n-bg/devtools/client/changes.properties | 16 firefox-esr-140.6.0esr/l10n-bg/devtools/client/compatibility.ftl | 4 firefox-esr-140.6.0esr/l10n-bg/devtools/client/components.properties | 3 firefox-esr-140.6.0esr/l10n-bg/devtools/client/debugger.properties | 2 firefox-esr-140.6.0esr/l10n-bg/devtools/client/toolbox-options.ftl | 4 firefox-esr-140.6.0esr/l10n-bg/dom/chrome/dom/dom.properties | 2 firefox-esr-140.6.0esr/l10n-bg/netwerk/necko.properties | 3 firefox-esr-140.6.0esr/l10n-bg/toolkit/toolkit/about/aboutAddons.ftl | 6 firefox-esr-140.6.0esr/l10n-bg/toolkit/toolkit/about/aboutLogging.ftl | 5 firefox-esr-140.6.0esr/l10n-bg/toolkit/toolkit/about/aboutWebauthn.ftl | 8 firefox-esr-140.6.0esr/l10n-bg/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-bg/toolkit/toolkit/global/datetimepicker.ftl | 53 firefox-esr-140.6.0esr/l10n-bg/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-bg/toolkit/toolkit/pdfviewer/viewer.ftl | 6 firefox-esr-140.6.0esr/l10n-bn/browser/browser/browser.ftl | 12 firefox-esr-140.6.0esr/l10n-bn/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-bn/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-bn/browser/browser/preferences/preferences.ftl | 38 firefox-esr-140.6.0esr/l10n-bn/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-bn/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-bn/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-br/browser/browser/browser.ftl | 3 firefox-esr-140.6.0esr/l10n-br/browser/browser/browserContext.ftl | 7 firefox-esr-140.6.0esr/l10n-br/browser/browser/contextual-manager.ftl | 2 firefox-esr-140.6.0esr/l10n-br/browser/browser/featureCallout.ftl | 1 firefox-esr-140.6.0esr/l10n-br/browser/browser/newtab/newtab.ftl | 12 firefox-esr-140.6.0esr/l10n-br/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-br/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-br/browser/browser/preferences/preferences.ftl | 40 firefox-esr-140.6.0esr/l10n-br/browser/browser/tabbrowser.ftl | 4 firefox-esr-140.6.0esr/l10n-br/browser/browser/webauthnDialog.ftl | 9 firefox-esr-140.6.0esr/l10n-br/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-br/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-br/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-br/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-bs/browser/browser/browser.ftl | 7 firefox-esr-140.6.0esr/l10n-bs/browser/browser/browserContext.ftl | 4 firefox-esr-140.6.0esr/l10n-bs/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-bs/browser/browser/newtab/newtab.ftl | 2 firefox-esr-140.6.0esr/l10n-bs/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-bs/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-bs/browser/browser/preferences/preferences.ftl | 67 firefox-esr-140.6.0esr/l10n-bs/browser/browser/profiles.ftl | 18 firefox-esr-140.6.0esr/l10n-bs/browser/browser/tabbrowser.ftl | 4 firefox-esr-140.6.0esr/l10n-bs/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-bs/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-bs/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-bs/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-bs/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-bs/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-bs/toolkit/toolkit/pdfviewer/viewer.ftl | 15 firefox-esr-140.6.0esr/l10n-ca-valencia/browser/browser/aboutDialog.ftl | 1 firefox-esr-140.6.0esr/l10n-ca-valencia/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-ca-valencia/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-ca-valencia/browser/browser/preferences/preferences.ftl | 38 firefox-esr-140.6.0esr/l10n-ca-valencia/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-ca-valencia/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-ca-valencia/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-ca-valencia/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-ca/browser/browser/appmenu.ftl | 4 firefox-esr-140.6.0esr/l10n-ca/browser/browser/backupSettings.ftl | 98 firefox-esr-140.6.0esr/l10n-ca/browser/browser/browser.ftl | 49 firefox-esr-140.6.0esr/l10n-ca/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-ca/browser/browser/clearDataForSite.ftl | 2 firefox-esr-140.6.0esr/l10n-ca/browser/browser/confirmationHints.ftl | 2 firefox-esr-140.6.0esr/l10n-ca/browser/browser/contentCrash.ftl | 14 firefox-esr-140.6.0esr/l10n-ca/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-ca/browser/browser/downloads.ftl | 6 firefox-esr-140.6.0esr/l10n-ca/browser/browser/featureCallout.ftl | 41 firefox-esr-140.6.0esr/l10n-ca/browser/browser/firefoxRelay.ftl | 39 firefox-esr-140.6.0esr/l10n-ca/browser/browser/genai.ftl | 92 firefox-esr-140.6.0esr/l10n-ca/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-ca/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-ca/browser/browser/migrationWizard.ftl | 6 firefox-esr-140.6.0esr/l10n-ca/browser/browser/newtab/asrouter.ftl | 73 firefox-esr-140.6.0esr/l10n-ca/browser/browser/newtab/newtab.ftl | 102 firefox-esr-140.6.0esr/l10n-ca/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-ca/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-ca/browser/browser/preferences/preferences.ftl | 51 firefox-esr-140.6.0esr/l10n-ca/browser/browser/tabbrowser.ftl | 4 firefox-esr-140.6.0esr/l10n-ca/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-ca/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-ca/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-ca/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-ca/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-ca/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-ca/toolkit/toolkit/pdfviewer/viewer.ftl | 4 firefox-esr-140.6.0esr/l10n-cak/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-cak/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-cak/browser/browser/preferences/preferences.ftl | 38 firefox-esr-140.6.0esr/l10n-cak/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-cak/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-cak/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-cak/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-cak/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-cs/browser/browser/addonNotifications.ftl | 5 firefox-esr-140.6.0esr/l10n-cs/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-cs/browser/browser/backupSettings.ftl | 277 firefox-esr-140.6.0esr/l10n-cs/browser/browser/browser.ftl | 57 firefox-esr-140.6.0esr/l10n-cs/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-cs/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-cs/browser/browser/customkeys.ftl | 35 firefox-esr-140.6.0esr/l10n-cs/browser/browser/featureCallout.ftl | 54 firefox-esr-140.6.0esr/l10n-cs/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-cs/browser/browser/genai.ftl | 12 firefox-esr-140.6.0esr/l10n-cs/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-cs/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-cs/browser/browser/newtab/asrouter.ftl | 24 firefox-esr-140.6.0esr/l10n-cs/browser/browser/newtab/newtab.ftl | 29 firefox-esr-140.6.0esr/l10n-cs/browser/browser/newtab/onboarding.ftl | 129 firefox-esr-140.6.0esr/l10n-cs/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-cs/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-cs/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-cs/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-cs/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-cs/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-cs/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-cs/browser/browser/preferences/preferences.ftl | 237 firefox-esr-140.6.0esr/l10n-cs/browser/browser/preonboarding.ftl | 2 firefox-esr-140.6.0esr/l10n-cs/browser/browser/profiles.ftl | 116 firefox-esr-140.6.0esr/l10n-cs/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-cs/browser/browser/sanitize.ftl | 2 firefox-esr-140.6.0esr/l10n-cs/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-cs/browser/browser/tabContextMenu.ftl | 4 firefox-esr-140.6.0esr/l10n-cs/browser/browser/tabbrowser.ftl | 33 firefox-esr-140.6.0esr/l10n-cs/browser/browser/taskbartabs.ftl | 18 firefox-esr-140.6.0esr/l10n-cs/browser/browser/termsofuse.ftl | 6 firefox-esr-140.6.0esr/l10n-cs/browser/browser/translations.ftl | 12 firefox-esr-140.6.0esr/l10n-cs/browser/browser/unifiedExtensions.ftl | 34 firefox-esr-140.6.0esr/l10n-cs/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-cs/browser/chrome/browser/browser.properties | 14 firefox-esr-140.6.0esr/l10n-cs/browser/chrome/browser/sitePermissions.properties | 5 firefox-esr-140.6.0esr/l10n-cs/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-cs/devtools/client/netmonitor.properties | 2 firefox-esr-140.6.0esr/l10n-cs/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-cs/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-cs/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-cs/devtools/client/webconsole.properties | 6 firefox-esr-140.6.0esr/l10n-cs/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-cs/dom/chrome/dom/dom.properties | 7 firefox-esr-140.6.0esr/l10n-cs/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-cs/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-cs/toolkit/toolkit/about/aboutAddons.ftl | 20 firefox-esr-140.6.0esr/l10n-cs/toolkit/toolkit/about/aboutGlean.ftl | 38 firefox-esr-140.6.0esr/l10n-cs/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-cs/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-cs/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-cs/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-cs/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-cs/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-cs/toolkit/toolkit/global/extensionPermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-cs/toolkit/toolkit/global/extensions.ftl | 10 firefox-esr-140.6.0esr/l10n-cs/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-cs/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-cs/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-cs/toolkit/toolkit/global/textActions.ftl | 4 firefox-esr-140.6.0esr/l10n-cs/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-cs/toolkit/toolkit/neterror/netError.ftl | 16 firefox-esr-140.6.0esr/l10n-cs/toolkit/toolkit/pdfviewer/viewer.ftl | 59 firefox-esr-140.6.0esr/l10n-cs/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-cy/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-cy/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-cy/browser/browser/backupSettings.ftl | 255 firefox-esr-140.6.0esr/l10n-cy/browser/browser/browser.ftl | 57 firefox-esr-140.6.0esr/l10n-cy/browser/browser/browserContext.ftl | 6 firefox-esr-140.6.0esr/l10n-cy/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-cy/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-cy/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-cy/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-cy/browser/browser/fxviewTabList.ftl | 2 firefox-esr-140.6.0esr/l10n-cy/browser/browser/genai.ftl | 6 firefox-esr-140.6.0esr/l10n-cy/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-cy/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-cy/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-cy/browser/browser/newtab/newtab.ftl | 25 firefox-esr-140.6.0esr/l10n-cy/browser/browser/newtab/onboarding.ftl | 99 firefox-esr-140.6.0esr/l10n-cy/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-cy/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-cy/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-cy/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-cy/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-cy/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-cy/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-cy/browser/browser/preferences/preferences.ftl | 228 firefox-esr-140.6.0esr/l10n-cy/browser/browser/profiles.ftl | 124 firefox-esr-140.6.0esr/l10n-cy/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-cy/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-cy/browser/browser/sync.ftl | 16 firefox-esr-140.6.0esr/l10n-cy/browser/browser/tabContextMenu.ftl | 17 firefox-esr-140.6.0esr/l10n-cy/browser/browser/tabbrowser.ftl | 42 firefox-esr-140.6.0esr/l10n-cy/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-cy/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-cy/browser/browser/unifiedExtensions.ftl | 36 firefox-esr-140.6.0esr/l10n-cy/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-cy/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-cy/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-cy/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-cy/devtools/client/jsonview.properties | 7 firefox-esr-140.6.0esr/l10n-cy/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-cy/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-cy/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-cy/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-cy/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-cy/dom/chrome/dom/dom.properties | 11 firefox-esr-140.6.0esr/l10n-cy/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-cy/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-cy/toolkit/chrome/mozapps/profile/profileSelection.properties | 2 firefox-esr-140.6.0esr/l10n-cy/toolkit/toolkit/about/aboutAddons.ftl | 14 firefox-esr-140.6.0esr/l10n-cy/toolkit/toolkit/about/aboutGlean.ftl | 40 firefox-esr-140.6.0esr/l10n-cy/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-cy/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-cy/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-cy/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-cy/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-cy/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-cy/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-cy/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-cy/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-cy/toolkit/toolkit/global/profileSelection.ftl | 2 firefox-esr-140.6.0esr/l10n-cy/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-cy/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-cy/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-cy/toolkit/toolkit/pdfviewer/viewer.ftl | 57 firefox-esr-140.6.0esr/l10n-cy/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-da/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-da/browser/browser/backupSettings.ftl | 251 firefox-esr-140.6.0esr/l10n-da/browser/browser/browser.ftl | 48 firefox-esr-140.6.0esr/l10n-da/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-da/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-da/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-da/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-da/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-da/browser/browser/genai.ftl | 6 firefox-esr-140.6.0esr/l10n-da/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-da/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-da/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-da/browser/browser/newtab/newtab.ftl | 25 firefox-esr-140.6.0esr/l10n-da/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-da/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-da/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-da/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-da/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-da/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-da/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-da/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-da/browser/browser/preferences/preferences.ftl | 208 firefox-esr-140.6.0esr/l10n-da/browser/browser/profiles.ftl | 116 firefox-esr-140.6.0esr/l10n-da/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-da/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-da/browser/browser/tabbrowser.ftl | 31 firefox-esr-140.6.0esr/l10n-da/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-da/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-da/browser/browser/unifiedExtensions.ftl | 11 firefox-esr-140.6.0esr/l10n-da/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-da/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-da/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-da/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-da/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-da/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-da/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-da/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-da/dom/chrome/dom/dom.properties | 5 firefox-esr-140.6.0esr/l10n-da/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-da/toolkit/toolkit/about/aboutAddons.ftl | 2 firefox-esr-140.6.0esr/l10n-da/toolkit/toolkit/about/aboutGlean.ftl | 38 firefox-esr-140.6.0esr/l10n-da/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-da/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-da/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-da/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-da/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-da/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-da/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-da/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-da/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-da/toolkit/toolkit/pdfviewer/viewer.ftl | 53 firefox-esr-140.6.0esr/l10n-da/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-de/browser/browser/aboutRobots.ftl | 2 firefox-esr-140.6.0esr/l10n-de/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-de/browser/browser/appmenu.ftl | 7 firefox-esr-140.6.0esr/l10n-de/browser/browser/backupSettings.ftl | 251 firefox-esr-140.6.0esr/l10n-de/browser/browser/browser.ftl | 53 firefox-esr-140.6.0esr/l10n-de/browser/browser/browserContext.ftl | 5 firefox-esr-140.6.0esr/l10n-de/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-de/browser/browser/customkeys.ftl | 30 firefox-esr-140.6.0esr/l10n-de/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-de/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-de/browser/browser/genai.ftl | 4 firefox-esr-140.6.0esr/l10n-de/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-de/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-de/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-de/browser/browser/newtab/newtab.ftl | 27 firefox-esr-140.6.0esr/l10n-de/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-de/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-de/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-de/browser/browser/preferences/clearSiteData.ftl | 2 firefox-esr-140.6.0esr/l10n-de/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-de/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-de/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-de/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-de/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-de/browser/browser/preferences/preferences.ftl | 249 firefox-esr-140.6.0esr/l10n-de/browser/browser/profiles.ftl | 116 firefox-esr-140.6.0esr/l10n-de/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-de/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-de/browser/browser/sync.ftl | 10 firefox-esr-140.6.0esr/l10n-de/browser/browser/tabContextMenu.ftl | 21 firefox-esr-140.6.0esr/l10n-de/browser/browser/tabbrowser.ftl | 36 firefox-esr-140.6.0esr/l10n-de/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-de/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-de/browser/browser/unifiedExtensions.ftl | 30 firefox-esr-140.6.0esr/l10n-de/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-de/browser/chrome/browser/browser.properties | 10 firefox-esr-140.6.0esr/l10n-de/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-de/devtools/client/debugger.properties | 8 firefox-esr-140.6.0esr/l10n-de/devtools/client/jsonview.properties | 7 firefox-esr-140.6.0esr/l10n-de/devtools/client/perftools.ftl | 2 firefox-esr-140.6.0esr/l10n-de/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-de/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-de/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-de/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-de/devtools/shared/styleinspector.properties | 9 firefox-esr-140.6.0esr/l10n-de/dom/chrome/dom/dom.properties | 17 firefox-esr-140.6.0esr/l10n-de/dom/chrome/layout/css.properties | 2 firefox-esr-140.6.0esr/l10n-de/dom/chrome/layout/htmlparser.properties | 4 firefox-esr-140.6.0esr/l10n-de/dom/chrome/layout/layout_errors.properties | 2 firefox-esr-140.6.0esr/l10n-de/dom/chrome/security/security.properties | 5 firefox-esr-140.6.0esr/l10n-de/netwerk/necko.properties | 2 firefox-esr-140.6.0esr/l10n-de/security/manager/chrome/pipnss/nsserrors.properties | 8 firefox-esr-140.6.0esr/l10n-de/toolkit/toolkit/about/aboutAddons.ftl | 14 firefox-esr-140.6.0esr/l10n-de/toolkit/toolkit/about/aboutGlean.ftl | 38 firefox-esr-140.6.0esr/l10n-de/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-de/toolkit/toolkit/about/aboutProcesses.ftl | 2 firefox-esr-140.6.0esr/l10n-de/toolkit/toolkit/about/aboutServiceWorkers.ftl | 4 firefox-esr-140.6.0esr/l10n-de/toolkit/toolkit/about/aboutSupport.ftl | 6 firefox-esr-140.6.0esr/l10n-de/toolkit/toolkit/about/aboutWebrtc.ftl | 10 firefox-esr-140.6.0esr/l10n-de/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-de/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-de/toolkit/toolkit/featuregates/features.ftl | 2 firefox-esr-140.6.0esr/l10n-de/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-de/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-de/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-de/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-de/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-de/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-de/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-de/toolkit/toolkit/neterror/certError.ftl | 9 firefox-esr-140.6.0esr/l10n-de/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-de/toolkit/toolkit/neterror/nsserrors.ftl | 8 firefox-esr-140.6.0esr/l10n-de/toolkit/toolkit/pdfviewer/viewer.ftl | 53 firefox-esr-140.6.0esr/l10n-de/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/appmenu.ftl | 8 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/backupSettings.ftl | 253 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/browser.ftl | 53 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/browserContext.ftl | 6 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/fxviewTabList.ftl | 2 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/genai.ftl | 6 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/newtab/newtab.ftl | 25 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/preferences/preferences.ftl | 228 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/profiles.ftl | 116 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/sync.ftl | 12 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/tabContextMenu.ftl | 15 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/tabbrowser.ftl | 42 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/unifiedExtensions.ftl | 34 firefox-esr-140.6.0esr/l10n-dsb/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-dsb/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-dsb/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-dsb/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-dsb/devtools/client/jsonview.properties | 7 firefox-esr-140.6.0esr/l10n-dsb/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-dsb/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-dsb/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-dsb/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-dsb/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-dsb/dom/chrome/dom/dom.properties | 11 firefox-esr-140.6.0esr/l10n-dsb/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-dsb/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-dsb/toolkit/toolkit/about/aboutAddons.ftl | 14 firefox-esr-140.6.0esr/l10n-dsb/toolkit/toolkit/about/aboutGlean.ftl | 40 firefox-esr-140.6.0esr/l10n-dsb/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-dsb/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-dsb/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-dsb/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-dsb/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-dsb/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-dsb/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-dsb/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-dsb/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-dsb/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-dsb/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-dsb/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-dsb/toolkit/toolkit/pdfviewer/viewer.ftl | 55 firefox-esr-140.6.0esr/l10n-dsb/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-el/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-el/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-el/browser/browser/backupSettings.ftl | 251 firefox-esr-140.6.0esr/l10n-el/browser/browser/browser.ftl | 51 firefox-esr-140.6.0esr/l10n-el/browser/browser/browserContext.ftl | 6 firefox-esr-140.6.0esr/l10n-el/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-el/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-el/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-el/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-el/browser/browser/fxviewTabList.ftl | 2 firefox-esr-140.6.0esr/l10n-el/browser/browser/genai.ftl | 6 firefox-esr-140.6.0esr/l10n-el/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-el/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-el/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-el/browser/browser/newtab/newtab.ftl | 27 firefox-esr-140.6.0esr/l10n-el/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-el/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-el/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-el/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-el/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-el/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-el/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-el/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-el/browser/browser/preferences/preferences.ftl | 228 firefox-esr-140.6.0esr/l10n-el/browser/browser/profiles.ftl | 122 firefox-esr-140.6.0esr/l10n-el/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-el/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-el/browser/browser/sync.ftl | 9 firefox-esr-140.6.0esr/l10n-el/browser/browser/tabContextMenu.ftl | 12 firefox-esr-140.6.0esr/l10n-el/browser/browser/tabbrowser.ftl | 42 firefox-esr-140.6.0esr/l10n-el/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-el/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-el/browser/browser/unifiedExtensions.ftl | 31 firefox-esr-140.6.0esr/l10n-el/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-el/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-el/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-el/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-el/devtools/client/jsonview.properties | 7 firefox-esr-140.6.0esr/l10n-el/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-el/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-el/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-el/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-el/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-el/dom/chrome/dom/dom.properties | 13 firefox-esr-140.6.0esr/l10n-el/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-el/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-el/toolkit/crashreporter/aboutcrashes.ftl | 6 firefox-esr-140.6.0esr/l10n-el/toolkit/toolkit/about/aboutAddons.ftl | 14 firefox-esr-140.6.0esr/l10n-el/toolkit/toolkit/about/aboutGlean.ftl | 40 firefox-esr-140.6.0esr/l10n-el/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-el/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-el/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-el/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-el/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-el/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-el/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-el/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-el/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-el/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-el/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-el/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-el/toolkit/toolkit/pdfviewer/viewer.ftl | 53 firefox-esr-140.6.0esr/l10n-el/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/appmenu.ftl | 4 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/backupSettings.ftl | 94 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/browser.ftl | 72 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/browserContext.ftl | 5 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/featureCallout.ftl | 17 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/firefoxRelay.ftl | 4 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/genai.ftl | 52 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/newtab/asrouter.ftl | 45 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/newtab/newtab.ftl | 36 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/newtab/onboarding.ftl | 19 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/policies/policies-descriptions.ftl | 4 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/preferences/preferences.ftl | 122 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/profiles.ftl | 138 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/tabbrowser.ftl | 4 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/taskbartabs.ftl | 23 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/unexpectedScript.ftl | 33 firefox-esr-140.6.0esr/l10n-en-CA/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-en-CA/browser/chrome/browser/browser.properties | 4 firefox-esr-140.6.0esr/l10n-en-CA/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-en-CA/devtools/client/inspector.properties | 8 firefox-esr-140.6.0esr/l10n-en-CA/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-en-CA/devtools/client/tooltips.ftl | 1 firefox-esr-140.6.0esr/l10n-en-CA/toolkit/toolkit/about/certviewer.ftl | 3 firefox-esr-140.6.0esr/l10n-en-CA/toolkit/toolkit/firefoxlabs/features.ftl | 21 firefox-esr-140.6.0esr/l10n-en-CA/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-en-CA/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-en-CA/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-en-CA/toolkit/toolkit/neterror/certError.ftl | 1 firefox-esr-140.6.0esr/l10n-en-CA/toolkit/toolkit/pdfviewer/viewer.ftl | 47 firefox-esr-140.6.0esr/l10n-en-CA/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/appmenu.ftl | 9 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/backupSettings.ftl | 251 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/browser.ftl | 47 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/browserContext.ftl | 8 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/fxviewTabList.ftl | 2 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/genai.ftl | 12 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/newtab/newtab.ftl | 36 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/preferences/preferences.ftl | 270 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/profiles.ftl | 114 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/sync.ftl | 9 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/tabContextMenu.ftl | 12 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/tabbrowser.ftl | 75 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/unifiedExtensions.ftl | 29 firefox-esr-140.6.0esr/l10n-en-GB/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-en-GB/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-en-GB/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-en-GB/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-en-GB/devtools/client/jsonview.properties | 7 firefox-esr-140.6.0esr/l10n-en-GB/devtools/client/perftools.ftl | 2 firefox-esr-140.6.0esr/l10n-en-GB/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-en-GB/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-en-GB/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-en-GB/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-en-GB/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-en-GB/dom/chrome/dom/dom.properties | 12 firefox-esr-140.6.0esr/l10n-en-GB/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-en-GB/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-en-GB/toolkit/toolkit/about/aboutAddons.ftl | 14 firefox-esr-140.6.0esr/l10n-en-GB/toolkit/toolkit/about/aboutGlean.ftl | 40 firefox-esr-140.6.0esr/l10n-en-GB/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-en-GB/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-en-GB/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-en-GB/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-en-GB/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-en-GB/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-en-GB/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-en-GB/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-en-GB/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-en-GB/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-en-GB/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-en-GB/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-en-GB/toolkit/toolkit/pdfviewer/viewer.ftl | 53 firefox-esr-140.6.0esr/l10n-en-GB/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-eo/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-eo/browser/browser/backupSettings.ftl | 249 firefox-esr-140.6.0esr/l10n-eo/browser/browser/browser.ftl | 48 firefox-esr-140.6.0esr/l10n-eo/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-eo/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-eo/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-eo/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-eo/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-eo/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-eo/browser/browser/newtab/asrouter.ftl | 22 firefox-esr-140.6.0esr/l10n-eo/browser/browser/newtab/newtab.ftl | 25 firefox-esr-140.6.0esr/l10n-eo/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-eo/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-eo/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-eo/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-eo/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-eo/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-eo/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-eo/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-eo/browser/browser/preferences/preferences.ftl | 194 firefox-esr-140.6.0esr/l10n-eo/browser/browser/profiles.ftl | 114 firefox-esr-140.6.0esr/l10n-eo/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-eo/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-eo/browser/browser/tabbrowser.ftl | 31 firefox-esr-140.6.0esr/l10n-eo/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-eo/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-eo/browser/browser/unifiedExtensions.ftl | 11 firefox-esr-140.6.0esr/l10n-eo/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-eo/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-eo/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-eo/browser/installer/override.properties | 4 firefox-esr-140.6.0esr/l10n-eo/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-eo/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-eo/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-eo/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-eo/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-eo/dom/chrome/dom/dom.properties | 7 firefox-esr-140.6.0esr/l10n-eo/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-eo/toolkit/toolkit/about/aboutAddons.ftl | 2 firefox-esr-140.6.0esr/l10n-eo/toolkit/toolkit/about/aboutGlean.ftl | 38 firefox-esr-140.6.0esr/l10n-eo/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-eo/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-eo/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-eo/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-eo/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-eo/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-eo/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-eo/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-eo/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-eo/toolkit/toolkit/pdfviewer/viewer.ftl | 53 firefox-esr-140.6.0esr/l10n-eo/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/backupSettings.ftl | 251 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/browser.ftl | 49 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/browserContext.ftl | 6 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/featureCallout.ftl | 24 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/fxviewTabList.ftl | 2 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/genai.ftl | 6 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/newtab/asrouter.ftl | 22 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/newtab/newtab.ftl | 25 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/newtab/onboarding.ftl | 95 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/preferences/formAutofill.ftl | 57 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/preferences/preferences.ftl | 228 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/profiles.ftl | 116 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/sync.ftl | 10 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/tabContextMenu.ftl | 13 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/tabbrowser.ftl | 42 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/taskbartabs.ftl | 16 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/unifiedExtensions.ftl | 32 firefox-esr-140.6.0esr/l10n-es-AR/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-es-AR/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-es-AR/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-es-AR/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-es-AR/devtools/client/jsonview.properties | 7 firefox-esr-140.6.0esr/l10n-es-AR/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-es-AR/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-es-AR/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-es-AR/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-es-AR/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-es-AR/dom/chrome/dom/dom.properties | 13 firefox-esr-140.6.0esr/l10n-es-AR/dom/chrome/security/csp.properties | 2 firefox-esr-140.6.0esr/l10n-es-AR/dom/chrome/security/security.properties | 7 firefox-esr-140.6.0esr/l10n-es-AR/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-es-AR/toolkit/toolkit/about/aboutAddons.ftl | 14 firefox-esr-140.6.0esr/l10n-es-AR/toolkit/toolkit/about/aboutGlean.ftl | 43 firefox-esr-140.6.0esr/l10n-es-AR/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-es-AR/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-es-AR/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-es-AR/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-es-AR/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-es-AR/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-es-AR/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-es-AR/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-es-AR/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-es-AR/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-es-AR/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-es-AR/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-es-AR/toolkit/toolkit/pdfviewer/viewer.ftl | 53 firefox-esr-140.6.0esr/l10n-es-AR/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/backupSettings.ftl | 251 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/browser.ftl | 49 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/genai.ftl | 4 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/newtab/newtab.ftl | 25 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/preferences/preferences.ftl | 205 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/profiles.ftl | 116 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/tabContextMenu.ftl | 4 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/tabbrowser.ftl | 31 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/unifiedExtensions.ftl | 32 firefox-esr-140.6.0esr/l10n-es-CL/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-es-CL/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-es-CL/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-es-CL/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-es-CL/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-es-CL/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-es-CL/devtools/client/tooltips.ftl | 4 firefox-esr-140.6.0esr/l10n-es-CL/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-es-CL/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-es-CL/dom/chrome/dom/dom.properties | 11 firefox-esr-140.6.0esr/l10n-es-CL/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-es-CL/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-es-CL/toolkit/toolkit/about/aboutAddons.ftl | 14 firefox-esr-140.6.0esr/l10n-es-CL/toolkit/toolkit/about/aboutGlean.ftl | 38 firefox-esr-140.6.0esr/l10n-es-CL/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-es-CL/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-es-CL/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-es-CL/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-es-CL/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-es-CL/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-es-CL/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-es-CL/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-es-CL/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-es-CL/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-es-CL/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-es-CL/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-es-CL/toolkit/toolkit/pdfviewer/viewer.ftl | 53 firefox-esr-140.6.0esr/l10n-es-CL/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/backupSettings.ftl | 251 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/browser.ftl | 143 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/featureCallout.ftl | 32 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/genai.ftl | 60 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/newtab/asrouter.ftl | 81 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/newtab/newtab.ftl | 122 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/preferences/permissions.ftl | 27 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/preferences/preferences.ftl | 211 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/profiles.ftl | 207 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/tabContextMenu.ftl | 4 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/tabbrowser.ftl | 31 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/unexpectedScript.ftl | 33 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/unifiedExtensions.ftl | 32 firefox-esr-140.6.0esr/l10n-es-ES/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-es-ES/browser/chrome/browser/browser.properties | 10 firefox-esr-140.6.0esr/l10n-es-ES/browser/chrome/browser/sitePermissions.properties | 3 firefox-esr-140.6.0esr/l10n-es-ES/devtools/client/debugger.properties | 16 firefox-esr-140.6.0esr/l10n-es-ES/devtools/client/inspector.properties | 8 firefox-esr-140.6.0esr/l10n-es-ES/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-es-ES/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-es-ES/devtools/client/tooltips.ftl | 6 firefox-esr-140.6.0esr/l10n-es-ES/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-es-ES/devtools/shared/styleinspector.properties | 12 firefox-esr-140.6.0esr/l10n-es-ES/dom/chrome/dom/dom.properties | 11 firefox-esr-140.6.0esr/l10n-es-ES/dom/chrome/security/security.properties | 12 firefox-esr-140.6.0esr/l10n-es-ES/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-es-ES/toolkit/toolkit/about/aboutAddons.ftl | 9 firefox-esr-140.6.0esr/l10n-es-ES/toolkit/toolkit/about/aboutGlean.ftl | 69 firefox-esr-140.6.0esr/l10n-es-ES/toolkit/toolkit/about/aboutLogging.ftl | 26 firefox-esr-140.6.0esr/l10n-es-ES/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-es-ES/toolkit/toolkit/firefoxlabs/features.ftl | 26 firefox-esr-140.6.0esr/l10n-es-ES/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-es-ES/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-es-ES/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-es-ES/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-es-ES/toolkit/toolkit/global/textActions.ftl | 7 firefox-esr-140.6.0esr/l10n-es-ES/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-es-ES/toolkit/toolkit/pdfviewer/viewer.ftl | 67 firefox-esr-140.6.0esr/l10n-es-ES/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/addonNotifications.ftl | 4 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/appMenuNotifications.ftl | 6 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/appmenu.ftl | 10 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/backupSettings.ftl | 109 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/browser.ftl | 385 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/browserContext.ftl | 13 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/clearDataForSite.ftl | 15 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/confirmationHints.ftl | 2 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/contentCrash.ftl | 17 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/contextual-manager.ftl | 250 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/downloads.ftl | 12 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/featureCallout.ftl | 88 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/firefoxRelay.ftl | 11 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/genai.ftl | 110 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/menubar.ftl | 14 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/migration.ftl | 2 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/migrationWizard.ftl | 6 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/newtab/asrouter.ftl | 79 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/newtab/newtab.ftl | 133 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/newtab/onboarding.ftl | 80 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/policies/policies-descriptions.ftl | 6 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/preferences/connection.ftl | 2 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/preferences/containers.ftl | 2 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/preferences/moreFromMozilla.ftl | 6 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/preferences/permissions.ftl | 2 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/preferences/preferences.ftl | 155 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/preonboarding.ftl | 8 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/profiles.ftl | 226 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/reportBrokenSite.ftl | 10 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/sanitize.ftl | 2 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/screenshots.ftl | 5 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/search.ftl | 11 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/sidebar.ftl | 35 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/sync.ftl | 4 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/tabbrowser.ftl | 28 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/taskbartabs.ftl | 50 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/termsofuse.ftl | 8 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/unexpectedScript.ftl | 33 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-es-MX/browser/browser/webrtc-preview.ftl | 6 firefox-esr-140.6.0esr/l10n-es-MX/browser/chrome/browser/browser.properties | 12 firefox-esr-140.6.0esr/l10n-es-MX/browser/chrome/browser/downloads/downloads.properties | 14 firefox-esr-140.6.0esr/l10n-es-MX/browser/chrome/overrides/appstrings.properties | 1 firefox-esr-140.6.0esr/l10n-es-MX/devtools/client/debugger.properties | 13 firefox-esr-140.6.0esr/l10n-es-MX/devtools/client/netmonitor.properties | 33 firefox-esr-140.6.0esr/l10n-es-MX/devtools/client/network-throttling.properties | 9 firefox-esr-140.6.0esr/l10n-es-MX/devtools/client/perftools.ftl | 5 firefox-esr-140.6.0esr/l10n-es-MX/devtools/client/responsive.properties | 3 firefox-esr-140.6.0esr/l10n-es-MX/devtools/client/styleeditor.properties | 4 firefox-esr-140.6.0esr/l10n-es-MX/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-es-MX/devtools/client/toolbox.properties | 5 firefox-esr-140.6.0esr/l10n-es-MX/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-es-MX/devtools/shared/styleinspector.properties | 3 firefox-esr-140.6.0esr/l10n-es-MX/dom/chrome/appstrings.properties | 2 firefox-esr-140.6.0esr/l10n-es-MX/dom/chrome/dom/dom.properties | 11 firefox-esr-140.6.0esr/l10n-es-MX/dom/chrome/layout/xul.properties | 1 firefox-esr-140.6.0esr/l10n-es-MX/dom/chrome/security/security.properties | 2 firefox-esr-140.6.0esr/l10n-es-MX/security/manager/security/pippki/pippki.ftl | 7 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/crashreporter/crashreporter.ftl | 4 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/about/aboutAddons.ftl | 24 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/about/aboutCompat.ftl | 1 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/about/aboutGlean.ftl | 28 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/about/aboutLogging.ftl | 22 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/about/aboutNetworking.ftl | 3 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/about/aboutReader.ftl | 2 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/about/aboutSupport.ftl | 6 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/about/certviewer.ftl | 3 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/contentanalysis/contentanalysis.ftl | 9 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/firefoxlabs/features.ftl | 52 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/global/alert.ftl | 2 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/global/extensionPermissions.ftl | 14 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/global/extensions.ftl | 46 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/global/mozBoxBase.ftl | 6 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/global/mozBreadcrumbGroup.ftl | 7 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/global/textActions.ftl | 8 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/global/unknownContentType.ftl | 2 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/neterror/netError.ftl | 12 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/neterror/nsserrors.ftl | 2 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/pdfviewer/viewer.ftl | 108 firefox-esr-140.6.0esr/l10n-es-MX/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-et/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-et/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-et/browser/browser/preferences/preferences.ftl | 46 firefox-esr-140.6.0esr/l10n-et/browser/browser/webauthnDialog.ftl | 17 firefox-esr-140.6.0esr/l10n-et/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-et/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-et/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-eu/browser/browser/appmenu.ftl | 7 firefox-esr-140.6.0esr/l10n-eu/browser/browser/backupSettings.ftl | 181 firefox-esr-140.6.0esr/l10n-eu/browser/browser/browser.ftl | 34 firefox-esr-140.6.0esr/l10n-eu/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-eu/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-eu/browser/browser/downloads.ftl | 4 firefox-esr-140.6.0esr/l10n-eu/browser/browser/featureCallout.ftl | 5 firefox-esr-140.6.0esr/l10n-eu/browser/browser/genai.ftl | 44 firefox-esr-140.6.0esr/l10n-eu/browser/browser/newtab/asrouter.ftl | 23 firefox-esr-140.6.0esr/l10n-eu/browser/browser/newtab/newtab.ftl | 96 firefox-esr-140.6.0esr/l10n-eu/browser/browser/newtab/onboarding.ftl | 71 firefox-esr-140.6.0esr/l10n-eu/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-eu/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-eu/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-eu/browser/browser/preferences/preferences.ftl | 119 firefox-esr-140.6.0esr/l10n-eu/browser/browser/profiles.ftl | 59 firefox-esr-140.6.0esr/l10n-eu/browser/browser/search.ftl | 9 firefox-esr-140.6.0esr/l10n-eu/browser/browser/tabbrowser.ftl | 20 firefox-esr-140.6.0esr/l10n-eu/browser/browser/taskbartabs.ftl | 28 firefox-esr-140.6.0esr/l10n-eu/browser/browser/unexpectedScript.ftl | 13 firefox-esr-140.6.0esr/l10n-eu/browser/browser/webauthnDialog.ftl | 37 firefox-esr-140.6.0esr/l10n-eu/browser/chrome/browser/browser.properties | 6 firefox-esr-140.6.0esr/l10n-eu/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-eu/netwerk/necko.properties | 15 firefox-esr-140.6.0esr/l10n-eu/toolkit/crashreporter/crashreporter.ini | 2 firefox-esr-140.6.0esr/l10n-eu/toolkit/toolkit/about/aboutAddons.ftl | 14 firefox-esr-140.6.0esr/l10n-eu/toolkit/toolkit/about/aboutLogging.ftl | 49 firefox-esr-140.6.0esr/l10n-eu/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-eu/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-eu/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-eu/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-eu/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-eu/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-eu/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-eu/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-eu/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-eu/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-eu/toolkit/toolkit/pdfviewer/viewer.ftl | 53 firefox-esr-140.6.0esr/l10n-eu/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-fa/browser/browser/appmenu.ftl | 4 firefox-esr-140.6.0esr/l10n-fa/browser/browser/backupSettings.ftl | 80 firefox-esr-140.6.0esr/l10n-fa/browser/browser/browser.ftl | 18 firefox-esr-140.6.0esr/l10n-fa/browser/browser/featureCallout.ftl | 6 firefox-esr-140.6.0esr/l10n-fa/browser/browser/firefoxRelay.ftl | 6 firefox-esr-140.6.0esr/l10n-fa/browser/browser/genai.ftl | 4 firefox-esr-140.6.0esr/l10n-fa/browser/browser/newtab/newtab.ftl | 2 firefox-esr-140.6.0esr/l10n-fa/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-fa/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-fa/browser/browser/preferences/preferences.ftl | 38 firefox-esr-140.6.0esr/l10n-fa/browser/browser/preonboarding.ftl | 1 firefox-esr-140.6.0esr/l10n-fa/browser/browser/profiles.ftl | 2 firefox-esr-140.6.0esr/l10n-fa/browser/browser/webauthnDialog.ftl | 17 firefox-esr-140.6.0esr/l10n-fa/devtools/client/shared.properties | 16 firefox-esr-140.6.0esr/l10n-fa/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-fa/devtools/shared/styleinspector.properties | 4 firefox-esr-140.6.0esr/l10n-fa/devtools/startup/key-shortcuts.ftl | 10 firefox-esr-140.6.0esr/l10n-fa/dom/chrome/accessibility/mac/accessible.properties | 2 firefox-esr-140.6.0esr/l10n-fa/dom/chrome/accessibility/unix/accessible.properties | 2 firefox-esr-140.6.0esr/l10n-fa/dom/chrome/accessibility/win/accessible.properties | 2 firefox-esr-140.6.0esr/l10n-fa/toolkit/toolkit/about/aboutLogging.ftl | 1 firefox-esr-140.6.0esr/l10n-fa/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-fa/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-fa/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-ff/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-ff/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-ff/browser/browser/preferences/preferences.ftl | 34 firefox-esr-140.6.0esr/l10n-ff/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-ff/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-ff/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-fi/browser/browser/aboutLogins.ftl | 2 firefox-esr-140.6.0esr/l10n-fi/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-fi/browser/browser/backupSettings.ftl | 249 firefox-esr-140.6.0esr/l10n-fi/browser/browser/browser.ftl | 49 firefox-esr-140.6.0esr/l10n-fi/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-fi/browser/browser/contentCrash.ftl | 7 firefox-esr-140.6.0esr/l10n-fi/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-fi/browser/browser/featureCallout.ftl | 4 firefox-esr-140.6.0esr/l10n-fi/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-fi/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-fi/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-fi/browser/browser/newtab/asrouter.ftl | 18 firefox-esr-140.6.0esr/l10n-fi/browser/browser/newtab/newtab.ftl | 25 firefox-esr-140.6.0esr/l10n-fi/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-fi/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-fi/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-fi/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-fi/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-fi/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-fi/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-fi/browser/browser/preferences/preferences.ftl | 194 firefox-esr-140.6.0esr/l10n-fi/browser/browser/profiles.ftl | 145 firefox-esr-140.6.0esr/l10n-fi/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-fi/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-fi/browser/browser/tabbrowser.ftl | 33 firefox-esr-140.6.0esr/l10n-fi/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-fi/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-fi/browser/browser/unifiedExtensions.ftl | 11 firefox-esr-140.6.0esr/l10n-fi/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-fi/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-fi/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-fi/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-fi/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-fi/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-fi/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-fi/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-fi/toolkit/toolkit/about/aboutAddons.ftl | 2 firefox-esr-140.6.0esr/l10n-fi/toolkit/toolkit/about/aboutGlean.ftl | 1 firefox-esr-140.6.0esr/l10n-fi/toolkit/toolkit/about/aboutLogging.ftl | 20 firefox-esr-140.6.0esr/l10n-fi/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-fi/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-fi/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-fi/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-fi/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-fi/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-fi/toolkit/toolkit/global/textActions.ftl | 23 firefox-esr-140.6.0esr/l10n-fi/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-fi/toolkit/toolkit/pdfviewer/viewer.ftl | 53 firefox-esr-140.6.0esr/l10n-fi/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-fr/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-fr/browser/browser/appmenu.ftl | 9 firefox-esr-140.6.0esr/l10n-fr/browser/browser/backupSettings.ftl | 243 firefox-esr-140.6.0esr/l10n-fr/browser/browser/browser.ftl | 44 firefox-esr-140.6.0esr/l10n-fr/browser/browser/browserContext.ftl | 6 firefox-esr-140.6.0esr/l10n-fr/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-fr/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-fr/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-fr/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-fr/browser/browser/fxviewTabList.ftl | 2 firefox-esr-140.6.0esr/l10n-fr/browser/browser/genai.ftl | 6 firefox-esr-140.6.0esr/l10n-fr/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-fr/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-fr/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-fr/browser/browser/newtab/newtab.ftl | 36 firefox-esr-140.6.0esr/l10n-fr/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-fr/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-fr/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-fr/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-fr/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-fr/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-fr/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-fr/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-fr/browser/browser/preferences/preferences.ftl | 286 firefox-esr-140.6.0esr/l10n-fr/browser/browser/profiles.ftl | 114 firefox-esr-140.6.0esr/l10n-fr/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-fr/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-fr/browser/browser/sync.ftl | 9 firefox-esr-140.6.0esr/l10n-fr/browser/browser/tabContextMenu.ftl | 12 firefox-esr-140.6.0esr/l10n-fr/browser/browser/tabbrowser.ftl | 77 firefox-esr-140.6.0esr/l10n-fr/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-fr/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-fr/browser/browser/unifiedExtensions.ftl | 28 firefox-esr-140.6.0esr/l10n-fr/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-fr/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-fr/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-fr/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-fr/devtools/client/jsonview.properties | 7 firefox-esr-140.6.0esr/l10n-fr/devtools/client/perftools.ftl | 2 firefox-esr-140.6.0esr/l10n-fr/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-fr/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-fr/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-fr/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-fr/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-fr/dom/chrome/dom/dom.properties | 12 firefox-esr-140.6.0esr/l10n-fr/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-fr/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-fr/toolkit/toolkit/about/aboutAddons.ftl | 14 firefox-esr-140.6.0esr/l10n-fr/toolkit/toolkit/about/aboutGlean.ftl | 40 firefox-esr-140.6.0esr/l10n-fr/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-fr/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-fr/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-fr/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-fr/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-fr/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-fr/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-fr/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-fr/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-fr/toolkit/toolkit/global/textActions.ftl | 4 firefox-esr-140.6.0esr/l10n-fr/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-fr/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-fr/toolkit/toolkit/pdfviewer/viewer.ftl | 53 firefox-esr-140.6.0esr/l10n-fur/browser/browser/addonNotifications.ftl | 2 firefox-esr-140.6.0esr/l10n-fur/browser/browser/browser.ftl | 249 firefox-esr-140.6.0esr/l10n-fur/browser/browser/browserContext.ftl | 7 firefox-esr-140.6.0esr/l10n-fur/browser/browser/contextual-manager.ftl | 20 firefox-esr-140.6.0esr/l10n-fur/browser/browser/featureCallout.ftl | 37 firefox-esr-140.6.0esr/l10n-fur/browser/browser/firefoxRelay.ftl | 4 firefox-esr-140.6.0esr/l10n-fur/browser/browser/genai.ftl | 56 firefox-esr-140.6.0esr/l10n-fur/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-fur/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-fur/browser/browser/newtab/asrouter.ftl | 79 firefox-esr-140.6.0esr/l10n-fur/browser/browser/newtab/newtab.ftl | 117 firefox-esr-140.6.0esr/l10n-fur/browser/browser/newtab/onboarding.ftl | 97 firefox-esr-140.6.0esr/l10n-fur/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-fur/browser/browser/policies/policies-descriptions.ftl | 4 firefox-esr-140.6.0esr/l10n-fur/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-fur/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-fur/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-fur/browser/browser/preferences/permissions.ftl | 27 firefox-esr-140.6.0esr/l10n-fur/browser/browser/preferences/preferences.ftl | 145 firefox-esr-140.6.0esr/l10n-fur/browser/browser/profiles.ftl | 199 firefox-esr-140.6.0esr/l10n-fur/browser/browser/reportBrokenSite.ftl | 5 firefox-esr-140.6.0esr/l10n-fur/browser/browser/sidebar.ftl | 6 firefox-esr-140.6.0esr/l10n-fur/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-fur/browser/browser/tabbrowser.ftl | 30 firefox-esr-140.6.0esr/l10n-fur/browser/browser/taskbartabs.ftl | 50 firefox-esr-140.6.0esr/l10n-fur/browser/browser/termsofuse.ftl | 6 firefox-esr-140.6.0esr/l10n-fur/browser/browser/unexpectedScript.ftl | 33 firefox-esr-140.6.0esr/l10n-fur/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-fur/browser/browser/webrtc-preview.ftl | 6 firefox-esr-140.6.0esr/l10n-fur/browser/chrome/browser/browser.properties | 16 firefox-esr-140.6.0esr/l10n-fur/browser/chrome/browser/sitePermissions.properties | 3 firefox-esr-140.6.0esr/l10n-fur/devtools/client/debugger.properties | 10 firefox-esr-140.6.0esr/l10n-fur/devtools/client/inspector.properties | 8 firefox-esr-140.6.0esr/l10n-fur/devtools/client/perftools.ftl | 1 firefox-esr-140.6.0esr/l10n-fur/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-fur/devtools/client/tooltips.ftl | 6 firefox-esr-140.6.0esr/l10n-fur/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-fur/devtools/shared/styleinspector.properties | 4 firefox-esr-140.6.0esr/l10n-fur/dom/chrome/dom/dom.properties | 4 firefox-esr-140.6.0esr/l10n-fur/dom/chrome/security/security.properties | 4 firefox-esr-140.6.0esr/l10n-fur/toolkit/toolkit/about/aboutAddons.ftl | 7 firefox-esr-140.6.0esr/l10n-fur/toolkit/toolkit/about/aboutGlean.ftl | 44 firefox-esr-140.6.0esr/l10n-fur/toolkit/toolkit/about/aboutLogging.ftl | 26 firefox-esr-140.6.0esr/l10n-fur/toolkit/toolkit/about/aboutNetworking.ftl | 1 firefox-esr-140.6.0esr/l10n-fur/toolkit/toolkit/about/certviewer.ftl | 3 firefox-esr-140.6.0esr/l10n-fur/toolkit/toolkit/firefoxlabs/features.ftl | 26 firefox-esr-140.6.0esr/l10n-fur/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-fur/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-fur/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-fur/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-fur/toolkit/toolkit/global/textActions.ftl | 3 firefox-esr-140.6.0esr/l10n-fur/toolkit/toolkit/neterror/certError.ftl | 1 firefox-esr-140.6.0esr/l10n-fur/toolkit/toolkit/pdfviewer/viewer.ftl | 65 firefox-esr-140.6.0esr/l10n-fur/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/backupSettings.ftl | 251 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/browser.ftl | 52 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/browserContext.ftl | 6 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/fxviewTabList.ftl | 2 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/genai.ftl | 52 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/newtab/asrouter.ftl | 32 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/newtab/newtab.ftl | 34 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/preferences/preferences.ftl | 233 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/profiles.ftl | 148 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/sync.ftl | 10 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/tabContextMenu.ftl | 13 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/tabbrowser.ftl | 42 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/taskbartabs.ftl | 21 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/unifiedExtensions.ftl | 32 firefox-esr-140.6.0esr/l10n-fy-NL/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-fy-NL/browser/chrome/browser/browser.properties | 10 firefox-esr-140.6.0esr/l10n-fy-NL/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-fy-NL/browser/chrome/overrides/appstrings.properties | 2 firefox-esr-140.6.0esr/l10n-fy-NL/browser/pdfviewer/viewer.properties | 6 firefox-esr-140.6.0esr/l10n-fy-NL/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-fy-NL/devtools/client/inspector.properties | 2 firefox-esr-140.6.0esr/l10n-fy-NL/devtools/client/jsonview.properties | 7 firefox-esr-140.6.0esr/l10n-fy-NL/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-fy-NL/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-fy-NL/devtools/client/tooltips.ftl | 4 firefox-esr-140.6.0esr/l10n-fy-NL/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-fy-NL/devtools/shared/styleinspector.properties | 11 firefox-esr-140.6.0esr/l10n-fy-NL/dom/chrome/dom/dom.properties | 11 firefox-esr-140.6.0esr/l10n-fy-NL/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-fy-NL/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-fy-NL/toolkit/toolkit/about/aboutAddons.ftl | 21 firefox-esr-140.6.0esr/l10n-fy-NL/toolkit/toolkit/about/aboutGlean.ftl | 71 firefox-esr-140.6.0esr/l10n-fy-NL/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-fy-NL/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-fy-NL/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-fy-NL/toolkit/toolkit/firefoxlabs/features.ftl | 10 firefox-esr-140.6.0esr/l10n-fy-NL/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-fy-NL/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-fy-NL/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-fy-NL/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-fy-NL/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-fy-NL/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-fy-NL/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-fy-NL/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-fy-NL/toolkit/toolkit/pdfviewer/viewer.ftl | 59 firefox-esr-140.6.0esr/l10n-fy-NL/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-ga-IE/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-ga-IE/browser/browser/preferences/preferences.ftl | 32 firefox-esr-140.6.0esr/l10n-ga-IE/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-ga-IE/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-ga-IE/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-gd/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-gd/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-gd/browser/browser/preferences/preferences.ftl | 49 firefox-esr-140.6.0esr/l10n-gd/browser/browser/webauthnDialog.ftl | 36 firefox-esr-140.6.0esr/l10n-gd/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-gd/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-gd/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-gd/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-gl/browser/browser/browser.ftl | 37 firefox-esr-140.6.0esr/l10n-gl/browser/browser/browserContext.ftl | 2 firefox-esr-140.6.0esr/l10n-gl/browser/browser/contextual-manager.ftl | 7 firefox-esr-140.6.0esr/l10n-gl/browser/browser/featureCallout.ftl | 4 firefox-esr-140.6.0esr/l10n-gl/browser/browser/firefoxRelay.ftl | 2 firefox-esr-140.6.0esr/l10n-gl/browser/browser/genai.ftl | 6 firefox-esr-140.6.0esr/l10n-gl/browser/browser/newtab/asrouter.ftl | 26 firefox-esr-140.6.0esr/l10n-gl/browser/browser/newtab/newtab.ftl | 50 firefox-esr-140.6.0esr/l10n-gl/browser/browser/newtab/onboarding.ftl | 14 firefox-esr-140.6.0esr/l10n-gl/browser/browser/policies/policies-descriptions.ftl | 1 firefox-esr-140.6.0esr/l10n-gl/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-gl/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-gl/browser/browser/preferences/preferences.ftl | 68 firefox-esr-140.6.0esr/l10n-gl/browser/browser/profiles.ftl | 74 firefox-esr-140.6.0esr/l10n-gl/browser/browser/tabbrowser.ftl | 4 firefox-esr-140.6.0esr/l10n-gl/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-gl/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-gl/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-gl/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-gl/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-gl/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-gn/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-gn/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-gn/browser/browser/backupSettings.ftl | 251 firefox-esr-140.6.0esr/l10n-gn/browser/browser/browser.ftl | 54 firefox-esr-140.6.0esr/l10n-gn/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-gn/browser/browser/contextual-manager.ftl | 10 firefox-esr-140.6.0esr/l10n-gn/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-gn/browser/browser/featureCallout.ftl | 33 firefox-esr-140.6.0esr/l10n-gn/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-gn/browser/browser/genai.ftl | 12 firefox-esr-140.6.0esr/l10n-gn/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-gn/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-gn/browser/browser/newtab/asrouter.ftl | 36 firefox-esr-140.6.0esr/l10n-gn/browser/browser/newtab/newtab.ftl | 28 firefox-esr-140.6.0esr/l10n-gn/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-gn/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-gn/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-gn/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-gn/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-gn/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-gn/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-gn/browser/browser/preferences/permissions.ftl | 15 firefox-esr-140.6.0esr/l10n-gn/browser/browser/preferences/preferences.ftl | 200 firefox-esr-140.6.0esr/l10n-gn/browser/browser/profiles.ftl | 116 firefox-esr-140.6.0esr/l10n-gn/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-gn/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-gn/browser/browser/tabContextMenu.ftl | 4 firefox-esr-140.6.0esr/l10n-gn/browser/browser/tabbrowser.ftl | 31 firefox-esr-140.6.0esr/l10n-gn/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-gn/browser/browser/unexpectedScript.ftl | 7 firefox-esr-140.6.0esr/l10n-gn/browser/browser/unifiedExtensions.ftl | 32 firefox-esr-140.6.0esr/l10n-gn/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-gn/browser/chrome/browser/browser.properties | 11 firefox-esr-140.6.0esr/l10n-gn/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-gn/devtools/client/debugger.properties | 9 firefox-esr-140.6.0esr/l10n-gn/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-gn/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-gn/devtools/client/tooltips.ftl | 4 firefox-esr-140.6.0esr/l10n-gn/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-gn/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-gn/dom/chrome/dom/dom.properties | 9 firefox-esr-140.6.0esr/l10n-gn/dom/chrome/security/security.properties | 1 firefox-esr-140.6.0esr/l10n-gn/toolkit/toolkit/about/aboutAddons.ftl | 4 firefox-esr-140.6.0esr/l10n-gn/toolkit/toolkit/about/aboutGlean.ftl | 44 firefox-esr-140.6.0esr/l10n-gn/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-gn/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-gn/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-gn/toolkit/toolkit/contentanalysis/contentanalysis.ftl | 3 firefox-esr-140.6.0esr/l10n-gn/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-gn/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-gn/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-gn/toolkit/toolkit/global/handlerDialog.ftl | 3 firefox-esr-140.6.0esr/l10n-gn/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-gn/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-gn/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-gn/toolkit/toolkit/neterror/certError.ftl | 3 firefox-esr-140.6.0esr/l10n-gn/toolkit/toolkit/neterror/netError.ftl | 8 firefox-esr-140.6.0esr/l10n-gn/toolkit/toolkit/pdfviewer/viewer.ftl | 53 firefox-esr-140.6.0esr/l10n-gn/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-gu-IN/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-gu-IN/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-gu-IN/browser/browser/preferences/preferences.ftl | 34 firefox-esr-140.6.0esr/l10n-gu-IN/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-gu-IN/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-gu-IN/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-he/browser/browser/addonNotifications.ftl | 3 firefox-esr-140.6.0esr/l10n-he/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-he/browser/browser/backupSettings.ftl | 251 firefox-esr-140.6.0esr/l10n-he/browser/browser/browser.ftl | 54 firefox-esr-140.6.0esr/l10n-he/browser/browser/browserContext.ftl | 8 firefox-esr-140.6.0esr/l10n-he/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-he/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-he/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-he/browser/browser/firefoxRelay.ftl | 35 firefox-esr-140.6.0esr/l10n-he/browser/browser/fxviewTabList.ftl | 2 firefox-esr-140.6.0esr/l10n-he/browser/browser/genai.ftl | 11 firefox-esr-140.6.0esr/l10n-he/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-he/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-he/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-he/browser/browser/newtab/newtab.ftl | 27 firefox-esr-140.6.0esr/l10n-he/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-he/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-he/browser/browser/policies/policies-descriptions.ftl | 7 firefox-esr-140.6.0esr/l10n-he/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-he/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-he/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-he/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-he/browser/browser/preferences/permissions.ftl | 25 firefox-esr-140.6.0esr/l10n-he/browser/browser/preferences/preferences.ftl | 234 firefox-esr-140.6.0esr/l10n-he/browser/browser/profiles.ftl | 118 firefox-esr-140.6.0esr/l10n-he/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-he/browser/browser/safeMode.ftl | 2 firefox-esr-140.6.0esr/l10n-he/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-he/browser/browser/sync.ftl | 10 firefox-esr-140.6.0esr/l10n-he/browser/browser/tabContextMenu.ftl | 13 firefox-esr-140.6.0esr/l10n-he/browser/browser/tabbrowser.ftl | 42 firefox-esr-140.6.0esr/l10n-he/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-he/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-he/browser/browser/translations.ftl | 4 firefox-esr-140.6.0esr/l10n-he/browser/browser/unifiedExtensions.ftl | 28 firefox-esr-140.6.0esr/l10n-he/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-he/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-he/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-he/browser/installer/custom.properties | 6 firefox-esr-140.6.0esr/l10n-he/devtools/client/aboutdebugging.ftl | 2 firefox-esr-140.6.0esr/l10n-he/devtools/client/debugger.properties | 2 firefox-esr-140.6.0esr/l10n-he/devtools/client/dom.properties | 2 firefox-esr-140.6.0esr/l10n-he/devtools/client/netmonitor.properties | 2 firefox-esr-140.6.0esr/l10n-he/devtools/client/storage.ftl | 7 firefox-esr-140.6.0esr/l10n-he/devtools/client/toolbox-options.ftl | 18 firefox-esr-140.6.0esr/l10n-he/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-he/devtools/shared/styleinspector.properties | 11 firefox-esr-140.6.0esr/l10n-he/dom/chrome/dom/dom.properties | 5 firefox-esr-140.6.0esr/l10n-he/dom/chrome/layout/xmlparser.properties | 4 firefox-esr-140.6.0esr/l10n-he/toolkit/chrome/global/resetProfile.properties | 2 firefox-esr-140.6.0esr/l10n-he/toolkit/toolkit/about/aboutAddons.ftl | 14 firefox-esr-140.6.0esr/l10n-he/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-he/toolkit/toolkit/about/aboutNetworking.ftl | 4 firefox-esr-140.6.0esr/l10n-he/toolkit/toolkit/about/aboutWebrtc.ftl | 4 firefox-esr-140.6.0esr/l10n-he/toolkit/toolkit/about/certviewer.ftl | 6 firefox-esr-140.6.0esr/l10n-he/toolkit/toolkit/about/url-classifier.ftl | 3 firefox-esr-140.6.0esr/l10n-he/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-he/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-he/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-he/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-he/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-he/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-he/toolkit/toolkit/global/resetProfile.ftl | 6 firefox-esr-140.6.0esr/l10n-he/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-he/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-he/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-he/toolkit/toolkit/pdfviewer/viewer.ftl | 53 firefox-esr-140.6.0esr/l10n-he/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-hi-IN/browser/browser/newtab/newtab.ftl | 2 firefox-esr-140.6.0esr/l10n-hi-IN/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-hi-IN/browser/browser/preferences/formAutofill.ftl | 51 firefox-esr-140.6.0esr/l10n-hi-IN/browser/browser/preferences/preferences.ftl | 38 firefox-esr-140.6.0esr/l10n-hi-IN/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-hi-IN/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-hi-IN/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-hi-IN/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-hr/browser/browser/browser.ftl | 4 firefox-esr-140.6.0esr/l10n-hr/browser/browser/contextual-manager.ftl | 2 firefox-esr-140.6.0esr/l10n-hr/browser/browser/newtab/newtab.ftl | 10 firefox-esr-140.6.0esr/l10n-hr/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-hr/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-hr/browser/browser/preferences/preferences.ftl | 62 firefox-esr-140.6.0esr/l10n-hr/browser/browser/profiles.ftl | 17 firefox-esr-140.6.0esr/l10n-hr/browser/browser/tabbrowser.ftl | 4 firefox-esr-140.6.0esr/l10n-hr/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-hr/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-hr/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-hr/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-hr/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-hr/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/addonNotifications.ftl | 3 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/appmenu.ftl | 8 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/backupSettings.ftl | 253 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/browser.ftl | 53 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/browserContext.ftl | 6 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/fxviewTabList.ftl | 2 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/genai.ftl | 6 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/newtab/newtab.ftl | 25 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/preferences/containers.ftl | 4 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/preferences/preferences.ftl | 228 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/profiles.ftl | 116 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/sync.ftl | 12 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/tabContextMenu.ftl | 15 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/tabbrowser.ftl | 42 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/translations.ftl | 2 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/unifiedExtensions.ftl | 34 firefox-esr-140.6.0esr/l10n-hsb/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-hsb/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-hsb/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-hsb/browser/installer/custom.properties | 2 firefox-esr-140.6.0esr/l10n-hsb/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-hsb/devtools/client/jsonview.properties | 7 firefox-esr-140.6.0esr/l10n-hsb/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-hsb/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-hsb/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-hsb/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-hsb/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-hsb/dom/chrome/dom/dom.properties | 11 firefox-esr-140.6.0esr/l10n-hsb/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-hsb/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-hsb/toolkit/toolkit/about/aboutAddons.ftl | 14 firefox-esr-140.6.0esr/l10n-hsb/toolkit/toolkit/about/aboutGlean.ftl | 40 firefox-esr-140.6.0esr/l10n-hsb/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-hsb/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-hsb/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-hsb/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-hsb/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-hsb/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-hsb/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-hsb/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-hsb/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-hsb/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-hsb/toolkit/toolkit/global/wizard.ftl | 2 firefox-esr-140.6.0esr/l10n-hsb/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-hsb/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-hsb/toolkit/toolkit/pdfviewer/viewer.ftl | 55 firefox-esr-140.6.0esr/l10n-hsb/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-hu/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-hu/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-hu/browser/browser/backupSettings.ftl | 251 firefox-esr-140.6.0esr/l10n-hu/browser/browser/browser.ftl | 49 firefox-esr-140.6.0esr/l10n-hu/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-hu/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-hu/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-hu/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-hu/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-hu/browser/browser/genai.ftl | 20 firefox-esr-140.6.0esr/l10n-hu/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-hu/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-hu/browser/browser/newtab/asrouter.ftl | 27 firefox-esr-140.6.0esr/l10n-hu/browser/browser/newtab/newtab.ftl | 32 firefox-esr-140.6.0esr/l10n-hu/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-hu/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-hu/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-hu/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-hu/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-hu/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-hu/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-hu/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-hu/browser/browser/preferences/preferences.ftl | 204 firefox-esr-140.6.0esr/l10n-hu/browser/browser/profiles.ftl | 116 firefox-esr-140.6.0esr/l10n-hu/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-hu/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-hu/browser/browser/tabContextMenu.ftl | 4 firefox-esr-140.6.0esr/l10n-hu/browser/browser/tabbrowser.ftl | 31 firefox-esr-140.6.0esr/l10n-hu/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-hu/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-hu/browser/browser/unexpectedScript.ftl | 6 firefox-esr-140.6.0esr/l10n-hu/browser/browser/unifiedExtensions.ftl | 32 firefox-esr-140.6.0esr/l10n-hu/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-hu/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-hu/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-hu/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-hu/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-hu/devtools/client/styleeditor.ftl | 2 firefox-esr-140.6.0esr/l10n-hu/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-hu/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-hu/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-hu/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-hu/dom/chrome/dom/dom.properties | 5 firefox-esr-140.6.0esr/l10n-hu/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-hu/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-hu/toolkit/toolkit/about/aboutAddons.ftl | 14 firefox-esr-140.6.0esr/l10n-hu/toolkit/toolkit/about/aboutGlean.ftl | 38 firefox-esr-140.6.0esr/l10n-hu/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-hu/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-hu/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-hu/toolkit/toolkit/firefoxlabs/features.ftl | 8 firefox-esr-140.6.0esr/l10n-hu/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-hu/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-hu/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-hu/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-hu/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-hu/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-hu/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-hu/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-hu/toolkit/toolkit/pdfviewer/viewer.ftl | 53 firefox-esr-140.6.0esr/l10n-hu/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/aboutLogins.ftl | 20 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/aboutPrivateBrowsing.ftl | 4 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/aboutTabCrashed.ftl | 2 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/addonNotifications.ftl | 5 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/allTabsMenu.ftl | 4 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/appMenuNotifications.ftl | 2 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/appmenu.ftl | 4 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/backgroundtasks/defaultagent.ftl | 2 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/backupSettings.ftl | 207 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/browser.ftl | 146 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/browserContext.ftl | 9 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/clearDataForSite.ftl | 4 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/contextual-manager.ftl | 44 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/customkeys.ftl | 24 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/downloads.ftl | 8 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/featureCallout.ftl | 23 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/genai.ftl | 32 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/menubar.ftl | 5 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/migrationWizard.ftl | 10 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/newtab/asrouter.ftl | 53 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/newtab/newtab.ftl | 96 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/newtab/onboarding.ftl | 73 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/pageInfo.ftl | 2 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/places.ftl | 4 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/placesPrompts.ftl | 4 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/policies/policies-descriptions.ftl | 4 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/preferences/fxaPairDevice.ftl | 5 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/preferences/permissions.ftl | 12 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/preferences/preferences.ftl | 136 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/preferences/siteDataSettings.ftl | 2 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/profiles.ftl | 87 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/protections.ftl | 6 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/protectionsPanel.ftl | 2 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/reportBrokenSite.ftl | 14 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/safebrowsing/blockedSite.ftl | 2 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/screenshots.ftl | 2 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/search.ftl | 11 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/setDesktopBackground.ftl | 2 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/sidebar.ftl | 28 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/siteProtections.ftl | 6 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/syncedTabs.ftl | 5 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/tabbrowser.ftl | 129 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/taskbartabs.ftl | 48 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/toolbarDropHandler.ftl | 2 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/translations.ftl | 13 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/unexpectedScript.ftl | 14 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-hy-AM/browser/browser/webrtcIndicator.ftl | 3 firefox-esr-140.6.0esr/l10n-hy-AM/browser/chrome/browser/browser.properties | 14 firefox-esr-140.6.0esr/l10n-hy-AM/browser/chrome/browser/downloads/downloads.properties | 6 firefox-esr-140.6.0esr/l10n-hy-AM/browser/chrome/overrides/appstrings.properties | 6 firefox-esr-140.6.0esr/l10n-hy-AM/browser/installer/override.properties | 4 firefox-esr-140.6.0esr/l10n-hy-AM/browser/pdfviewer/viewer.properties | 8 firefox-esr-140.6.0esr/l10n-hy-AM/devtools/client/debugger.properties | 14 firefox-esr-140.6.0esr/l10n-hy-AM/devtools/client/memory.properties | 2 firefox-esr-140.6.0esr/l10n-hy-AM/devtools/client/netmonitor.properties | 10 firefox-esr-140.6.0esr/l10n-hy-AM/devtools/client/styleeditor.properties | 2 firefox-esr-140.6.0esr/l10n-hy-AM/devtools/client/toolbox-options.ftl | 6 firefox-esr-140.6.0esr/l10n-hy-AM/devtools/client/webconsole.properties | 3 firefox-esr-140.6.0esr/l10n-hy-AM/devtools/shared/screenshot.properties | 6 firefox-esr-140.6.0esr/l10n-hy-AM/dom/chrome/appstrings.properties | 4 firefox-esr-140.6.0esr/l10n-hy-AM/dom/chrome/layout/printing.properties | 2 firefox-esr-140.6.0esr/l10n-hy-AM/dom/chrome/nsWebBrowserPersist.properties | 8 firefox-esr-140.6.0esr/l10n-hy-AM/dom/dom/XMLPrettyPrint.ftl | 2 firefox-esr-140.6.0esr/l10n-hy-AM/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-hy-AM/security/manager/security/pippki/pippki.ftl | 1 firefox-esr-140.6.0esr/l10n-hy-AM/toolkit/chrome/global/commonDialogs.properties | 2 firefox-esr-140.6.0esr/l10n-hy-AM/toolkit/chrome/places/places.properties | 2 firefox-esr-140.6.0esr/l10n-hy-AM/toolkit/toolkit/about/aboutAddons.ftl | 18 firefox-esr-140.6.0esr/l10n-hy-AM/toolkit/toolkit/about/aboutSupport.ftl | 3 firefox-esr-140.6.0esr/l10n-hy-AM/toolkit/toolkit/about/aboutTelemetry.ftl | 2 firefox-esr-140.6.0esr/l10n-hy-AM/toolkit/toolkit/about/aboutWebrtc.ftl | 5 firefox-esr-140.6.0esr/l10n-hy-AM/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-hy-AM/toolkit/toolkit/about/config.ftl | 4 firefox-esr-140.6.0esr/l10n-hy-AM/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-hy-AM/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-hy-AM/toolkit/toolkit/global/handlerDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-hy-AM/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-hy-AM/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-hy-AM/toolkit/toolkit/global/videocontrols.ftl | 6 firefox-esr-140.6.0esr/l10n-hy-AM/toolkit/toolkit/main-window/findbar.ftl | 2 firefox-esr-140.6.0esr/l10n-hy-AM/toolkit/toolkit/pdfviewer/viewer.ftl | 17 firefox-esr-140.6.0esr/l10n-hy-AM/toolkit/toolkit/pictureinpicture/pictureinpicture.ftl | 24 firefox-esr-140.6.0esr/l10n-ia/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-ia/browser/browser/appMenuNotifications.ftl | 2 firefox-esr-140.6.0esr/l10n-ia/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-ia/browser/browser/backupSettings.ftl | 251 firefox-esr-140.6.0esr/l10n-ia/browser/browser/browser.ftl | 49 firefox-esr-140.6.0esr/l10n-ia/browser/browser/browserContext.ftl | 6 firefox-esr-140.6.0esr/l10n-ia/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-ia/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-ia/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-ia/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-ia/browser/browser/fxviewTabList.ftl | 2 firefox-esr-140.6.0esr/l10n-ia/browser/browser/genai.ftl | 6 firefox-esr-140.6.0esr/l10n-ia/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-ia/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-ia/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-ia/browser/browser/newtab/newtab.ftl | 25 firefox-esr-140.6.0esr/l10n-ia/browser/browser/newtab/onboarding.ftl | 95 firefox-esr-140.6.0esr/l10n-ia/browser/browser/pageInfo.ftl | 2 firefox-esr-140.6.0esr/l10n-ia/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-ia/browser/browser/places.ftl | 12 firefox-esr-140.6.0esr/l10n-ia/browser/browser/placesPrompts.ftl | 8 firefox-esr-140.6.0esr/l10n-ia/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-ia/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-ia/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-ia/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-ia/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-ia/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-ia/browser/browser/preferences/preferences.ftl | 228 firefox-esr-140.6.0esr/l10n-ia/browser/browser/profiles.ftl | 114 firefox-esr-140.6.0esr/l10n-ia/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-ia/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-ia/browser/browser/sync.ftl | 10 firefox-esr-140.6.0esr/l10n-ia/browser/browser/tabContextMenu.ftl | 13 firefox-esr-140.6.0esr/l10n-ia/browser/browser/tabbrowser.ftl | 42 firefox-esr-140.6.0esr/l10n-ia/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-ia/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-ia/browser/browser/unifiedExtensions.ftl | 32 firefox-esr-140.6.0esr/l10n-ia/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-ia/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-ia/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-ia/browser/crashreporter/crashreporter-override.ini | 4 firefox-esr-140.6.0esr/l10n-ia/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-ia/devtools/client/jsonview.properties | 7 firefox-esr-140.6.0esr/l10n-ia/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-ia/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-ia/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-ia/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-ia/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-ia/dom/chrome/dom/dom.properties | 11 firefox-esr-140.6.0esr/l10n-ia/dom/chrome/layout/htmlparser.properties | 2 firefox-esr-140.6.0esr/l10n-ia/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-ia/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-ia/security/manager/chrome/pipnss/pipnss.properties | 2 firefox-esr-140.6.0esr/l10n-ia/security/manager/chrome/pippki/pippki.properties | 2 firefox-esr-140.6.0esr/l10n-ia/security/manager/security/certificates/certManager.ftl | 28 firefox-esr-140.6.0esr/l10n-ia/security/manager/security/pippki/pippki.ftl | 10 firefox-esr-140.6.0esr/l10n-ia/toolkit/toolkit/about/aboutAddons.ftl | 18 firefox-esr-140.6.0esr/l10n-ia/toolkit/toolkit/about/aboutGlean.ftl | 40 firefox-esr-140.6.0esr/l10n-ia/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-ia/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-ia/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-ia/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-ia/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-ia/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-ia/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-ia/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-ia/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-ia/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-ia/toolkit/toolkit/main-window/findbar.ftl | 2 firefox-esr-140.6.0esr/l10n-ia/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-ia/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-ia/toolkit/toolkit/pdfviewer/viewer.ftl | 53 firefox-esr-140.6.0esr/l10n-ia/toolkit/toolkit/preferences/preferences.ftl | 2 firefox-esr-140.6.0esr/l10n-ia/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-id/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-id/browser/browser/backupSettings.ftl | 88 firefox-esr-140.6.0esr/l10n-id/browser/browser/browser.ftl | 50 firefox-esr-140.6.0esr/l10n-id/browser/browser/browserContext.ftl | 6 firefox-esr-140.6.0esr/l10n-id/browser/browser/contextual-manager.ftl | 20 firefox-esr-140.6.0esr/l10n-id/browser/browser/featureCallout.ftl | 53 firefox-esr-140.6.0esr/l10n-id/browser/browser/genai.ftl | 100 firefox-esr-140.6.0esr/l10n-id/browser/browser/menubar.ftl | 10 firefox-esr-140.6.0esr/l10n-id/browser/browser/newtab/asrouter.ftl | 22 firefox-esr-140.6.0esr/l10n-id/browser/browser/newtab/newtab.ftl | 95 firefox-esr-140.6.0esr/l10n-id/browser/browser/newtab/onboarding.ftl | 6 firefox-esr-140.6.0esr/l10n-id/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-id/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-id/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-id/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-id/browser/browser/preferences/permissions.ftl | 10 firefox-esr-140.6.0esr/l10n-id/browser/browser/preferences/preferences.ftl | 108 firefox-esr-140.6.0esr/l10n-id/browser/browser/profiles.ftl | 121 firefox-esr-140.6.0esr/l10n-id/browser/browser/sanitize.ftl | 1 firefox-esr-140.6.0esr/l10n-id/browser/browser/screenshots.ftl | 5 firefox-esr-140.6.0esr/l10n-id/browser/browser/search.ftl | 45 firefox-esr-140.6.0esr/l10n-id/browser/browser/sidebar.ftl | 40 firefox-esr-140.6.0esr/l10n-id/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-id/browser/browser/tabContextMenu.ftl | 7 firefox-esr-140.6.0esr/l10n-id/browser/browser/tabbrowser.ftl | 27 firefox-esr-140.6.0esr/l10n-id/browser/browser/taskbartabs.ftl | 50 firefox-esr-140.6.0esr/l10n-id/browser/browser/termsofuse.ftl | 21 firefox-esr-140.6.0esr/l10n-id/browser/browser/toolbarContextMenu.ftl | 4 firefox-esr-140.6.0esr/l10n-id/browser/browser/unexpectedScript.ftl | 33 firefox-esr-140.6.0esr/l10n-id/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-id/browser/browser/webrtc-preview.ftl | 6 firefox-esr-140.6.0esr/l10n-id/browser/chrome/browser/browser.properties | 22 firefox-esr-140.6.0esr/l10n-id/browser/chrome/browser/downloads/downloads.properties | 5 firefox-esr-140.6.0esr/l10n-id/devtools/client/debugger.properties | 34 firefox-esr-140.6.0esr/l10n-id/devtools/client/inspector.properties | 8 firefox-esr-140.6.0esr/l10n-id/devtools/client/styleeditor.ftl | 4 firefox-esr-140.6.0esr/l10n-id/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-id/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-id/devtools/shared/styleinspector.properties | 12 firefox-esr-140.6.0esr/l10n-id/dom/chrome/dom/dom.properties | 19 firefox-esr-140.6.0esr/l10n-id/dom/chrome/security/security.properties | 12 firefox-esr-140.6.0esr/l10n-id/netwerk/necko.properties | 13 firefox-esr-140.6.0esr/l10n-id/security/manager/security/pippki/pippki.ftl | 2 firefox-esr-140.6.0esr/l10n-id/toolkit/toolkit/about/aboutLogging.ftl | 55 firefox-esr-140.6.0esr/l10n-id/toolkit/toolkit/about/aboutNetworking.ftl | 1 firefox-esr-140.6.0esr/l10n-id/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-id/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-id/toolkit/toolkit/firefoxlabs/features.ftl | 41 firefox-esr-140.6.0esr/l10n-id/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-id/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-id/toolkit/toolkit/global/extensions.ftl | 31 firefox-esr-140.6.0esr/l10n-id/toolkit/toolkit/global/mozBoxBase.ftl | 6 firefox-esr-140.6.0esr/l10n-id/toolkit/toolkit/global/mozBreadcrumbGroup.ftl | 7 firefox-esr-140.6.0esr/l10n-id/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-id/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-id/toolkit/toolkit/global/textActions.ftl | 7 firefox-esr-140.6.0esr/l10n-id/toolkit/toolkit/neterror/certError.ftl | 29 firefox-esr-140.6.0esr/l10n-id/toolkit/toolkit/neterror/netError.ftl | 14 firefox-esr-140.6.0esr/l10n-id/toolkit/toolkit/pdfviewer/viewer.ftl | 23 firefox-esr-140.6.0esr/l10n-is/browser/browser/browser.ftl | 54 firefox-esr-140.6.0esr/l10n-is/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-is/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-is/browser/browser/downloads.ftl | 1 firefox-esr-140.6.0esr/l10n-is/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-is/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-is/browser/browser/newtab/newtab.ftl | 46 firefox-esr-140.6.0esr/l10n-is/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-is/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-is/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-is/browser/browser/preferences/moreFromMozilla.ftl | 7 firefox-esr-140.6.0esr/l10n-is/browser/browser/preferences/permissions.ftl | 6 firefox-esr-140.6.0esr/l10n-is/browser/browser/preferences/preferences.ftl | 62 firefox-esr-140.6.0esr/l10n-is/browser/browser/profiles.ftl | 16 firefox-esr-140.6.0esr/l10n-is/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-is/browser/browser/tabbrowser.ftl | 4 firefox-esr-140.6.0esr/l10n-is/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-is/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-is/browser/chrome/browser/browser.properties | 2 firefox-esr-140.6.0esr/l10n-is/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-is/toolkit/toolkit/about/certviewer.ftl | 3 firefox-esr-140.6.0esr/l10n-is/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-is/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-is/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-is/toolkit/toolkit/pdfviewer/viewer.ftl | 15 firefox-esr-140.6.0esr/l10n-it/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-it/browser/browser/appmenu.ftl | 11 firefox-esr-140.6.0esr/l10n-it/browser/browser/backupSettings.ftl | 251 firefox-esr-140.6.0esr/l10n-it/browser/browser/browser.ftl | 43 firefox-esr-140.6.0esr/l10n-it/browser/browser/browserContext.ftl | 6 firefox-esr-140.6.0esr/l10n-it/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-it/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-it/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-it/browser/browser/fxviewTabList.ftl | 2 firefox-esr-140.6.0esr/l10n-it/browser/browser/genai.ftl | 6 firefox-esr-140.6.0esr/l10n-it/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-it/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-it/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-it/browser/browser/newtab/newtab.ftl | 32 firefox-esr-140.6.0esr/l10n-it/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-it/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-it/browser/browser/policies/policies-descriptions.ftl | 7 firefox-esr-140.6.0esr/l10n-it/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-it/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-it/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-it/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-it/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-it/browser/browser/preferences/preferences.ftl | 272 firefox-esr-140.6.0esr/l10n-it/browser/browser/profiles.ftl | 44 firefox-esr-140.6.0esr/l10n-it/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-it/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-it/browser/browser/sync.ftl | 9 firefox-esr-140.6.0esr/l10n-it/browser/browser/tabContextMenu.ftl | 12 firefox-esr-140.6.0esr/l10n-it/browser/browser/tabbrowser.ftl | 75 firefox-esr-140.6.0esr/l10n-it/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-it/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-it/browser/browser/unifiedExtensions.ftl | 32 firefox-esr-140.6.0esr/l10n-it/browser/chrome/browser/browser.properties | 9 firefox-esr-140.6.0esr/l10n-it/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-it/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-it/devtools/client/jsonview.properties | 7 firefox-esr-140.6.0esr/l10n-it/devtools/client/perftools.ftl | 2 firefox-esr-140.6.0esr/l10n-it/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-it/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-it/devtools/client/tooltips.ftl | 3 firefox-esr-140.6.0esr/l10n-it/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-it/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-it/dom/chrome/dom/dom.properties | 12 firefox-esr-140.6.0esr/l10n-it/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-it/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-it/toolkit/toolkit/about/aboutAddons.ftl | 15 firefox-esr-140.6.0esr/l10n-it/toolkit/toolkit/about/aboutGlean.ftl | 42 firefox-esr-140.6.0esr/l10n-it/toolkit/toolkit/about/certviewer.ftl | 3 firefox-esr-140.6.0esr/l10n-it/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-it/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-it/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-it/toolkit/toolkit/global/datepicker.ftl | 2 firefox-esr-140.6.0esr/l10n-it/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-it/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-it/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-it/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-it/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-it/toolkit/toolkit/neterror/certError.ftl | 15 firefox-esr-140.6.0esr/l10n-it/toolkit/toolkit/neterror/netError.ftl | 12 firefox-esr-140.6.0esr/l10n-it/toolkit/toolkit/pdfviewer/viewer.ftl | 57 firefox-esr-140.6.0esr/l10n-it/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-ja/browser/browser/appmenu.ftl | 4 firefox-esr-140.6.0esr/l10n-ja/browser/browser/backupSettings.ftl | 246 firefox-esr-140.6.0esr/l10n-ja/browser/browser/browser.ftl | 55 firefox-esr-140.6.0esr/l10n-ja/browser/browser/browserContext.ftl | 5 firefox-esr-140.6.0esr/l10n-ja/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-ja/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-ja/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-ja/browser/browser/genai.ftl | 6 firefox-esr-140.6.0esr/l10n-ja/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-ja/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-ja/browser/browser/newtab/asrouter.ftl | 30 firefox-esr-140.6.0esr/l10n-ja/browser/browser/newtab/newtab.ftl | 36 firefox-esr-140.6.0esr/l10n-ja/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-ja/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-ja/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-ja/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-ja/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-ja/browser/browser/preferences/fxaPairDevice.ftl | 3 firefox-esr-140.6.0esr/l10n-ja/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-ja/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-ja/browser/browser/preferences/preferences.ftl | 209 firefox-esr-140.6.0esr/l10n-ja/browser/browser/profiles.ftl | 150 firefox-esr-140.6.0esr/l10n-ja/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-ja/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-ja/browser/browser/tabbrowser.ftl | 31 firefox-esr-140.6.0esr/l10n-ja/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-ja/browser/browser/termsofuse.ftl | 3 firefox-esr-140.6.0esr/l10n-ja/browser/browser/unifiedExtensions.ftl | 11 firefox-esr-140.6.0esr/l10n-ja/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-ja/browser/chrome/browser/browser.properties | 44 firefox-esr-140.6.0esr/l10n-ja/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-ja/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-ja/devtools/client/inspector.properties | 2 firefox-esr-140.6.0esr/l10n-ja/devtools/client/toolbox-options.ftl | 8 firefox-esr-140.6.0esr/l10n-ja/devtools/client/tooltips.ftl | 20 firefox-esr-140.6.0esr/l10n-ja/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-ja/devtools/shared/styleinspector.properties | 11 firefox-esr-140.6.0esr/l10n-ja/dom/chrome/dom/dom.properties | 11 firefox-esr-140.6.0esr/l10n-ja/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-ja/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-ja/toolkit/toolkit/about/aboutAddons.ftl | 22 firefox-esr-140.6.0esr/l10n-ja/toolkit/toolkit/about/aboutGlean.ftl | 38 firefox-esr-140.6.0esr/l10n-ja/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-ja/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-ja/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-ja/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-ja/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-ja/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-ja/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-ja/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-ja/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-ja/toolkit/toolkit/global/textActions.ftl | 4 firefox-esr-140.6.0esr/l10n-ja/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-ja/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-ja/toolkit/toolkit/pdfviewer/viewer.ftl | 51 firefox-esr-140.6.0esr/l10n-ja/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-ka/browser/browser/addonNotifications.ftl | 3 firefox-esr-140.6.0esr/l10n-ka/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-ka/browser/browser/backupSettings.ftl | 251 firefox-esr-140.6.0esr/l10n-ka/browser/browser/browser.ftl | 58 firefox-esr-140.6.0esr/l10n-ka/browser/browser/browserContext.ftl | 6 firefox-esr-140.6.0esr/l10n-ka/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-ka/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-ka/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-ka/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-ka/browser/browser/fxviewTabList.ftl | 2 firefox-esr-140.6.0esr/l10n-ka/browser/browser/genai.ftl | 14 firefox-esr-140.6.0esr/l10n-ka/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-ka/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-ka/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-ka/browser/browser/newtab/newtab.ftl | 27 firefox-esr-140.6.0esr/l10n-ka/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-ka/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-ka/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-ka/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-ka/browser/browser/preferences/formAutofill.ftl | 57 firefox-esr-140.6.0esr/l10n-ka/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-ka/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-ka/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-ka/browser/browser/preferences/preferences.ftl | 234 firefox-esr-140.6.0esr/l10n-ka/browser/browser/preonboarding.ftl | 2 firefox-esr-140.6.0esr/l10n-ka/browser/browser/profiles.ftl | 118 firefox-esr-140.6.0esr/l10n-ka/browser/browser/protections.ftl | 4 firefox-esr-140.6.0esr/l10n-ka/browser/browser/protectionsPanel.ftl | 4 firefox-esr-140.6.0esr/l10n-ka/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-ka/browser/browser/search.ftl | 2 firefox-esr-140.6.0esr/l10n-ka/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-ka/browser/browser/sync.ftl | 9 firefox-esr-140.6.0esr/l10n-ka/browser/browser/tabContextMenu.ftl | 12 firefox-esr-140.6.0esr/l10n-ka/browser/browser/tabbrowser.ftl | 42 firefox-esr-140.6.0esr/l10n-ka/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-ka/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-ka/browser/browser/translations.ftl | 2 firefox-esr-140.6.0esr/l10n-ka/browser/browser/unifiedExtensions.ftl | 38 firefox-esr-140.6.0esr/l10n-ka/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-ka/browser/chrome/browser/browser.properties | 12 firefox-esr-140.6.0esr/l10n-ka/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-ka/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-ka/devtools/client/jsonview.properties | 7 firefox-esr-140.6.0esr/l10n-ka/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-ka/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-ka/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-ka/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-ka/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-ka/dom/chrome/dom/dom.properties | 11 firefox-esr-140.6.0esr/l10n-ka/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-ka/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-ka/security/manager/chrome/pipnss/nsserrors.properties | 2 firefox-esr-140.6.0esr/l10n-ka/toolkit/toolkit/about/aboutAddons.ftl | 16 firefox-esr-140.6.0esr/l10n-ka/toolkit/toolkit/about/aboutGlean.ftl | 80 firefox-esr-140.6.0esr/l10n-ka/toolkit/toolkit/about/aboutLogging.ftl | 37 firefox-esr-140.6.0esr/l10n-ka/toolkit/toolkit/about/aboutReader.ftl | 2 firefox-esr-140.6.0esr/l10n-ka/toolkit/toolkit/about/certviewer.ftl | 9 firefox-esr-140.6.0esr/l10n-ka/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-ka/toolkit/toolkit/featuregates/features.ftl | 2 firefox-esr-140.6.0esr/l10n-ka/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-ka/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-ka/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-ka/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-ka/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-ka/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-ka/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-ka/toolkit/toolkit/neterror/certError.ftl | 11 firefox-esr-140.6.0esr/l10n-ka/toolkit/toolkit/neterror/netError.ftl | 12 firefox-esr-140.6.0esr/l10n-ka/toolkit/toolkit/pdfviewer/viewer.ftl | 61 firefox-esr-140.6.0esr/l10n-ka/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-kab/browser/browser/appmenu.ftl | 5 firefox-esr-140.6.0esr/l10n-kab/browser/browser/browser.ftl | 75 firefox-esr-140.6.0esr/l10n-kab/browser/browser/browserContext.ftl | 4 firefox-esr-140.6.0esr/l10n-kab/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-kab/browser/browser/downloads.ftl | 3 firefox-esr-140.6.0esr/l10n-kab/browser/browser/featureCallout.ftl | 4 firefox-esr-140.6.0esr/l10n-kab/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-kab/browser/browser/genai.ftl | 30 firefox-esr-140.6.0esr/l10n-kab/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-kab/browser/browser/menubar.ftl | 10 firefox-esr-140.6.0esr/l10n-kab/browser/browser/migrationWizard.ftl | 1 firefox-esr-140.6.0esr/l10n-kab/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-kab/browser/browser/newtab/newtab.ftl | 66 firefox-esr-140.6.0esr/l10n-kab/browser/browser/newtab/onboarding.ftl | 11 firefox-esr-140.6.0esr/l10n-kab/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-kab/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-kab/browser/browser/preferences/preferences.ftl | 92 firefox-esr-140.6.0esr/l10n-kab/browser/browser/profiles.ftl | 10 firefox-esr-140.6.0esr/l10n-kab/browser/browser/search.ftl | 35 firefox-esr-140.6.0esr/l10n-kab/browser/browser/sidebar.ftl | 25 firefox-esr-140.6.0esr/l10n-kab/browser/browser/tabbrowser.ftl | 17 firefox-esr-140.6.0esr/l10n-kab/browser/browser/taskbartabs.ftl | 50 firefox-esr-140.6.0esr/l10n-kab/browser/browser/termsofuse.ftl | 4 firefox-esr-140.6.0esr/l10n-kab/browser/browser/translations.ftl | 3 firefox-esr-140.6.0esr/l10n-kab/browser/browser/unexpectedScript.ftl | 17 firefox-esr-140.6.0esr/l10n-kab/browser/browser/webauthnDialog.ftl | 27 firefox-esr-140.6.0esr/l10n-kab/browser/browser/webrtc-preview.ftl | 6 firefox-esr-140.6.0esr/l10n-kab/browser/chrome/browser/downloads/downloads.properties | 3 firefox-esr-140.6.0esr/l10n-kab/devtools/client/perftools.ftl | 6 firefox-esr-140.6.0esr/l10n-kab/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-kab/devtools/client/webconsole.properties | 10 firefox-esr-140.6.0esr/l10n-kab/devtools/shared/styleinspector.properties | 1 firefox-esr-140.6.0esr/l10n-kab/dom/chrome/dom/dom.properties | 2 firefox-esr-140.6.0esr/l10n-kab/dom/chrome/security/csp.properties | 4 firefox-esr-140.6.0esr/l10n-kab/netwerk/necko.properties | 1 firefox-esr-140.6.0esr/l10n-kab/security/manager/security/pippki/pippki.ftl | 7 firefox-esr-140.6.0esr/l10n-kab/toolkit/crashreporter/crashreporter.ftl | 21 firefox-esr-140.6.0esr/l10n-kab/toolkit/toolkit/about/aboutAddons.ftl | 30 firefox-esr-140.6.0esr/l10n-kab/toolkit/toolkit/about/aboutReader.ftl | 15 firefox-esr-140.6.0esr/l10n-kab/toolkit/toolkit/about/aboutWebauthn.ftl | 2 firefox-esr-140.6.0esr/l10n-kab/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-kab/toolkit/toolkit/branding/brandings.ftl | 4 firefox-esr-140.6.0esr/l10n-kab/toolkit/toolkit/firefoxlabs/features.ftl | 14 firefox-esr-140.6.0esr/l10n-kab/toolkit/toolkit/formautofill/formAutofill.ftl | 12 firefox-esr-140.6.0esr/l10n-kab/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-kab/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-kab/toolkit/toolkit/global/handlerDialog.ftl | 3 firefox-esr-140.6.0esr/l10n-kab/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-kab/toolkit/toolkit/pdfviewer/viewer.ftl | 61 firefox-esr-140.6.0esr/l10n-kk/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-kk/browser/browser/backupSettings.ftl | 115 firefox-esr-140.6.0esr/l10n-kk/browser/browser/browser.ftl | 50 firefox-esr-140.6.0esr/l10n-kk/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-kk/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-kk/browser/browser/featureCallout.ftl | 11 firefox-esr-140.6.0esr/l10n-kk/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-kk/browser/browser/genai.ftl | 5 firefox-esr-140.6.0esr/l10n-kk/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-kk/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-kk/browser/browser/migrationWizard.ftl | 3 firefox-esr-140.6.0esr/l10n-kk/browser/browser/newtab/asrouter.ftl | 6 firefox-esr-140.6.0esr/l10n-kk/browser/browser/newtab/newtab.ftl | 33 firefox-esr-140.6.0esr/l10n-kk/browser/browser/newtab/onboarding.ftl | 51 firefox-esr-140.6.0esr/l10n-kk/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-kk/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-kk/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-kk/browser/browser/preferences/preferences.ftl | 111 firefox-esr-140.6.0esr/l10n-kk/browser/browser/profiles.ftl | 114 firefox-esr-140.6.0esr/l10n-kk/browser/browser/reportBrokenSite.ftl | 1 firefox-esr-140.6.0esr/l10n-kk/browser/browser/search.ftl | 1 firefox-esr-140.6.0esr/l10n-kk/browser/browser/tabbrowser.ftl | 10 firefox-esr-140.6.0esr/l10n-kk/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-kk/browser/browser/webrtc-preview.ftl | 5 firefox-esr-140.6.0esr/l10n-kk/browser/chrome/browser/browser.properties | 2 firefox-esr-140.6.0esr/l10n-kk/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-kk/dom/chrome/security/csp.properties | 7 firefox-esr-140.6.0esr/l10n-kk/toolkit/chrome/mozapps/profile/profileSelection.properties | 2 firefox-esr-140.6.0esr/l10n-kk/toolkit/toolkit/about/aboutAddons.ftl | 2 firefox-esr-140.6.0esr/l10n-kk/toolkit/toolkit/about/aboutGlean.ftl | 11 firefox-esr-140.6.0esr/l10n-kk/toolkit/toolkit/about/aboutLogging.ftl | 9 firefox-esr-140.6.0esr/l10n-kk/toolkit/toolkit/about/aboutNetworking.ftl | 1 firefox-esr-140.6.0esr/l10n-kk/toolkit/toolkit/about/aboutSupport.ftl | 3 firefox-esr-140.6.0esr/l10n-kk/toolkit/toolkit/about/certviewer.ftl | 3 firefox-esr-140.6.0esr/l10n-kk/toolkit/toolkit/firefoxlabs/features.ftl | 5 firefox-esr-140.6.0esr/l10n-kk/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-kk/toolkit/toolkit/global/datetimepicker.ftl | 90 firefox-esr-140.6.0esr/l10n-kk/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-kk/toolkit/toolkit/pdfviewer/viewer.ftl | 36 firefox-esr-140.6.0esr/l10n-km/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-km/browser/browser/preferences/formAutofill.ftl | 17 firefox-esr-140.6.0esr/l10n-km/browser/browser/preferences/preferences.ftl | 34 firefox-esr-140.6.0esr/l10n-km/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-km/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-km/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-kn/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-kn/browser/browser/preferences/formAutofill.ftl | 39 firefox-esr-140.6.0esr/l10n-kn/browser/browser/preferences/preferences.ftl | 32 firefox-esr-140.6.0esr/l10n-kn/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-kn/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-kn/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-ko/browser/browser/aboutDialog.ftl | 2 firefox-esr-140.6.0esr/l10n-ko/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-ko/browser/browser/appmenu.ftl | 13 firefox-esr-140.6.0esr/l10n-ko/browser/browser/backupSettings.ftl | 247 firefox-esr-140.6.0esr/l10n-ko/browser/browser/browser.ftl | 48 firefox-esr-140.6.0esr/l10n-ko/browser/browser/browserContext.ftl | 12 firefox-esr-140.6.0esr/l10n-ko/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-ko/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-ko/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-ko/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-ko/browser/browser/fxviewTabList.ftl | 2 firefox-esr-140.6.0esr/l10n-ko/browser/browser/genai.ftl | 10 firefox-esr-140.6.0esr/l10n-ko/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-ko/browser/browser/menubar.ftl | 5 firefox-esr-140.6.0esr/l10n-ko/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-ko/browser/browser/newtab/newtab.ftl | 38 firefox-esr-140.6.0esr/l10n-ko/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-ko/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-ko/browser/browser/places.ftl | 4 firefox-esr-140.6.0esr/l10n-ko/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-ko/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-ko/browser/browser/preferences/formAutofill.ftl | 61 firefox-esr-140.6.0esr/l10n-ko/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-ko/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-ko/browser/browser/preferences/permissions.ftl | 13 firefox-esr-140.6.0esr/l10n-ko/browser/browser/preferences/preferences.ftl | 296 firefox-esr-140.6.0esr/l10n-ko/browser/browser/preonboarding.ftl | 2 firefox-esr-140.6.0esr/l10n-ko/browser/browser/profiles.ftl | 116 firefox-esr-140.6.0esr/l10n-ko/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-ko/browser/browser/safebrowsing/blockedSite.ftl | 4 firefox-esr-140.6.0esr/l10n-ko/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-ko/browser/browser/sync.ftl | 9 firefox-esr-140.6.0esr/l10n-ko/browser/browser/tabContextMenu.ftl | 12 firefox-esr-140.6.0esr/l10n-ko/browser/browser/tabbrowser.ftl | 75 firefox-esr-140.6.0esr/l10n-ko/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-ko/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-ko/browser/browser/unifiedExtensions.ftl | 35 firefox-esr-140.6.0esr/l10n-ko/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-ko/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-ko/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-ko/browser/chrome/overrides/appstrings.properties | 2 firefox-esr-140.6.0esr/l10n-ko/browser/extensions/formautofill/formautofill.properties | 8 firefox-esr-140.6.0esr/l10n-ko/browser/pdfviewer/chrome.properties | 2 firefox-esr-140.6.0esr/l10n-ko/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-ko/devtools/client/inspector.properties | 2 firefox-esr-140.6.0esr/l10n-ko/devtools/client/jsonview.properties | 7 firefox-esr-140.6.0esr/l10n-ko/devtools/client/perftools.ftl | 2 firefox-esr-140.6.0esr/l10n-ko/devtools/client/responsive.properties | 2 firefox-esr-140.6.0esr/l10n-ko/devtools/client/startup.properties | 2 firefox-esr-140.6.0esr/l10n-ko/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-ko/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-ko/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-ko/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-ko/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-ko/dom/chrome/appstrings.properties | 2 firefox-esr-140.6.0esr/l10n-ko/dom/chrome/dom/dom.properties | 12 firefox-esr-140.6.0esr/l10n-ko/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-ko/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-ko/toolkit/toolkit/about/aboutAddons.ftl | 18 firefox-esr-140.6.0esr/l10n-ko/toolkit/toolkit/about/aboutGlean.ftl | 40 firefox-esr-140.6.0esr/l10n-ko/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-ko/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-ko/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-ko/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-ko/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-ko/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-ko/toolkit/toolkit/global/extensions.ftl | 2 firefox-esr-140.6.0esr/l10n-ko/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-ko/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-ko/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-ko/toolkit/toolkit/global/textActions.ftl | 10 firefox-esr-140.6.0esr/l10n-ko/toolkit/toolkit/neterror/certError.ftl | 9 firefox-esr-140.6.0esr/l10n-ko/toolkit/toolkit/neterror/netError.ftl | 14 firefox-esr-140.6.0esr/l10n-ko/toolkit/toolkit/pdfviewer/viewer.ftl | 51 firefox-esr-140.6.0esr/l10n-ko/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-lij/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-lij/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-lij/browser/browser/preferences/preferences.ftl | 34 firefox-esr-140.6.0esr/l10n-lij/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-lij/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-lij/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-lt/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-lt/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-lt/browser/browser/preferences/preferences.ftl | 49 firefox-esr-140.6.0esr/l10n-lt/browser/browser/webauthnDialog.ftl | 17 firefox-esr-140.6.0esr/l10n-lt/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-lt/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-lt/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-lv/browser/browser/aboutDialog.ftl | 2 firefox-esr-140.6.0esr/l10n-lv/browser/browser/aboutLogins.ftl | 2 firefox-esr-140.6.0esr/l10n-lv/browser/browser/aboutPolicies.ftl | 2 firefox-esr-140.6.0esr/l10n-lv/browser/browser/aboutRestartRequired.ftl | 2 firefox-esr-140.6.0esr/l10n-lv/browser/browser/addonNotifications.ftl | 18 firefox-esr-140.6.0esr/l10n-lv/browser/browser/allTabsMenu.ftl | 12 firefox-esr-140.6.0esr/l10n-lv/browser/browser/appMenuNotifications.ftl | 13 firefox-esr-140.6.0esr/l10n-lv/browser/browser/appmenu.ftl | 7 firefox-esr-140.6.0esr/l10n-lv/browser/browser/browser.ftl | 507 - firefox-esr-140.6.0esr/l10n-lv/browser/browser/browserContext.ftl | 4 firefox-esr-140.6.0esr/l10n-lv/browser/browser/contextual-manager.ftl | 68 firefox-esr-140.6.0esr/l10n-lv/browser/browser/newtab/newtab.ftl | 2 firefox-esr-140.6.0esr/l10n-lv/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-lv/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-lv/browser/browser/preferences/preferences.ftl | 51 firefox-esr-140.6.0esr/l10n-lv/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-lv/devtools/client/toolbox-options.ftl | 92 firefox-esr-140.6.0esr/l10n-lv/devtools/client/toolbox.ftl | 25 firefox-esr-140.6.0esr/l10n-lv/devtools/client/toolbox.properties | 121 firefox-esr-140.6.0esr/l10n-lv/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-lv/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-mk/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-mk/browser/browser/preferences/preferences.ftl | 33 firefox-esr-140.6.0esr/l10n-mk/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-mk/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-mk/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-mr/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-mr/browser/browser/preferences/formAutofill.ftl | 43 firefox-esr-140.6.0esr/l10n-mr/browser/browser/preferences/preferences.ftl | 36 firefox-esr-140.6.0esr/l10n-mr/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-mr/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-mr/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-ms/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-ms/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-ms/browser/browser/preferences/preferences.ftl | 34 firefox-esr-140.6.0esr/l10n-ms/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-ms/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-ms/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-my/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-my/browser/browser/preferences/formAutofill.ftl | 38 firefox-esr-140.6.0esr/l10n-my/browser/browser/preferences/preferences.ftl | 34 firefox-esr-140.6.0esr/l10n-my/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-my/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/backupSettings.ftl | 251 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/browser.ftl | 47 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/browserContext.ftl | 6 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/firefoxView.ftl | 2 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/fxviewTabList.ftl | 2 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/genai.ftl | 6 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/newtab/newtab.ftl | 25 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/preferences/preferences.ftl | 228 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/profiles.ftl | 114 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/recentlyClosed.ftl | 2 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/sync.ftl | 9 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/tabContextMenu.ftl | 18 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/tabbrowser.ftl | 42 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/toolbarContextMenu.ftl | 6 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/unifiedExtensions.ftl | 31 firefox-esr-140.6.0esr/l10n-nb-NO/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-nb-NO/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-nb-NO/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-nb-NO/browser/pdfviewer/viewer.properties | 2 firefox-esr-140.6.0esr/l10n-nb-NO/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-nb-NO/devtools/client/jsonview.properties | 7 firefox-esr-140.6.0esr/l10n-nb-NO/devtools/client/perftools.ftl | 2 firefox-esr-140.6.0esr/l10n-nb-NO/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-nb-NO/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-nb-NO/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-nb-NO/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-nb-NO/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-nb-NO/dom/chrome/dom/dom.properties | 11 firefox-esr-140.6.0esr/l10n-nb-NO/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-nb-NO/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-nb-NO/toolkit/toolkit/about/aboutAddons.ftl | 14 firefox-esr-140.6.0esr/l10n-nb-NO/toolkit/toolkit/about/aboutGlean.ftl | 40 firefox-esr-140.6.0esr/l10n-nb-NO/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-nb-NO/toolkit/toolkit/about/aboutThirdParty.ftl | 2 firefox-esr-140.6.0esr/l10n-nb-NO/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-nb-NO/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-nb-NO/toolkit/toolkit/firefoxlabs/features.ftl | 3 firefox-esr-140.6.0esr/l10n-nb-NO/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-nb-NO/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-nb-NO/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-nb-NO/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-nb-NO/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-nb-NO/toolkit/toolkit/global/textActions.ftl | 8 firefox-esr-140.6.0esr/l10n-nb-NO/toolkit/toolkit/intl/languageNames.ftl | 2 firefox-esr-140.6.0esr/l10n-nb-NO/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-nb-NO/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-nb-NO/toolkit/toolkit/pdfviewer/viewer.ftl | 55 firefox-esr-140.6.0esr/l10n-nb-NO/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-ne-NP/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-ne-NP/browser/browser/preferences/formAutofill.ftl | 17 firefox-esr-140.6.0esr/l10n-ne-NP/browser/browser/preferences/preferences.ftl | 32 firefox-esr-140.6.0esr/l10n-ne-NP/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-ne-NP/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-ne-NP/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-nl/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-nl/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-nl/browser/browser/backupSettings.ftl | 251 firefox-esr-140.6.0esr/l10n-nl/browser/browser/browser.ftl | 52 firefox-esr-140.6.0esr/l10n-nl/browser/browser/browserContext.ftl | 6 firefox-esr-140.6.0esr/l10n-nl/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-nl/browser/browser/customizeMode.ftl | 2 firefox-esr-140.6.0esr/l10n-nl/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-nl/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-nl/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-nl/browser/browser/fxviewTabList.ftl | 2 firefox-esr-140.6.0esr/l10n-nl/browser/browser/genai.ftl | 6 firefox-esr-140.6.0esr/l10n-nl/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-nl/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-nl/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-nl/browser/browser/newtab/newtab.ftl | 29 firefox-esr-140.6.0esr/l10n-nl/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-nl/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-nl/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-nl/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-nl/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-nl/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-nl/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-nl/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-nl/browser/browser/preferences/preferences.ftl | 228 firefox-esr-140.6.0esr/l10n-nl/browser/browser/profiles.ftl | 138 firefox-esr-140.6.0esr/l10n-nl/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-nl/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-nl/browser/browser/sync.ftl | 10 firefox-esr-140.6.0esr/l10n-nl/browser/browser/tabContextMenu.ftl | 13 firefox-esr-140.6.0esr/l10n-nl/browser/browser/tabbrowser.ftl | 42 firefox-esr-140.6.0esr/l10n-nl/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-nl/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-nl/browser/browser/unifiedExtensions.ftl | 32 firefox-esr-140.6.0esr/l10n-nl/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-nl/browser/chrome/browser/browser.properties | 10 firefox-esr-140.6.0esr/l10n-nl/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-nl/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-nl/devtools/client/jsonview.properties | 7 firefox-esr-140.6.0esr/l10n-nl/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-nl/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-nl/devtools/client/tooltips.ftl | 4 firefox-esr-140.6.0esr/l10n-nl/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-nl/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-nl/dom/chrome/dom/dom.properties | 11 firefox-esr-140.6.0esr/l10n-nl/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-nl/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-nl/toolkit/toolkit/about/aboutAddons.ftl | 21 firefox-esr-140.6.0esr/l10n-nl/toolkit/toolkit/about/aboutGlean.ftl | 40 firefox-esr-140.6.0esr/l10n-nl/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-nl/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-nl/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-nl/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-nl/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-nl/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-nl/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-nl/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-nl/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-nl/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-nl/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-nl/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-nl/toolkit/toolkit/pdfviewer/viewer.ftl | 53 firefox-esr-140.6.0esr/l10n-nl/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/appmenu.ftl | 8 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/backupSettings.ftl | 176 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/browser.ftl | 37 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/customkeys.ftl | 9 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/downloads.ftl | 2 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/firefoxRelay.ftl | 21 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/genai.ftl | 18 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/identityCredentialNotification.ftl | 2 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/newtab/asrouter.ftl | 11 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/newtab/newtab.ftl | 27 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/newtab/onboarding.ftl | 84 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/policies/policies-descriptions.ftl | 4 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/preferences/formAutofill.ftl | 55 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/preferences/permissions.ftl | 2 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/preferences/preferences.ftl | 149 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/profiles.ftl | 116 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/reportBrokenSite.ftl | 1 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/safeMode.ftl | 2 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/sidebar.ftl | 14 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/tabbrowser.ftl | 16 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/toolbarContextMenu.ftl | 2 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/unifiedExtensions.ftl | 2 firefox-esr-140.6.0esr/l10n-nn-NO/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-nn-NO/browser/chrome/browser/browser.properties | 6 firefox-esr-140.6.0esr/l10n-nn-NO/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-nn-NO/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-nn-NO/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-nn-NO/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-nn-NO/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-nn-NO/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-nn-NO/toolkit/toolkit/about/aboutGlean.ftl | 2 firefox-esr-140.6.0esr/l10n-nn-NO/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-nn-NO/toolkit/toolkit/about/aboutRights.ftl | 2 firefox-esr-140.6.0esr/l10n-nn-NO/toolkit/toolkit/about/abuseReports.ftl | 2 firefox-esr-140.6.0esr/l10n-nn-NO/toolkit/toolkit/about/certviewer.ftl | 3 firefox-esr-140.6.0esr/l10n-nn-NO/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-nn-NO/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-nn-NO/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-nn-NO/toolkit/toolkit/global/textActions.ftl | 5 firefox-esr-140.6.0esr/l10n-nn-NO/toolkit/toolkit/neterror/certError.ftl | 4 firefox-esr-140.6.0esr/l10n-nn-NO/toolkit/toolkit/neterror/netError.ftl | 6 firefox-esr-140.6.0esr/l10n-nn-NO/toolkit/toolkit/pdfviewer/viewer.ftl | 49 firefox-esr-140.6.0esr/l10n-oc/browser/browser/newtab/newtab.ftl | 2 firefox-esr-140.6.0esr/l10n-oc/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-oc/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-oc/browser/browser/preferences/preferences.ftl | 49 firefox-esr-140.6.0esr/l10n-oc/browser/browser/tabbrowser.ftl | 4 firefox-esr-140.6.0esr/l10n-oc/browser/browser/webauthnDialog.ftl | 29 firefox-esr-140.6.0esr/l10n-oc/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-oc/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-oc/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-oc/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/backupSettings.ftl | 249 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/browser.ftl | 47 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/browserContext.ftl | 5 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/featureCallout.ftl | 20 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/genai.ftl | 4 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/newtab/asrouter.ftl | 22 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/newtab/newtab.ftl | 27 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/newtab/onboarding.ftl | 87 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/policies/policies-descriptions.ftl | 4 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/preferences/permissions.ftl | 6 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/preferences/preferences.ftl | 185 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/profiles.ftl | 101 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/tabbrowser.ftl | 31 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/unexpectedScript.ftl | 8 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/unifiedExtensions.ftl | 10 firefox-esr-140.6.0esr/l10n-pa-IN/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-pa-IN/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-pa-IN/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-pa-IN/devtools/client/inspector.ftl | 6 firefox-esr-140.6.0esr/l10n-pa-IN/devtools/client/netmonitor.properties | 14 firefox-esr-140.6.0esr/l10n-pa-IN/devtools/client/network-throttling.properties | 13 firefox-esr-140.6.0esr/l10n-pa-IN/devtools/client/shared.properties | 6 firefox-esr-140.6.0esr/l10n-pa-IN/devtools/shared/highlighters.ftl | 31 firefox-esr-140.6.0esr/l10n-pa-IN/devtools/shared/screenshot.properties | 43 firefox-esr-140.6.0esr/l10n-pa-IN/toolkit/toolkit/about/aboutAddons.ftl | 2 firefox-esr-140.6.0esr/l10n-pa-IN/toolkit/toolkit/about/aboutCompat.ftl | 1 firefox-esr-140.6.0esr/l10n-pa-IN/toolkit/toolkit/about/aboutLogging.ftl | 7 firefox-esr-140.6.0esr/l10n-pa-IN/toolkit/toolkit/about/aboutNetworking.ftl | 1 firefox-esr-140.6.0esr/l10n-pa-IN/toolkit/toolkit/about/aboutWebauthn.ftl | 2 firefox-esr-140.6.0esr/l10n-pa-IN/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-pa-IN/toolkit/toolkit/firefoxlabs/features.ftl | 14 firefox-esr-140.6.0esr/l10n-pa-IN/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-pa-IN/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-pa-IN/toolkit/toolkit/global/handlerDialog.ftl | 3 firefox-esr-140.6.0esr/l10n-pa-IN/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-pa-IN/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-pa-IN/toolkit/toolkit/neterror/netError.ftl | 8 firefox-esr-140.6.0esr/l10n-pa-IN/toolkit/toolkit/pdfviewer/viewer.ftl | 53 firefox-esr-140.6.0esr/l10n-pl/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-pl/browser/browser/backupSettings.ftl | 250 firefox-esr-140.6.0esr/l10n-pl/browser/browser/browser.ftl | 57 firefox-esr-140.6.0esr/l10n-pl/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-pl/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-pl/browser/browser/featureCallout.ftl | 30 firefox-esr-140.6.0esr/l10n-pl/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-pl/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-pl/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-pl/browser/browser/newtab/asrouter.ftl | 18 firefox-esr-140.6.0esr/l10n-pl/browser/browser/newtab/newtab.ftl | 27 firefox-esr-140.6.0esr/l10n-pl/browser/browser/newtab/onboarding.ftl | 99 firefox-esr-140.6.0esr/l10n-pl/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-pl/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-pl/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-pl/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-pl/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-pl/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-pl/browser/browser/preferences/permissions.ftl | 9 firefox-esr-140.6.0esr/l10n-pl/browser/browser/preferences/preferences.ftl | 222 firefox-esr-140.6.0esr/l10n-pl/browser/browser/profiles.ftl | 114 firefox-esr-140.6.0esr/l10n-pl/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-pl/browser/browser/sidebar.ftl | 6 firefox-esr-140.6.0esr/l10n-pl/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-pl/browser/browser/tabbrowser.ftl | 31 firefox-esr-140.6.0esr/l10n-pl/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-pl/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-pl/browser/browser/unifiedExtensions.ftl | 11 firefox-esr-140.6.0esr/l10n-pl/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-pl/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-pl/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-pl/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-pl/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-pl/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-pl/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-pl/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-pl/dom/chrome/dom/dom.properties | 5 firefox-esr-140.6.0esr/l10n-pl/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-pl/toolkit/toolkit/about/aboutAddons.ftl | 2 firefox-esr-140.6.0esr/l10n-pl/toolkit/toolkit/about/aboutGlean.ftl | 38 firefox-esr-140.6.0esr/l10n-pl/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-pl/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-pl/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-pl/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-pl/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-pl/toolkit/toolkit/global/handlerDialog.ftl | 7 firefox-esr-140.6.0esr/l10n-pl/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-pl/toolkit/toolkit/global/textActions.ftl | 4 firefox-esr-140.6.0esr/l10n-pl/toolkit/toolkit/neterror/netError.ftl | 18 firefox-esr-140.6.0esr/l10n-pl/toolkit/toolkit/pdfviewer/viewer.ftl | 53 firefox-esr-140.6.0esr/l10n-pl/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/backupSettings.ftl | 251 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/browser.ftl | 47 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/extensionsUI.ftl | 4 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/genai.ftl | 4 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/newtab/newtab.ftl | 25 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/originControls.ftl | 4 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/preferences/preferences.ftl | 195 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/profiles.ftl | 116 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/tabContextMenu.ftl | 4 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/tabbrowser.ftl | 31 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/unifiedExtensions.ftl | 13 firefox-esr-140.6.0esr/l10n-pt-BR/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-pt-BR/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-pt-BR/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-pt-BR/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-pt-BR/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-pt-BR/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-pt-BR/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-pt-BR/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-pt-BR/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-pt-BR/dom/chrome/dom/dom.properties | 5 firefox-esr-140.6.0esr/l10n-pt-BR/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-pt-BR/netwerk/necko.properties | 5 firefox-esr-140.6.0esr/l10n-pt-BR/toolkit/toolkit/about/aboutAddons.ftl | 14 firefox-esr-140.6.0esr/l10n-pt-BR/toolkit/toolkit/about/aboutGlean.ftl | 38 firefox-esr-140.6.0esr/l10n-pt-BR/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-pt-BR/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-pt-BR/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-pt-BR/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-pt-BR/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-pt-BR/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-pt-BR/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-pt-BR/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-pt-BR/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-pt-BR/toolkit/toolkit/global/textActions.ftl | 4 firefox-esr-140.6.0esr/l10n-pt-BR/toolkit/toolkit/neterror/certError.ftl | 9 firefox-esr-140.6.0esr/l10n-pt-BR/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-pt-BR/toolkit/toolkit/pdfviewer/viewer.ftl | 53 firefox-esr-140.6.0esr/l10n-pt-BR/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-pt-PT/browser/browser/addonNotifications.ftl | 2 firefox-esr-140.6.0esr/l10n-pt-PT/browser/browser/browser.ftl | 184 firefox-esr-140.6.0esr/l10n-pt-PT/browser/browser/browserContext.ftl | 7 firefox-esr-140.6.0esr/l10n-pt-PT/browser/browser/contextual-manager.ftl | 20 firefox-esr-140.6.0esr/l10n-pt-PT/browser/browser/featureCallout.ftl | 29 firefox-esr-140.6.0esr/l10n-pt-PT/browser/browser/firefoxRelay.ftl | 2 firefox-esr-140.6.0esr/l10n-pt-PT/browser/browser/genai.ftl | 31 firefox-esr-140.6.0esr/l10n-pt-PT/browser/browser/newtab/asrouter.ftl | 4 firefox-esr-140.6.0esr/l10n-pt-PT/browser/browser/newtab/newtab.ftl | 9 firefox-esr-140.6.0esr/l10n-pt-PT/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-pt-PT/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-pt-PT/browser/browser/preferences/preferences.ftl | 67 firefox-esr-140.6.0esr/l10n-pt-PT/browser/browser/profiles.ftl | 7 firefox-esr-140.6.0esr/l10n-pt-PT/browser/browser/tabbrowser.ftl | 4 firefox-esr-140.6.0esr/l10n-pt-PT/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-pt-PT/devtools/client/perftools.ftl | 1 firefox-esr-140.6.0esr/l10n-pt-PT/devtools/client/storage.ftl | 8 firefox-esr-140.6.0esr/l10n-pt-PT/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-pt-PT/dom/chrome/security/csp.properties | 4 firefox-esr-140.6.0esr/l10n-pt-PT/dom/chrome/security/security.properties | 8 firefox-esr-140.6.0esr/l10n-pt-PT/toolkit/toolkit/about/aboutLogging.ftl | 2 firefox-esr-140.6.0esr/l10n-pt-PT/toolkit/toolkit/about/aboutSupport.ftl | 2 firefox-esr-140.6.0esr/l10n-pt-PT/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-pt-PT/toolkit/toolkit/contentanalysis/contentanalysis.ftl | 8 firefox-esr-140.6.0esr/l10n-pt-PT/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-pt-PT/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-pt-PT/toolkit/toolkit/global/mozBoxBase.ftl | 6 firefox-esr-140.6.0esr/l10n-pt-PT/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-pt-PT/toolkit/toolkit/global/textActions.ftl | 4 firefox-esr-140.6.0esr/l10n-rm/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-rm/browser/browser/backupSettings.ftl | 166 firefox-esr-140.6.0esr/l10n-rm/browser/browser/browser.ftl | 46 firefox-esr-140.6.0esr/l10n-rm/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-rm/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-rm/browser/browser/featureCallout.ftl | 25 firefox-esr-140.6.0esr/l10n-rm/browser/browser/firefoxRelay.ftl | 5 firefox-esr-140.6.0esr/l10n-rm/browser/browser/genai.ftl | 56 firefox-esr-140.6.0esr/l10n-rm/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-rm/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-rm/browser/browser/newtab/asrouter.ftl | 63 firefox-esr-140.6.0esr/l10n-rm/browser/browser/newtab/newtab.ftl | 12 firefox-esr-140.6.0esr/l10n-rm/browser/browser/newtab/onboarding.ftl | 25 firefox-esr-140.6.0esr/l10n-rm/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-rm/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-rm/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-rm/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-rm/browser/browser/preferences/moreFromMozilla.ftl | 6 firefox-esr-140.6.0esr/l10n-rm/browser/browser/preferences/permissions.ftl | 27 firefox-esr-140.6.0esr/l10n-rm/browser/browser/preferences/preferences.ftl | 151 firefox-esr-140.6.0esr/l10n-rm/browser/browser/preonboarding.ftl | 4 firefox-esr-140.6.0esr/l10n-rm/browser/browser/profiles.ftl | 206 firefox-esr-140.6.0esr/l10n-rm/browser/browser/reportBrokenSite.ftl | 17 firefox-esr-140.6.0esr/l10n-rm/browser/browser/screenshots.ftl | 5 firefox-esr-140.6.0esr/l10n-rm/browser/browser/search.ftl | 45 firefox-esr-140.6.0esr/l10n-rm/browser/browser/sidebar.ftl | 31 firefox-esr-140.6.0esr/l10n-rm/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-rm/browser/browser/tabContextMenu.ftl | 7 firefox-esr-140.6.0esr/l10n-rm/browser/browser/tabbrowser.ftl | 33 firefox-esr-140.6.0esr/l10n-rm/browser/browser/taskbartabs.ftl | 50 firefox-esr-140.6.0esr/l10n-rm/browser/browser/termsofuse.ftl | 19 firefox-esr-140.6.0esr/l10n-rm/browser/browser/toolbarContextMenu.ftl | 4 firefox-esr-140.6.0esr/l10n-rm/browser/browser/unexpectedScript.ftl | 33 firefox-esr-140.6.0esr/l10n-rm/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-rm/browser/browser/webrtc-preview.ftl | 6 firefox-esr-140.6.0esr/l10n-rm/browser/chrome/browser/browser.properties | 16 firefox-esr-140.6.0esr/l10n-rm/browser/chrome/browser/downloads/downloads.properties | 14 firefox-esr-140.6.0esr/l10n-rm/browser/chrome/browser/sitePermissions.properties | 3 firefox-esr-140.6.0esr/l10n-rm/devtools/client/debugger.properties | 22 firefox-esr-140.6.0esr/l10n-rm/devtools/client/inspector.properties | 8 firefox-esr-140.6.0esr/l10n-rm/devtools/client/perftools.ftl | 2 firefox-esr-140.6.0esr/l10n-rm/devtools/client/storage.ftl | 8 firefox-esr-140.6.0esr/l10n-rm/devtools/client/styleeditor.ftl | 4 firefox-esr-140.6.0esr/l10n-rm/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-rm/devtools/client/tooltips.ftl | 6 firefox-esr-140.6.0esr/l10n-rm/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-rm/devtools/shared/styleinspector.properties | 5 firefox-esr-140.6.0esr/l10n-rm/dom/chrome/appstrings.properties | 2 firefox-esr-140.6.0esr/l10n-rm/dom/chrome/dom/dom.properties | 8 firefox-esr-140.6.0esr/l10n-rm/dom/chrome/layout/htmlparser.properties | 4 firefox-esr-140.6.0esr/l10n-rm/dom/chrome/security/csp.properties | 10 firefox-esr-140.6.0esr/l10n-rm/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-rm/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-rm/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-rm/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-rm/toolkit/toolkit/neterror/certError.ftl | 1 firefox-esr-140.6.0esr/l10n-rm/toolkit/toolkit/neterror/netError.ftl | 4 firefox-esr-140.6.0esr/l10n-rm/toolkit/toolkit/pdfviewer/viewer.ftl | 61 firefox-esr-140.6.0esr/l10n-rm/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-ro/browser/browser/aboutLogins.ftl | 3 firefox-esr-140.6.0esr/l10n-ro/browser/browser/aboutTabCrashed.ftl | 2 firefox-esr-140.6.0esr/l10n-ro/browser/browser/appmenu.ftl | 8 firefox-esr-140.6.0esr/l10n-ro/browser/browser/backupSettings.ftl | 252 firefox-esr-140.6.0esr/l10n-ro/browser/browser/browser.ftl | 63 firefox-esr-140.6.0esr/l10n-ro/browser/browser/browserContext.ftl | 7 firefox-esr-140.6.0esr/l10n-ro/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-ro/browser/browser/featureCallout.ftl | 24 firefox-esr-140.6.0esr/l10n-ro/browser/browser/firefoxRelay.ftl | 5 firefox-esr-140.6.0esr/l10n-ro/browser/browser/genai.ftl | 4 firefox-esr-140.6.0esr/l10n-ro/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-ro/browser/browser/menubar.ftl | 5 firefox-esr-140.6.0esr/l10n-ro/browser/browser/newtab/asrouter.ftl | 26 firefox-esr-140.6.0esr/l10n-ro/browser/browser/newtab/newtab.ftl | 27 firefox-esr-140.6.0esr/l10n-ro/browser/browser/newtab/onboarding.ftl | 99 firefox-esr-140.6.0esr/l10n-ro/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-ro/browser/browser/policies/policies-descriptions.ftl | 9 firefox-esr-140.6.0esr/l10n-ro/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-ro/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-ro/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-ro/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-ro/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-ro/browser/browser/preferences/preferences.ftl | 201 firefox-esr-140.6.0esr/l10n-ro/browser/browser/profiles.ftl | 116 firefox-esr-140.6.0esr/l10n-ro/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-ro/browser/browser/screenshots.ftl | 4 firefox-esr-140.6.0esr/l10n-ro/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-ro/browser/browser/tabContextMenu.ftl | 4 firefox-esr-140.6.0esr/l10n-ro/browser/browser/tabbrowser.ftl | 43 firefox-esr-140.6.0esr/l10n-ro/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-ro/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-ro/browser/browser/unifiedExtensions.ftl | 11 firefox-esr-140.6.0esr/l10n-ro/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-ro/browser/chrome/browser/browser.properties | 12 firefox-esr-140.6.0esr/l10n-ro/browser/chrome/browser/customizableui/customizableWidgets.properties | 4 firefox-esr-140.6.0esr/l10n-ro/browser/chrome/browser/search.properties | 2 firefox-esr-140.6.0esr/l10n-ro/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-ro/browser/chrome/overrides/appstrings.properties | 2 firefox-esr-140.6.0esr/l10n-ro/browser/pdfviewer/viewer.properties | 10 firefox-esr-140.6.0esr/l10n-ro/devtools/client/accessibility.properties | 2 firefox-esr-140.6.0esr/l10n-ro/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-ro/devtools/client/inspector.properties | 4 firefox-esr-140.6.0esr/l10n-ro/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-ro/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-ro/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-ro/devtools/client/webconsole.properties | 8 firefox-esr-140.6.0esr/l10n-ro/devtools/shared/styleinspector.properties | 9 firefox-esr-140.6.0esr/l10n-ro/dom/chrome/appstrings.properties | 2 firefox-esr-140.6.0esr/l10n-ro/dom/chrome/dom/dom.properties | 5 firefox-esr-140.6.0esr/l10n-ro/dom/chrome/layout/printing.properties | 24 firefox-esr-140.6.0esr/l10n-ro/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-ro/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-ro/toolkit/chrome/global/printdialog.properties | 16 firefox-esr-140.6.0esr/l10n-ro/toolkit/toolkit/about/aboutAddons.ftl | 6 firefox-esr-140.6.0esr/l10n-ro/toolkit/toolkit/about/aboutGlean.ftl | 38 firefox-esr-140.6.0esr/l10n-ro/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-ro/toolkit/toolkit/about/aboutSupport.ftl | 6 firefox-esr-140.6.0esr/l10n-ro/toolkit/toolkit/about/aboutWebauthn.ftl | 2 firefox-esr-140.6.0esr/l10n-ro/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-ro/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-ro/toolkit/toolkit/contentanalysis/contentanalysis.ftl | 8 firefox-esr-140.6.0esr/l10n-ro/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-ro/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-ro/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-ro/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-ro/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-ro/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-ro/toolkit/toolkit/global/textActions.ftl | 8 firefox-esr-140.6.0esr/l10n-ro/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-ro/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-ro/toolkit/toolkit/pdfviewer/viewer.ftl | 63 firefox-esr-140.6.0esr/l10n-ro/toolkit/toolkit/printing/printDialogs.ftl | 8 firefox-esr-140.6.0esr/l10n-ro/toolkit/toolkit/printing/printPreview.ftl | 2 firefox-esr-140.6.0esr/l10n-ro/toolkit/toolkit/printing/printUI.ftl | 16 firefox-esr-140.6.0esr/l10n-ro/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-ru/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-ru/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-ru/browser/browser/backupSettings.ftl | 252 firefox-esr-140.6.0esr/l10n-ru/browser/browser/browser.ftl | 51 firefox-esr-140.6.0esr/l10n-ru/browser/browser/browserContext.ftl | 6 firefox-esr-140.6.0esr/l10n-ru/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-ru/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-ru/browser/browser/downloads.ftl | 2 firefox-esr-140.6.0esr/l10n-ru/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-ru/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-ru/browser/browser/fxviewTabList.ftl | 2 firefox-esr-140.6.0esr/l10n-ru/browser/browser/genai.ftl | 6 firefox-esr-140.6.0esr/l10n-ru/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-ru/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-ru/browser/browser/migrationWizard.ftl | 2 firefox-esr-140.6.0esr/l10n-ru/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-ru/browser/browser/newtab/newtab.ftl | 27 firefox-esr-140.6.0esr/l10n-ru/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-ru/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-ru/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-ru/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-ru/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-ru/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-ru/browser/browser/preferences/languages.ftl | 2 firefox-esr-140.6.0esr/l10n-ru/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-ru/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-ru/browser/browser/preferences/preferences.ftl | 244 firefox-esr-140.6.0esr/l10n-ru/browser/browser/profiles.ftl | 118 firefox-esr-140.6.0esr/l10n-ru/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-ru/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-ru/browser/browser/sync.ftl | 11 firefox-esr-140.6.0esr/l10n-ru/browser/browser/tabContextMenu.ftl | 14 firefox-esr-140.6.0esr/l10n-ru/browser/browser/tabbrowser.ftl | 42 firefox-esr-140.6.0esr/l10n-ru/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-ru/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-ru/browser/browser/unifiedExtensions.ftl | 33 firefox-esr-140.6.0esr/l10n-ru/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-ru/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-ru/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-ru/browser/installer/override.properties | 2 firefox-esr-140.6.0esr/l10n-ru/devtools/client/aboutdebugging.ftl | 16 firefox-esr-140.6.0esr/l10n-ru/devtools/client/application.ftl | 18 firefox-esr-140.6.0esr/l10n-ru/devtools/client/debugger.properties | 8 firefox-esr-140.6.0esr/l10n-ru/devtools/client/jsonview.properties | 7 firefox-esr-140.6.0esr/l10n-ru/devtools/client/netmonitor.properties | 2 firefox-esr-140.6.0esr/l10n-ru/devtools/client/perftools.ftl | 2 firefox-esr-140.6.0esr/l10n-ru/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-ru/devtools/client/toolbox-options.ftl | 16 firefox-esr-140.6.0esr/l10n-ru/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-ru/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-ru/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-ru/dom/chrome/accessibility/mac/accessible.properties | 2 firefox-esr-140.6.0esr/l10n-ru/dom/chrome/accessibility/unix/accessible.properties | 2 firefox-esr-140.6.0esr/l10n-ru/dom/chrome/accessibility/win/accessible.properties | 2 firefox-esr-140.6.0esr/l10n-ru/dom/chrome/dom/dom.properties | 11 firefox-esr-140.6.0esr/l10n-ru/dom/chrome/nsWebBrowserPersist.properties | 4 firefox-esr-140.6.0esr/l10n-ru/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-ru/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-ru/toolkit/toolkit/about/aboutAddons.ftl | 14 firefox-esr-140.6.0esr/l10n-ru/toolkit/toolkit/about/aboutGlean.ftl | 40 firefox-esr-140.6.0esr/l10n-ru/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-ru/toolkit/toolkit/about/aboutServiceWorkers.ftl | 4 firefox-esr-140.6.0esr/l10n-ru/toolkit/toolkit/about/aboutTelemetry.ftl | 4 firefox-esr-140.6.0esr/l10n-ru/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-ru/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-ru/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-ru/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-ru/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-ru/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-ru/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-ru/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-ru/toolkit/toolkit/global/processTypes.ftl | 2 firefox-esr-140.6.0esr/l10n-ru/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-ru/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-ru/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-ru/toolkit/toolkit/pdfviewer/viewer.ftl | 54 firefox-esr-140.6.0esr/l10n-ru/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-sat/browser/browser/newtab/newtab.ftl | 2 firefox-esr-140.6.0esr/l10n-sat/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-sat/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-sat/browser/browser/preferences/preferences.ftl | 49 firefox-esr-140.6.0esr/l10n-sat/browser/browser/webauthnDialog.ftl | 39 firefox-esr-140.6.0esr/l10n-sat/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-sat/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-sat/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-sat/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-sc/browser/browser/aboutDialog.ftl | 2 firefox-esr-140.6.0esr/l10n-sc/browser/browser/aboutLogins.ftl | 8 firefox-esr-140.6.0esr/l10n-sc/browser/browser/aboutTabCrashed.ftl | 2 firefox-esr-140.6.0esr/l10n-sc/browser/browser/aboutUnloads.ftl | 14 firefox-esr-140.6.0esr/l10n-sc/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-sc/browser/browser/backupSettings.ftl | 251 firefox-esr-140.6.0esr/l10n-sc/browser/browser/browser.ftl | 32 firefox-esr-140.6.0esr/l10n-sc/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-sc/browser/browser/confirmationHints.ftl | 2 firefox-esr-140.6.0esr/l10n-sc/browser/browser/contentCrash.ftl | 14 firefox-esr-140.6.0esr/l10n-sc/browser/browser/contextual-manager.ftl | 14 firefox-esr-140.6.0esr/l10n-sc/browser/browser/customkeys.ftl | 31 firefox-esr-140.6.0esr/l10n-sc/browser/browser/featureCallout.ftl | 18 firefox-esr-140.6.0esr/l10n-sc/browser/browser/firefoxRelay.ftl | 5 firefox-esr-140.6.0esr/l10n-sc/browser/browser/fxviewTabList.ftl | 12 firefox-esr-140.6.0esr/l10n-sc/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-sc/browser/browser/menubar.ftl | 7 firefox-esr-140.6.0esr/l10n-sc/browser/browser/newtab/asrouter.ftl | 23 firefox-esr-140.6.0esr/l10n-sc/browser/browser/newtab/newtab.ftl | 35 firefox-esr-140.6.0esr/l10n-sc/browser/browser/newtab/onboarding.ftl | 114 firefox-esr-140.6.0esr/l10n-sc/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-sc/browser/browser/policies/policies-descriptions.ftl | 2 firefox-esr-140.6.0esr/l10n-sc/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-sc/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-sc/browser/browser/preferences/moreFromMozilla.ftl | 11 firefox-esr-140.6.0esr/l10n-sc/browser/browser/preferences/permissions.ftl | 2 firefox-esr-140.6.0esr/l10n-sc/browser/browser/preferences/preferences.ftl | 166 firefox-esr-140.6.0esr/l10n-sc/browser/browser/profiles.ftl | 163 firefox-esr-140.6.0esr/l10n-sc/browser/browser/sidebar.ftl | 32 firefox-esr-140.6.0esr/l10n-sc/browser/browser/siteProtections.ftl | 2 firefox-esr-140.6.0esr/l10n-sc/browser/browser/sync.ftl | 6 firefox-esr-140.6.0esr/l10n-sc/browser/browser/syncedTabs.ftl | 4 firefox-esr-140.6.0esr/l10n-sc/browser/browser/tabbrowser.ftl | 36 firefox-esr-140.6.0esr/l10n-sc/browser/browser/taskbartabs.ftl | 7 firefox-esr-140.6.0esr/l10n-sc/browser/browser/termsofuse.ftl | 15 firefox-esr-140.6.0esr/l10n-sc/browser/browser/unexpectedScript.ftl | 14 firefox-esr-140.6.0esr/l10n-sc/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-sc/browser/chrome/browser/browser.properties | 13 firefox-esr-140.6.0esr/l10n-sc/devtools/client/inspector.properties | 6 firefox-esr-140.6.0esr/l10n-sc/devtools/client/perftools.ftl | 7 firefox-esr-140.6.0esr/l10n-sc/devtools/shared/debugger-paused-reasons.ftl | 2 firefox-esr-140.6.0esr/l10n-sc/dom/chrome/appstrings.properties | 1 firefox-esr-140.6.0esr/l10n-sc/dom/chrome/nsWebBrowserPersist.properties | 2 firefox-esr-140.6.0esr/l10n-sc/security/manager/chrome/pipnss/nsserrors.properties | 3 firefox-esr-140.6.0esr/l10n-sc/security/manager/chrome/pipnss/pipnss.properties | 4 firefox-esr-140.6.0esr/l10n-sc/security/manager/security/certificates/certManager.ftl | 20 firefox-esr-140.6.0esr/l10n-sc/toolkit/chrome/mozapps/downloads/unknownContentType.properties | 6 firefox-esr-140.6.0esr/l10n-sc/toolkit/toolkit/about/aboutAddons.ftl | 38 firefox-esr-140.6.0esr/l10n-sc/toolkit/toolkit/about/aboutLogging.ftl | 8 firefox-esr-140.6.0esr/l10n-sc/toolkit/toolkit/about/aboutNetworking.ftl | 1 firefox-esr-140.6.0esr/l10n-sc/toolkit/toolkit/about/aboutPlugins.ftl | 2 firefox-esr-140.6.0esr/l10n-sc/toolkit/toolkit/about/aboutProfiles.ftl | 8 firefox-esr-140.6.0esr/l10n-sc/toolkit/toolkit/about/aboutSupport.ftl | 2 firefox-esr-140.6.0esr/l10n-sc/toolkit/toolkit/about/aboutThirdParty.ftl | 3 firefox-esr-140.6.0esr/l10n-sc/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-sc/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-sc/toolkit/toolkit/global/datetimepicker.ftl | 64 firefox-esr-140.6.0esr/l10n-sc/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-sc/toolkit/toolkit/global/profileSelection.ftl | 12 firefox-esr-140.6.0esr/l10n-sc/toolkit/toolkit/global/textActions.ftl | 2 firefox-esr-140.6.0esr/l10n-sc/toolkit/toolkit/global/unknownContentType.ftl | 2 firefox-esr-140.6.0esr/l10n-sc/toolkit/toolkit/pdfviewer/viewer.ftl | 7 firefox-esr-140.6.0esr/l10n-sco/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-sco/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-sco/browser/browser/preferences/preferences.ftl | 38 firefox-esr-140.6.0esr/l10n-sco/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-sco/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-sco/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-si/browser/browser/newtab/newtab.ftl | 2 firefox-esr-140.6.0esr/l10n-si/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-si/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-si/browser/browser/preferences/preferences.ftl | 54 firefox-esr-140.6.0esr/l10n-si/browser/browser/webauthnDialog.ftl | 22 firefox-esr-140.6.0esr/l10n-si/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-si/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-si/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-si/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-sk/browser/browser/aboutPrivateBrowsing.ftl | 2 firefox-esr-140.6.0esr/l10n-sk/browser/browser/aboutRestartRequired.ftl | 2 firefox-esr-140.6.0esr/l10n-sk/browser/browser/aboutTabCrashed.ftl | 4 firefox-esr-140.6.0esr/l10n-sk/browser/browser/addonNotifications.ftl | 18 firefox-esr-140.6.0esr/l10n-sk/browser/browser/appMenuNotifications.ftl | 2 firefox-esr-140.6.0esr/l10n-sk/browser/browser/appmenu.ftl | 8 firefox-esr-140.6.0esr/l10n-sk/browser/browser/backgroundtasks/defaultagent.ftl | 4 firefox-esr-140.6.0esr/l10n-sk/browser/browser/backupSettings.ftl | 253 firefox-esr-140.6.0esr/l10n-sk/browser/browser/browser.ftl | 61 firefox-esr-140.6.0esr/l10n-sk/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-sk/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-sk/browser/browser/defaultBrowserNotification.ftl | 12 firefox-esr-140.6.0esr/l10n-sk/browser/browser/featureCallout.ftl | 30 firefox-esr-140.6.0esr/l10n-sk/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-sk/browser/browser/firefoxView.ftl | 2 firefox-esr-140.6.0esr/l10n-sk/browser/browser/genai.ftl | 4 firefox-esr-140.6.0esr/l10n-sk/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-sk/browser/browser/menubar.ftl | 7 firefox-esr-140.6.0esr/l10n-sk/browser/browser/migrationWizard.ftl | 2 firefox-esr-140.6.0esr/l10n-sk/browser/browser/newtab/asrouter.ftl | 64 firefox-esr-140.6.0esr/l10n-sk/browser/browser/newtab/newtab.ftl | 27 firefox-esr-140.6.0esr/l10n-sk/browser/browser/newtab/onboarding.ftl | 133 firefox-esr-140.6.0esr/l10n-sk/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-sk/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-sk/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-sk/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-sk/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-sk/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-sk/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-sk/browser/browser/preferences/preferences.ftl | 211 firefox-esr-140.6.0esr/l10n-sk/browser/browser/profiles.ftl | 116 firefox-esr-140.6.0esr/l10n-sk/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-sk/browser/browser/safeMode.ftl | 2 firefox-esr-140.6.0esr/l10n-sk/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-sk/browser/browser/tabContextMenu.ftl | 4 firefox-esr-140.6.0esr/l10n-sk/browser/browser/tabbrowser.ftl | 49 firefox-esr-140.6.0esr/l10n-sk/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-sk/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-sk/browser/browser/unexpectedScript.ftl | 4 firefox-esr-140.6.0esr/l10n-sk/browser/browser/unifiedExtensions.ftl | 11 firefox-esr-140.6.0esr/l10n-sk/browser/browser/webProtocolHandler.ftl | 2 firefox-esr-140.6.0esr/l10n-sk/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-sk/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-sk/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-sk/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-sk/devtools/client/perftools.ftl | 2 firefox-esr-140.6.0esr/l10n-sk/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-sk/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-sk/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-sk/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-sk/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-sk/dom/chrome/dom/dom.properties | 5 firefox-esr-140.6.0esr/l10n-sk/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-sk/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-sk/toolkit/crashreporter/crashreporter.ftl | 4 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/about/aboutAddons.ftl | 8 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/about/aboutGlean.ftl | 38 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/about/aboutProfiles.ftl | 4 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/about/aboutRights.ftl | 2 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/about/aboutSupport.ftl | 2 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/about/aboutThirdParty.ftl | 2 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/contentanalysis/contentanalysis.ftl | 2 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/global/profileSelection.ftl | 4 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/global/resetProfile.ftl | 8 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/global/run-from-dmg.ftl | 4 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/global/textActions.ftl | 4 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/pdfviewer/viewer.ftl | 55 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/updates/backgroundupdate.ftl | 2 firefox-esr-140.6.0esr/l10n-sk/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-skr/browser/browser/newtab/newtab.ftl | 2 firefox-esr-140.6.0esr/l10n-skr/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-skr/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-skr/browser/browser/preferences/preferences.ftl | 51 firefox-esr-140.6.0esr/l10n-skr/browser/browser/tabbrowser.ftl | 4 firefox-esr-140.6.0esr/l10n-skr/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-skr/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-skr/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-skr/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-skr/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-sl/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-sl/browser/browser/backupSettings.ftl | 154 firefox-esr-140.6.0esr/l10n-sl/browser/browser/browser.ftl | 22 firefox-esr-140.6.0esr/l10n-sl/browser/browser/browserContext.ftl | 5 firefox-esr-140.6.0esr/l10n-sl/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-sl/browser/browser/featureCallout.ftl | 10 firefox-esr-140.6.0esr/l10n-sl/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-sl/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-sl/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-sl/browser/browser/newtab/asrouter.ftl | 16 firefox-esr-140.6.0esr/l10n-sl/browser/browser/newtab/newtab.ftl | 30 firefox-esr-140.6.0esr/l10n-sl/browser/browser/newtab/onboarding.ftl | 19 firefox-esr-140.6.0esr/l10n-sl/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-sl/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-sl/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-sl/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-sl/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-sl/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-sl/browser/browser/preferences/preferences.ftl | 135 firefox-esr-140.6.0esr/l10n-sl/browser/browser/profiles.ftl | 111 firefox-esr-140.6.0esr/l10n-sl/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-sl/browser/browser/tabbrowser.ftl | 23 firefox-esr-140.6.0esr/l10n-sl/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-sl/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-sl/browser/browser/unifiedExtensions.ftl | 11 firefox-esr-140.6.0esr/l10n-sl/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-sl/browser/chrome/browser/browser.properties | 2 firefox-esr-140.6.0esr/l10n-sl/browser/pdfviewer/viewer.properties | 2 firefox-esr-140.6.0esr/l10n-sl/devtools/client/toolbox-options.ftl | 10 firefox-esr-140.6.0esr/l10n-sl/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-sl/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-sl/dom/chrome/dom/dom.properties | 5 firefox-esr-140.6.0esr/l10n-sl/toolkit/toolkit/about/aboutAddons.ftl | 2 firefox-esr-140.6.0esr/l10n-sl/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-sl/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-sl/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-sl/toolkit/toolkit/global/datetimepicker.ftl | 85 firefox-esr-140.6.0esr/l10n-sl/toolkit/toolkit/global/handlerDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-sl/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-sl/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-sl/toolkit/toolkit/main-window/findbar.ftl | 2 firefox-esr-140.6.0esr/l10n-sl/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-sl/toolkit/toolkit/pdfviewer/viewer.ftl | 57 firefox-esr-140.6.0esr/l10n-sl/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-son/browser/browser/preferences/preferences.ftl | 26 firefox-esr-140.6.0esr/l10n-son/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-son/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-sq/browser/browser/addonNotifications.ftl | 5 firefox-esr-140.6.0esr/l10n-sq/browser/browser/appMenuNotifications.ftl | 6 firefox-esr-140.6.0esr/l10n-sq/browser/browser/appmenu.ftl | 12 firefox-esr-140.6.0esr/l10n-sq/browser/browser/backupSettings.ftl | 251 firefox-esr-140.6.0esr/l10n-sq/browser/browser/browser.ftl | 318 firefox-esr-140.6.0esr/l10n-sq/browser/browser/browserContext.ftl | 10 firefox-esr-140.6.0esr/l10n-sq/browser/browser/confirmationHints.ftl | 2 firefox-esr-140.6.0esr/l10n-sq/browser/browser/contentCrash.ftl | 7 firefox-esr-140.6.0esr/l10n-sq/browser/browser/contextual-manager.ftl | 39 firefox-esr-140.6.0esr/l10n-sq/browser/browser/customkeys.ftl | 35 firefox-esr-140.6.0esr/l10n-sq/browser/browser/downloads.ftl | 12 firefox-esr-140.6.0esr/l10n-sq/browser/browser/featureCallout.ftl | 63 firefox-esr-140.6.0esr/l10n-sq/browser/browser/firefoxRelay.ftl | 5 firefox-esr-140.6.0esr/l10n-sq/browser/browser/genai.ftl | 84 firefox-esr-140.6.0esr/l10n-sq/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-sq/browser/browser/menubar.ftl | 10 firefox-esr-140.6.0esr/l10n-sq/browser/browser/migrationWizard.ftl | 6 firefox-esr-140.6.0esr/l10n-sq/browser/browser/newtab/asrouter.ftl | 81 firefox-esr-140.6.0esr/l10n-sq/browser/browser/newtab/newtab.ftl | 146 firefox-esr-140.6.0esr/l10n-sq/browser/browser/newtab/onboarding.ftl | 99 firefox-esr-140.6.0esr/l10n-sq/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-sq/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-sq/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-sq/browser/browser/preferences/formAutofill.ftl | 49 firefox-esr-140.6.0esr/l10n-sq/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-sq/browser/browser/preferences/moreFromMozilla.ftl | 7 firefox-esr-140.6.0esr/l10n-sq/browser/browser/preferences/permissions.ftl | 27 firefox-esr-140.6.0esr/l10n-sq/browser/browser/preferences/preferences.ftl | 229 firefox-esr-140.6.0esr/l10n-sq/browser/browser/profiles.ftl | 212 firefox-esr-140.6.0esr/l10n-sq/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-sq/browser/browser/search.ftl | 8 firefox-esr-140.6.0esr/l10n-sq/browser/browser/sidebar.ftl | 18 firefox-esr-140.6.0esr/l10n-sq/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-sq/browser/browser/tabbrowser.ftl | 45 firefox-esr-140.6.0esr/l10n-sq/browser/browser/taskbartabs.ftl | 50 firefox-esr-140.6.0esr/l10n-sq/browser/browser/termsofuse.ftl | 21 firefox-esr-140.6.0esr/l10n-sq/browser/browser/toolbarContextMenu.ftl | 4 firefox-esr-140.6.0esr/l10n-sq/browser/browser/unexpectedScript.ftl | 33 firefox-esr-140.6.0esr/l10n-sq/browser/browser/unifiedExtensions.ftl | 14 firefox-esr-140.6.0esr/l10n-sq/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-sq/browser/browser/webrtc-preview.ftl | 6 firefox-esr-140.6.0esr/l10n-sq/browser/chrome/browser/browser.properties | 22 firefox-esr-140.6.0esr/l10n-sq/browser/chrome/browser/downloads/downloads.properties | 14 firefox-esr-140.6.0esr/l10n-sq/browser/chrome/browser/sitePermissions.properties | 3 firefox-esr-140.6.0esr/l10n-sq/devtools/client/debugger.properties | 9 firefox-esr-140.6.0esr/l10n-sq/devtools/client/inspector.properties | 8 firefox-esr-140.6.0esr/l10n-sq/devtools/client/perftools.ftl | 2 firefox-esr-140.6.0esr/l10n-sq/devtools/client/storage.ftl | 8 firefox-esr-140.6.0esr/l10n-sq/devtools/client/styleeditor.properties | 4 firefox-esr-140.6.0esr/l10n-sq/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-sq/devtools/client/tooltips.ftl | 3 firefox-esr-140.6.0esr/l10n-sq/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-sq/dom/chrome/dom/dom.properties | 17 firefox-esr-140.6.0esr/l10n-sq/dom/chrome/layout/xul.properties | 3 firefox-esr-140.6.0esr/l10n-sq/dom/chrome/security/csp.properties | 4 firefox-esr-140.6.0esr/l10n-sq/dom/chrome/security/security.properties | 9 firefox-esr-140.6.0esr/l10n-sq/netwerk/necko.properties | 11 firefox-esr-140.6.0esr/l10n-sq/toolkit/crashreporter/crashreporter.ftl | 1 firefox-esr-140.6.0esr/l10n-sq/toolkit/toolkit/about/aboutAddons.ftl | 50 firefox-esr-140.6.0esr/l10n-sq/toolkit/toolkit/about/aboutGlean.ftl | 61 firefox-esr-140.6.0esr/l10n-sq/toolkit/toolkit/about/aboutLogging.ftl | 31 firefox-esr-140.6.0esr/l10n-sq/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-sq/toolkit/toolkit/contentanalysis/contentanalysis.ftl | 8 firefox-esr-140.6.0esr/l10n-sq/toolkit/toolkit/firefoxlabs/features.ftl | 30 firefox-esr-140.6.0esr/l10n-sq/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-sq/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-sq/toolkit/toolkit/global/extensionPermissions.ftl | 15 firefox-esr-140.6.0esr/l10n-sq/toolkit/toolkit/global/extensions.ftl | 44 firefox-esr-140.6.0esr/l10n-sq/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-sq/toolkit/toolkit/global/mozBoxBase.ftl | 6 firefox-esr-140.6.0esr/l10n-sq/toolkit/toolkit/global/mozBreadcrumbGroup.ftl | 4 firefox-esr-140.6.0esr/l10n-sq/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-sq/toolkit/toolkit/global/textActions.ftl | 7 firefox-esr-140.6.0esr/l10n-sq/toolkit/toolkit/neterror/certError.ftl | 21 firefox-esr-140.6.0esr/l10n-sq/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-sq/toolkit/toolkit/pdfviewer/viewer.ftl | 67 firefox-esr-140.6.0esr/l10n-sq/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-sr/browser/browser/browser.ftl | 2 firefox-esr-140.6.0esr/l10n-sr/browser/browser/contextual-manager.ftl | 2 firefox-esr-140.6.0esr/l10n-sr/browser/browser/newtab/newtab.ftl | 2 firefox-esr-140.6.0esr/l10n-sr/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-sr/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-sr/browser/browser/preferences/preferences.ftl | 49 firefox-esr-140.6.0esr/l10n-sr/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-sr/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-sr/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-sr/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-sr/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-sr/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/appmenu.ftl | 9 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/backupSettings.ftl | 251 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/browser.ftl | 47 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/browserContext.ftl | 6 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/fxviewTabList.ftl | 2 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/genai.ftl | 6 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/newtab/newtab.ftl | 36 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/newtab/onboarding.ftl | 91 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/preferences/preferences.ftl | 270 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/profiles.ftl | 114 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/sync.ftl | 9 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/tabContextMenu.ftl | 12 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/tabbrowser.ftl | 77 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/unifiedExtensions.ftl | 27 firefox-esr-140.6.0esr/l10n-sv-SE/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-sv-SE/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-sv-SE/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-sv-SE/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-sv-SE/devtools/client/jsonview.properties | 7 firefox-esr-140.6.0esr/l10n-sv-SE/devtools/client/perftools.ftl | 2 firefox-esr-140.6.0esr/l10n-sv-SE/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-sv-SE/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-sv-SE/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-sv-SE/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-sv-SE/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-sv-SE/dom/chrome/dom/dom.properties | 12 firefox-esr-140.6.0esr/l10n-sv-SE/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-sv-SE/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-sv-SE/toolkit/toolkit/about/aboutAddons.ftl | 14 firefox-esr-140.6.0esr/l10n-sv-SE/toolkit/toolkit/about/aboutGlean.ftl | 40 firefox-esr-140.6.0esr/l10n-sv-SE/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-sv-SE/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-sv-SE/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-sv-SE/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-sv-SE/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-sv-SE/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-sv-SE/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-sv-SE/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-sv-SE/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-sv-SE/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-sv-SE/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-sv-SE/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-sv-SE/toolkit/toolkit/pdfviewer/viewer.ftl | 53 firefox-esr-140.6.0esr/l10n-sv-SE/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-szl/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-szl/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-szl/browser/browser/preferences/preferences.ftl | 46 firefox-esr-140.6.0esr/l10n-szl/browser/browser/webauthnDialog.ftl | 17 firefox-esr-140.6.0esr/l10n-szl/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-szl/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-ta/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-ta/browser/browser/preferences/formAutofill.ftl | 12 firefox-esr-140.6.0esr/l10n-ta/browser/browser/preferences/preferences.ftl | 34 firefox-esr-140.6.0esr/l10n-ta/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-ta/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-ta/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-te/browser/browser/newtab/newtab.ftl | 2 firefox-esr-140.6.0esr/l10n-te/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-te/browser/browser/preferences/formAutofill.ftl | 32 firefox-esr-140.6.0esr/l10n-te/browser/browser/preferences/preferences.ftl | 36 firefox-esr-140.6.0esr/l10n-te/browser/browser/tabbrowser.ftl | 4 firefox-esr-140.6.0esr/l10n-te/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-te/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-te/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-te/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-tg/browser/browser/appmenu.ftl | 2 firefox-esr-140.6.0esr/l10n-tg/browser/browser/backupSettings.ftl | 152 firefox-esr-140.6.0esr/l10n-tg/browser/browser/browser.ftl | 47 firefox-esr-140.6.0esr/l10n-tg/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-tg/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-tg/browser/browser/customkeys.ftl | 26 firefox-esr-140.6.0esr/l10n-tg/browser/browser/featureCallout.ftl | 17 firefox-esr-140.6.0esr/l10n-tg/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-tg/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-tg/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-tg/browser/browser/newtab/asrouter.ftl | 9 firefox-esr-140.6.0esr/l10n-tg/browser/browser/newtab/newtab.ftl | 24 firefox-esr-140.6.0esr/l10n-tg/browser/browser/newtab/onboarding.ftl | 56 firefox-esr-140.6.0esr/l10n-tg/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-tg/browser/browser/policies/policies-descriptions.ftl | 4 firefox-esr-140.6.0esr/l10n-tg/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-tg/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-tg/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-tg/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-tg/browser/browser/preferences/preferences.ftl | 161 firefox-esr-140.6.0esr/l10n-tg/browser/browser/profiles.ftl | 106 firefox-esr-140.6.0esr/l10n-tg/browser/browser/reportBrokenSite.ftl | 1 firefox-esr-140.6.0esr/l10n-tg/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-tg/browser/browser/tabbrowser.ftl | 8 firefox-esr-140.6.0esr/l10n-tg/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-tg/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-tg/browser/chrome/browser/browser.properties | 2 firefox-esr-140.6.0esr/l10n-tg/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-tg/devtools/client/toolbox-options.ftl | 10 firefox-esr-140.6.0esr/l10n-tg/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-tg/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-tg/toolkit/toolkit/about/aboutGlean.ftl | 12 firefox-esr-140.6.0esr/l10n-tg/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-tg/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-tg/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-tg/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-tg/toolkit/toolkit/global/datetimepicker.ftl | 90 firefox-esr-140.6.0esr/l10n-tg/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-tg/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-tg/toolkit/toolkit/pdfviewer/viewer.ftl | 53 firefox-esr-140.6.0esr/l10n-tg/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-th/browser/browser/aboutLogins.ftl | 14 firefox-esr-140.6.0esr/l10n-th/browser/browser/aboutPocket.ftl | 8 firefox-esr-140.6.0esr/l10n-th/browser/browser/aboutPrivateBrowsing.ftl | 4 firefox-esr-140.6.0esr/l10n-th/browser/browser/aboutRestartRequired.ftl | 2 firefox-esr-140.6.0esr/l10n-th/browser/browser/aboutSessionRestore.ftl | 2 firefox-esr-140.6.0esr/l10n-th/browser/browser/aboutUnloads.ftl | 2 firefox-esr-140.6.0esr/l10n-th/browser/browser/appmenu.ftl | 10 firefox-esr-140.6.0esr/l10n-th/browser/browser/browser.ftl | 43 firefox-esr-140.6.0esr/l10n-th/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-th/browser/browser/contextual-manager.ftl | 14 firefox-esr-140.6.0esr/l10n-th/browser/browser/featureCallout.ftl | 26 firefox-esr-140.6.0esr/l10n-th/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-th/browser/browser/genai.ftl | 2 firefox-esr-140.6.0esr/l10n-th/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-th/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-th/browser/browser/newtab/asrouter.ftl | 18 firefox-esr-140.6.0esr/l10n-th/browser/browser/newtab/newtab.ftl | 27 firefox-esr-140.6.0esr/l10n-th/browser/browser/newtab/onboarding.ftl | 111 firefox-esr-140.6.0esr/l10n-th/browser/browser/pageInfo.ftl | 2 firefox-esr-140.6.0esr/l10n-th/browser/browser/policies/policies-descriptions.ftl | 2 firefox-esr-140.6.0esr/l10n-th/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-th/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-th/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-th/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-th/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-th/browser/browser/preferences/preferences.ftl | 184 firefox-esr-140.6.0esr/l10n-th/browser/browser/profiles.ftl | 136 firefox-esr-140.6.0esr/l10n-th/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-th/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-th/browser/browser/tabbrowser.ftl | 35 firefox-esr-140.6.0esr/l10n-th/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-th/browser/browser/unifiedExtensions.ftl | 8 firefox-esr-140.6.0esr/l10n-th/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-th/browser/chrome/browser/browser.properties | 4 firefox-esr-140.6.0esr/l10n-th/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-th/browser/installer/custom.properties | 2 firefox-esr-140.6.0esr/l10n-th/devtools/client/application.ftl | 2 firefox-esr-140.6.0esr/l10n-th/devtools/client/debugger.properties | 4 firefox-esr-140.6.0esr/l10n-th/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-th/devtools/client/webconsole.properties | 2 firefox-esr-140.6.0esr/l10n-th/security/manager/chrome/pipnss/pipnss.properties | 2 firefox-esr-140.6.0esr/l10n-th/security/manager/security/certificates/certManager.ftl | 2 firefox-esr-140.6.0esr/l10n-th/toolkit/toolkit/about/aboutAddons.ftl | 6 firefox-esr-140.6.0esr/l10n-th/toolkit/toolkit/about/aboutGlean.ftl | 2 firefox-esr-140.6.0esr/l10n-th/toolkit/toolkit/about/aboutTelemetry.ftl | 2 firefox-esr-140.6.0esr/l10n-th/toolkit/toolkit/about/certviewer.ftl | 3 firefox-esr-140.6.0esr/l10n-th/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-th/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-th/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-th/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-th/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-th/toolkit/toolkit/neterror/certError.ftl | 18 firefox-esr-140.6.0esr/l10n-th/toolkit/toolkit/pdfviewer/viewer.ftl | 47 firefox-esr-140.6.0esr/l10n-tl/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-tl/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-tl/browser/browser/preferences/preferences.ftl | 38 firefox-esr-140.6.0esr/l10n-tl/browser/browser/tabbrowser.ftl | 4 firefox-esr-140.6.0esr/l10n-tl/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-tl/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-tl/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-tl/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-tl/toolkit/toolkit/global/datetimepicker.ftl | 68 firefox-esr-140.6.0esr/l10n-tr/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-tr/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-tr/browser/browser/backupSettings.ftl | 251 firefox-esr-140.6.0esr/l10n-tr/browser/browser/browser.ftl | 49 firefox-esr-140.6.0esr/l10n-tr/browser/browser/browserContext.ftl | 8 firefox-esr-140.6.0esr/l10n-tr/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-tr/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-tr/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-tr/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-tr/browser/browser/fxviewTabList.ftl | 2 firefox-esr-140.6.0esr/l10n-tr/browser/browser/genai.ftl | 6 firefox-esr-140.6.0esr/l10n-tr/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-tr/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-tr/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-tr/browser/browser/newtab/newtab.ftl | 27 firefox-esr-140.6.0esr/l10n-tr/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-tr/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-tr/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-tr/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-tr/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-tr/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-tr/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-tr/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-tr/browser/browser/preferences/preferences.ftl | 217 firefox-esr-140.6.0esr/l10n-tr/browser/browser/profiles.ftl | 118 firefox-esr-140.6.0esr/l10n-tr/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-tr/browser/browser/sanitize.ftl | 2 firefox-esr-140.6.0esr/l10n-tr/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-tr/browser/browser/sync.ftl | 10 firefox-esr-140.6.0esr/l10n-tr/browser/browser/tabContextMenu.ftl | 13 firefox-esr-140.6.0esr/l10n-tr/browser/browser/tabbrowser.ftl | 42 firefox-esr-140.6.0esr/l10n-tr/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-tr/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-tr/browser/browser/unifiedExtensions.ftl | 14 firefox-esr-140.6.0esr/l10n-tr/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-tr/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-tr/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-tr/browser/chrome/overrides/appstrings.properties | 2 firefox-esr-140.6.0esr/l10n-tr/browser/installer/override.properties | 4 firefox-esr-140.6.0esr/l10n-tr/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-tr/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-tr/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-tr/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-tr/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-tr/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-tr/dom/chrome/dom/dom.properties | 13 firefox-esr-140.6.0esr/l10n-tr/dom/chrome/layout/HtmlForm.properties | 2 firefox-esr-140.6.0esr/l10n-tr/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-tr/security/manager/security/certificates/deviceManager.ftl | 2 firefox-esr-140.6.0esr/l10n-tr/toolkit/toolkit/about/aboutAddons.ftl | 14 firefox-esr-140.6.0esr/l10n-tr/toolkit/toolkit/about/aboutGlean.ftl | 38 firefox-esr-140.6.0esr/l10n-tr/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-tr/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-tr/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-tr/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-tr/toolkit/toolkit/global/appPicker.ftl | 2 firefox-esr-140.6.0esr/l10n-tr/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-tr/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-tr/toolkit/toolkit/global/handlerDialog.ftl | 13 firefox-esr-140.6.0esr/l10n-tr/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-tr/toolkit/toolkit/global/mozInputFolder.ftl | 2 firefox-esr-140.6.0esr/l10n-tr/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-tr/toolkit/toolkit/global/textActions.ftl | 4 firefox-esr-140.6.0esr/l10n-tr/toolkit/toolkit/global/unknownContentType.ftl | 2 firefox-esr-140.6.0esr/l10n-tr/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-tr/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-tr/toolkit/toolkit/pdfviewer/viewer.ftl | 53 firefox-esr-140.6.0esr/l10n-tr/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-trs/browser/browser/aboutLogins.ftl | 19 firefox-esr-140.6.0esr/l10n-trs/browser/browser/aboutPrivateBrowsing.ftl | 12 firefox-esr-140.6.0esr/l10n-trs/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-trs/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-trs/browser/browser/preferences/preferences.ftl | 36 firefox-esr-140.6.0esr/l10n-trs/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-trs/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-uk/browser/browser/aboutPrivateBrowsing.ftl | 2 firefox-esr-140.6.0esr/l10n-uk/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-uk/browser/browser/appmenu.ftl | 8 firefox-esr-140.6.0esr/l10n-uk/browser/browser/backupSettings.ftl | 252 firefox-esr-140.6.0esr/l10n-uk/browser/browser/browser.ftl | 52 firefox-esr-140.6.0esr/l10n-uk/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-uk/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-uk/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-uk/browser/browser/featureCallout.ftl | 26 firefox-esr-140.6.0esr/l10n-uk/browser/browser/firefoxRelay.ftl | 4 firefox-esr-140.6.0esr/l10n-uk/browser/browser/genai.ftl | 58 firefox-esr-140.6.0esr/l10n-uk/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-uk/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-uk/browser/browser/newtab/asrouter.ftl | 63 firefox-esr-140.6.0esr/l10n-uk/browser/browser/newtab/newtab.ftl | 117 firefox-esr-140.6.0esr/l10n-uk/browser/browser/newtab/onboarding.ftl | 25 firefox-esr-140.6.0esr/l10n-uk/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-uk/browser/browser/policies/policies-descriptions.ftl | 4 firefox-esr-140.6.0esr/l10n-uk/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-uk/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-uk/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-uk/browser/browser/preferences/permissions.ftl | 27 firefox-esr-140.6.0esr/l10n-uk/browser/browser/preferences/preferences.ftl | 161 firefox-esr-140.6.0esr/l10n-uk/browser/browser/profiles.ftl | 190 firefox-esr-140.6.0esr/l10n-uk/browser/browser/sidebar.ftl | 4 firefox-esr-140.6.0esr/l10n-uk/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-uk/browser/browser/tabbrowser.ftl | 17 firefox-esr-140.6.0esr/l10n-uk/browser/browser/taskbartabs.ftl | 50 firefox-esr-140.6.0esr/l10n-uk/browser/browser/termsofuse.ftl | 10 firefox-esr-140.6.0esr/l10n-uk/browser/browser/translations.ftl | 2 firefox-esr-140.6.0esr/l10n-uk/browser/browser/unexpectedScript.ftl | 33 firefox-esr-140.6.0esr/l10n-uk/browser/browser/unifiedExtensions.ftl | 11 firefox-esr-140.6.0esr/l10n-uk/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-uk/browser/browser/webrtc-preview.ftl | 6 firefox-esr-140.6.0esr/l10n-uk/browser/chrome/browser/browser.properties | 18 firefox-esr-140.6.0esr/l10n-uk/browser/chrome/browser/sitePermissions.properties | 3 firefox-esr-140.6.0esr/l10n-uk/browser/installer/custom.properties | 2 firefox-esr-140.6.0esr/l10n-uk/browser/installer/nsisstrings.properties | 2 firefox-esr-140.6.0esr/l10n-uk/devtools/client/aboutdebugging.ftl | 2 firefox-esr-140.6.0esr/l10n-uk/devtools/client/accessibility.properties | 2 firefox-esr-140.6.0esr/l10n-uk/devtools/client/memory.properties | 2 firefox-esr-140.6.0esr/l10n-uk/devtools/client/netmonitor.ftl | 2 firefox-esr-140.6.0esr/l10n-uk/devtools/client/netmonitor.properties | 8 firefox-esr-140.6.0esr/l10n-uk/devtools/client/startup.properties | 6 firefox-esr-140.6.0esr/l10n-uk/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-uk/dom/chrome/security/security.properties | 6 firefox-esr-140.6.0esr/l10n-uk/security/manager/security/certificates/certManager.ftl | 2 firefox-esr-140.6.0esr/l10n-uk/toolkit/chrome/passwordmgr/passwordmgr.properties | 2 firefox-esr-140.6.0esr/l10n-uk/toolkit/toolkit/about/aboutAddons.ftl | 12 firefox-esr-140.6.0esr/l10n-uk/toolkit/toolkit/about/aboutSupport.ftl | 2 firefox-esr-140.6.0esr/l10n-uk/toolkit/toolkit/about/aboutTelemetry.ftl | 2 firefox-esr-140.6.0esr/l10n-uk/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-uk/toolkit/toolkit/about/config.ftl | 4 firefox-esr-140.6.0esr/l10n-uk/toolkit/toolkit/featuregates/features.ftl | 2 firefox-esr-140.6.0esr/l10n-uk/toolkit/toolkit/firefoxlabs/features.ftl | 2 firefox-esr-140.6.0esr/l10n-uk/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-uk/toolkit/toolkit/global/datetimepicker.ftl | 69 firefox-esr-140.6.0esr/l10n-uk/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-uk/toolkit/toolkit/global/resetProfile.ftl | 2 firefox-esr-140.6.0esr/l10n-uk/toolkit/toolkit/neterror/certError.ftl | 10 firefox-esr-140.6.0esr/l10n-uk/toolkit/toolkit/neterror/netError.ftl | 12 firefox-esr-140.6.0esr/l10n-ur/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-ur/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-ur/browser/browser/preferences/preferences.ftl | 38 firefox-esr-140.6.0esr/l10n-ur/browser/browser/webauthnDialog.ftl | 5 firefox-esr-140.6.0esr/l10n-ur/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-ur/toolkit/toolkit/about/certviewer.ftl | 1 firefox-esr-140.6.0esr/l10n-ur/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-uz/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-uz/browser/browser/preferences/preferences.ftl | 34 firefox-esr-140.6.0esr/l10n-uz/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-uz/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-vi/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-vi/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-vi/browser/browser/backupSettings.ftl | 247 firefox-esr-140.6.0esr/l10n-vi/browser/browser/browser.ftl | 51 firefox-esr-140.6.0esr/l10n-vi/browser/browser/browserContext.ftl | 3 firefox-esr-140.6.0esr/l10n-vi/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-vi/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-vi/browser/browser/featureCallout.ftl | 24 firefox-esr-140.6.0esr/l10n-vi/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-vi/browser/browser/genai.ftl | 4 firefox-esr-140.6.0esr/l10n-vi/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-vi/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-vi/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-vi/browser/browser/newtab/newtab.ftl | 25 firefox-esr-140.6.0esr/l10n-vi/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-vi/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-vi/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-vi/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-vi/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-vi/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-vi/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-vi/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-vi/browser/browser/preferences/preferences.ftl | 223 firefox-esr-140.6.0esr/l10n-vi/browser/browser/profiles.ftl | 114 firefox-esr-140.6.0esr/l10n-vi/browser/browser/protections.ftl | 8 firefox-esr-140.6.0esr/l10n-vi/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-vi/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-vi/browser/browser/siteProtections.ftl | 10 firefox-esr-140.6.0esr/l10n-vi/browser/browser/tabContextMenu.ftl | 4 firefox-esr-140.6.0esr/l10n-vi/browser/browser/tabbrowser.ftl | 31 firefox-esr-140.6.0esr/l10n-vi/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-vi/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-vi/browser/browser/unifiedExtensions.ftl | 39 firefox-esr-140.6.0esr/l10n-vi/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-vi/browser/chrome/browser/browser.properties | 18 firefox-esr-140.6.0esr/l10n-vi/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-vi/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-vi/devtools/client/toolbox-options.ftl | 12 firefox-esr-140.6.0esr/l10n-vi/devtools/client/tooltips.ftl | 2 firefox-esr-140.6.0esr/l10n-vi/devtools/client/webconsole.properties | 12 firefox-esr-140.6.0esr/l10n-vi/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-vi/dom/chrome/dom/dom.properties | 11 firefox-esr-140.6.0esr/l10n-vi/dom/chrome/security/security.properties | 1 firefox-esr-140.6.0esr/l10n-vi/security/manager/security/pippki/pippki.ftl | 2 firefox-esr-140.6.0esr/l10n-vi/toolkit/toolkit/about/aboutAddons.ftl | 22 firefox-esr-140.6.0esr/l10n-vi/toolkit/toolkit/about/aboutGlean.ftl | 25 firefox-esr-140.6.0esr/l10n-vi/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-vi/toolkit/toolkit/about/certviewer.ftl | 9 firefox-esr-140.6.0esr/l10n-vi/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-vi/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-vi/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-vi/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-vi/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-vi/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-vi/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-vi/toolkit/toolkit/global/textActions.ftl | 6 firefox-esr-140.6.0esr/l10n-vi/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-vi/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-vi/toolkit/toolkit/pdfviewer/viewer.ftl | 57 firefox-esr-140.6.0esr/l10n-vi/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-xh/browser/browser/preferences/preferences.ftl | 24 firefox-esr-140.6.0esr/l10n-xh/devtools/client/toolbox-options.ftl | 2 firefox-esr-140.6.0esr/l10n-xh/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/aboutLogins.ftl | 4 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/aboutPrivateBrowsing.ftl | 2 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/appMenuNotifications.ftl | 2 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/backupSettings.ftl | 247 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/browser.ftl | 63 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/browserContext.ftl | 6 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/downloads.ftl | 6 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/featureCallout.ftl | 24 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/fxviewTabList.ftl | 4 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/genai.ftl | 22 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/newtab/asrouter.ftl | 22 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/newtab/newtab.ftl | 32 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/places.ftl | 8 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/policies/policies-descriptions.ftl | 7 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/preferences/formAutofill.ftl | 61 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/preferences/preferences.ftl | 224 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/preferences/siteDataSettings.ftl | 2 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/profiles.ftl | 118 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/sync.ftl | 9 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/tabContextMenu.ftl | 12 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/tabbrowser.ftl | 42 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/translations.ftl | 8 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/unexpectedScript.ftl | 18 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/unifiedExtensions.ftl | 24 firefox-esr-140.6.0esr/l10n-zh-CN/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-zh-CN/browser/chrome/browser/browser.properties | 12 firefox-esr-140.6.0esr/l10n-zh-CN/browser/chrome/browser/sitePermissions.properties | 5 firefox-esr-140.6.0esr/l10n-zh-CN/browser/chrome/overrides/appstrings.properties | 2 firefox-esr-140.6.0esr/l10n-zh-CN/browser/extensions/formautofill/formautofill.properties | 2 firefox-esr-140.6.0esr/l10n-zh-CN/devtools/client/accessibility.ftl | 2 firefox-esr-140.6.0esr/l10n-zh-CN/devtools/client/debugger.properties | 8 firefox-esr-140.6.0esr/l10n-zh-CN/devtools/client/inspector.properties | 2 firefox-esr-140.6.0esr/l10n-zh-CN/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-zh-CN/devtools/client/styleeditor.properties | 2 firefox-esr-140.6.0esr/l10n-zh-CN/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-zh-CN/devtools/client/tooltips.ftl | 4 firefox-esr-140.6.0esr/l10n-zh-CN/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-zh-CN/devtools/shared/accessibility.properties | 2 firefox-esr-140.6.0esr/l10n-zh-CN/devtools/shared/styleinspector.properties | 13 firefox-esr-140.6.0esr/l10n-zh-CN/dom/chrome/accessibility/AccessFu.properties | 2 firefox-esr-140.6.0esr/l10n-zh-CN/dom/chrome/dom/dom.properties | 9 firefox-esr-140.6.0esr/l10n-zh-CN/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/chrome/global/aboutStudies.properties | 4 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/chrome/mozapps/profile/profileSelection.properties | 2 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/toolkit/about/aboutAddons.ftl | 21 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/toolkit/about/aboutGlean.ftl | 48 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/toolkit/about/aboutLogging.ftl | 25 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/toolkit/about/aboutSupport.ftl | 2 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/toolkit/about/abuseReports.ftl | 6 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/toolkit/firefoxlabs/features.ftl | 8 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/toolkit/formautofill/formAutofill.ftl | 12 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/toolkit/global/createProfileWizard.ftl | 2 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/toolkit/global/extensionPermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/toolkit/global/handlerDialog.ftl | 11 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/toolkit/global/textActions.ftl | 4 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/toolkit/neterror/certError.ftl | 6 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/toolkit/pdfviewer/viewer.ftl | 49 firefox-esr-140.6.0esr/l10n-zh-CN/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/addonNotifications.ftl | 1 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/appmenu.ftl | 6 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/backupSettings.ftl | 247 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/browser.ftl | 44 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/browserContext.ftl | 6 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/contextual-manager.ftl | 4 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/customkeys.ftl | 37 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/featureCallout.ftl | 22 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/firefoxRelay.ftl | 3 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/fxviewTabList.ftl | 2 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/genai.ftl | 8 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/linuxDesktopEntry.ftl | 4 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/menubar.ftl | 3 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/newtab/asrouter.ftl | 20 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/newtab/newtab.ftl | 25 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/newtab/onboarding.ftl | 93 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/permissions.ftl | 5 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/policies/policies-descriptions.ftl | 5 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/preferences/colors.ftl | 12 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/preferences/formAutofill.ftl | 53 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/preferences/fxaPairDevice.ftl | 1 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/preferences/moreFromMozilla.ftl | 1 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/preferences/permissions.ftl | 7 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/preferences/preferences.ftl | 228 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/profiles.ftl | 116 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/reportBrokenSite.ftl | 7 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/sitePermissions.ftl | 2 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/sync.ftl | 9 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/tabContextMenu.ftl | 12 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/tabbrowser.ftl | 42 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/taskbartabs.ftl | 14 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/termsofuse.ftl | 2 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/unifiedExtensions.ftl | 24 firefox-esr-140.6.0esr/l10n-zh-TW/browser/browser/webauthnDialog.ftl | 43 firefox-esr-140.6.0esr/l10n-zh-TW/browser/chrome/browser/browser.properties | 8 firefox-esr-140.6.0esr/l10n-zh-TW/browser/chrome/browser/sitePermissions.properties | 1 firefox-esr-140.6.0esr/l10n-zh-TW/devtools/client/debugger.properties | 6 firefox-esr-140.6.0esr/l10n-zh-TW/devtools/client/jsonview.properties | 7 firefox-esr-140.6.0esr/l10n-zh-TW/devtools/client/storage.ftl | 1 firefox-esr-140.6.0esr/l10n-zh-TW/devtools/client/toolbox-options.ftl | 14 firefox-esr-140.6.0esr/l10n-zh-TW/devtools/client/tooltips.ftl | 4 firefox-esr-140.6.0esr/l10n-zh-TW/devtools/client/webconsole.properties | 4 firefox-esr-140.6.0esr/l10n-zh-TW/devtools/shared/styleinspector.properties | 7 firefox-esr-140.6.0esr/l10n-zh-TW/dom/chrome/dom/dom.properties | 11 firefox-esr-140.6.0esr/l10n-zh-TW/dom/chrome/security/security.properties | 3 firefox-esr-140.6.0esr/l10n-zh-TW/netwerk/necko.properties | 4 firefox-esr-140.6.0esr/l10n-zh-TW/security/manager/chrome/pipnss/nsserrors.properties | 2 firefox-esr-140.6.0esr/l10n-zh-TW/toolkit/toolkit/about/aboutAddons.ftl | 14 firefox-esr-140.6.0esr/l10n-zh-TW/toolkit/toolkit/about/aboutGlean.ftl | 40 firefox-esr-140.6.0esr/l10n-zh-TW/toolkit/toolkit/about/aboutLogging.ftl | 23 firefox-esr-140.6.0esr/l10n-zh-TW/toolkit/toolkit/about/certviewer.ftl | 5 firefox-esr-140.6.0esr/l10n-zh-TW/toolkit/toolkit/about/url-classifier.ftl | 1 firefox-esr-140.6.0esr/l10n-zh-TW/toolkit/toolkit/firefoxlabs/features.ftl | 4 firefox-esr-140.6.0esr/l10n-zh-TW/toolkit/toolkit/global/browser-utils.ftl | 6 firefox-esr-140.6.0esr/l10n-zh-TW/toolkit/toolkit/global/datetimepicker.ftl | 94 firefox-esr-140.6.0esr/l10n-zh-TW/toolkit/toolkit/global/handlerDialog.ftl | 13 firefox-esr-140.6.0esr/l10n-zh-TW/toolkit/toolkit/global/mozButton.ftl | 7 firefox-esr-140.6.0esr/l10n-zh-TW/toolkit/toolkit/global/mozPageHeader.ftl | 6 firefox-esr-140.6.0esr/l10n-zh-TW/toolkit/toolkit/global/textActions.ftl | 4 firefox-esr-140.6.0esr/l10n-zh-TW/toolkit/toolkit/neterror/certError.ftl | 7 firefox-esr-140.6.0esr/l10n-zh-TW/toolkit/toolkit/neterror/netError.ftl | 10 firefox-esr-140.6.0esr/l10n-zh-TW/toolkit/toolkit/neterror/nsserrors.ftl | 2 firefox-esr-140.6.0esr/l10n-zh-TW/toolkit/toolkit/pdfviewer/viewer.ftl | 49 firefox-esr-140.6.0esr/l10n-zh-TW/toolkit/toolkit/updates/elevation.ftl | 1 firefox-esr-140.6.0esr/netwerk/base/nsIUDPSocket.idl | 7 firefox-esr-140.6.0esr/netwerk/base/nsUDPSocket.cpp | 2 firefox-esr-140.6.0esr/netwerk/dns/effective_tld_names.dat | 171 firefox-esr-140.6.0esr/netwerk/protocol/http/Http3Session.cpp | 10 firefox-esr-140.6.0esr/netwerk/protocol/http/HttpConnectionUDP.cpp | 12 firefox-esr-140.6.0esr/netwerk/streamconv/converters/nsIndexedToHTML.cpp | 5 firefox-esr-140.6.0esr/nsprpub/TAG-INFO | 2 firefox-esr-140.6.0esr/nsprpub/configure | 2 firefox-esr-140.6.0esr/nsprpub/configure.in | 2 firefox-esr-140.6.0esr/nsprpub/pr/include/prinit.h | 4 firefox-esr-140.6.0esr/nsprpub/pr/src/misc/prtime.c | 2 firefox-esr-140.6.0esr/nsprpub/pr/tests/parsetm.c | 58 firefox-esr-140.6.0esr/nsprpub/pr/tests/vercheck.c | 5 firefox-esr-140.6.0esr/security/ct/CTKnownLogs.h | 34 firefox-esr-140.6.0esr/security/manager/ssl/StaticHPKPins.h | 2 firefox-esr-140.6.0esr/security/manager/ssl/nsSTSPreloadList.inc | 3671 +++---- firefox-esr-140.6.0esr/security/manager/tools/log_list.json | 68 firefox-esr-140.6.0esr/services/settings/dumps/blocklists/addons-bloomfilters.json | 2911 +++++ firefox-esr-140.6.0esr/services/settings/dumps/main/devtools-compatibility-browsers.json | 164 firefox-esr-140.6.0esr/services/settings/dumps/main/search-config-icons.json | 19 firefox-esr-140.6.0esr/services/settings/dumps/main/search-config-v2.json | 47 firefox-esr-140.6.0esr/services/settings/dumps/security-state/intermediates.json | 388 firefox-esr-140.6.0esr/sourcestamp.txt | 4 firefox-esr-140.6.0esr/taskcluster/kinds/instrumented-build-apk/kind.yml | 1 firefox-esr-140.6.0esr/taskcluster/kinds/instrumented-build-macrobenchmark-apk/kind.yml | 1 firefox-esr-140.6.0esr/testing/web-platform/tests/editing/other/restyle-textcontrol-during-beforeinput.html | 40 firefox-esr-140.6.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/iframe_javascript_url_form_submission.html | 32 firefox-esr-140.6.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/iframe_javascript_url_xhr.html | 84 firefox-esr-140.6.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/resources/javascript_url_form_submission.html | 3 firefox-esr-140.6.0esr/testing/web-platform/tests/webrtc-encoded-transform/RTCRtpScriptTransform-sender-worker-single-frame.https.html | 1 firefox-esr-140.6.0esr/third_party/moz.build | 3 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/base/allocator/partition_allocator/partition_alloc_base/debug/debugging_buildflags.h | 21 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/base/allocator/partition_allocator/partition_alloc_buildflags.h | 35 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/base/debug/debugging_buildflags.h | 25 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/base/debug/stack_trace.h | 22 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/base/logging.cc | 181 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/base/logging_buildflags.h | 18 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/base/synchronization/synchronization_buildflags.h | 17 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/base/threading/scoped_blocking_call.h | 47 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/base/time/buildflags/buildflags.h | 17 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/base/tracing_buildflags.h | 17 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/base/values.h | 16 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/build/blink_buildflags.h | 17 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/build/branding_buildflags.h | 17 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/build/chromecast_buildflags.h | 18 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/build/chromeos_buildflags.h | 17 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/components/zucchini/buildflags.h | 20 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/patches/0001-Remove-dependency-on-double-conversion.patch | 93 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/patches/0002-Adjust-prefix-path-computations-for-base-Location.patch | 49 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/patches/0003-Limit-dependencies-in-check.cc.patch | 111 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/patches/0004-Neuter-RefCountedBase-CalledOnValidSequence.patch | 27 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/patches/0005-Only-define-IsUser32AndGdi32Available-from-win_util..patch | 61 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/patches/0006-Define-only-the-required-functions-from-file_util.h.patch | 502 + firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/patches/0007-Only-define-SysInfo-VMAllocationGranularity-from-sys.patch | 366 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/patches/0008-Neuter-debug-only-CheckedScopedHandle-in-scoped_hand.patch | 109 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/patches/0009-Limit-dependencies-in-file_path.cc.patch | 56 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/patches/0010-Limit-dependencies-in-file.-cc-h-and-friends.patch | 165 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/patches/0011-Limit-dependencies-in-memory_mapped_file.-cc-h-and-m.patch | 118 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/patches/0012-Remove-debug-only-lock-implementation.patch | 32 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/patches/0013-Limit-dependencies-in-time.-cc-h-and-time_win.cc.patch | 164 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/patches/0014-Neuter-chromium-logging-and-error-handling-in-zucchi.patch | 56 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/patches/0015-Make-MappedFileWriter-usable-without-the-DELETE-acce.patch | 81 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/patches/0016-Use-zucchini-status-Code-definition-from-moz_zucchin.patch | 43 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/patches/0017-Neuter-file-descriptor-ownership-enforcement.patch | 69 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/patches/0018-Remove-third-party-dependencies-in-rand_util.h-and-f.patch | 197 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/patches/0019-Adjust-base_paths.h-and-friends.patch | 289 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/patches/0020-Limit-dependencies-in-foundation_util.mm.patch | 88 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/patches/0021-Fix-zucchini-gtests.patch | 109 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/patches/0022-Support-build-linux64-base-toolchains-clang-jobs.patch | 729 + firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/testing/gtest/include/gtest/gtest.h | 12 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/testing/gtest/include/gtest/gtest_prod.h | 12 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/third_party/abseil-cpp/absl/base/attributes.h | 7 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/third_party/abseil-cpp/absl/functional/function_ref.h | 7 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/third_party/abseil-cpp/absl/types/optional.h | 7 firefox-esr-140.6.0esr/third_party/zucchini/chromium-shim/third_party/abseil-cpp/absl/utility/utility.h | 7 firefox-esr-140.6.0esr/third_party/zucchini/chromium/LICENSE | 27 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/augmentations/compiler_specific.h | 22 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h | 235 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/component_export.h | 80 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/cxx20_is_constant_evaluated.h | 41 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h | 264 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types.h | 16 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types_list.inc | 25 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_config.h | 333 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_forward.h | 94 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr.h | 1049 ++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr_exclusion.h | 37 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr_noop_impl.h | 120 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ref.h | 444 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/apple/bundle_locations.h | 71 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/atomic_ref_count.h | 75 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/atomicops.h | 153 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/atomicops_internals_atomicword_compat.h | 94 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/atomicops_internals_portable.h | 190 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/auto_reset.h | 69 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_export.h | 29 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths.cc | 73 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths.h | 102 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_apple.cc | 52 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_apple.h | 22 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_mac.h | 25 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_mac.mm | 82 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_posix.cc | 139 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_posix.h | 28 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_win.cc | 236 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_win.h | 66 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/bit_cast.h | 48 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/bits.h | 142 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/check.cc | 347 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/check.h | 279 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/check_op.cc | 101 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/check_op.h | 254 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/command_line.cc | 706 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/command_line.h | 342 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/compiler_specific.h | 441 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/adapters.h | 57 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/checked_iterators.h | 299 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/circular_deque.h | 1130 ++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/contains.h | 97 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/contiguous_iterator.h | 108 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase.h | 33 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_deque.h | 41 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_forward_list.h | 42 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_internal.h | 33 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_list.h | 38 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_map.h | 37 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_set.h | 36 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_string.h | 43 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_unordered_map.h | 48 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_unordered_set.h | 46 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_vector.h | 41 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/span.h | 553 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/stack.h | 23 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/util.h | 21 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/vector_buffer.h | 193 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/cpu.cc | 387 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/cpu.h | 159 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/cxx20_is_constant_evaluated.h | 29 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/cxx20_to_address.h | 50 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/dcheck_is_on.h | 22 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file.cc | 181 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file.h | 426 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator.cc | 32 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator.h | 246 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator_posix.cc | 265 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator_win.cc | 228 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_path.cc | 1420 ++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_path.h | 532 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_posix.cc | 625 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_tracing.cc | 63 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_tracing.h | 96 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_util.cc | 533 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_util.h | 724 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_util_mac.mm | 71 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_util_posix.cc | 1393 ++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_util_win.cc | 1291 ++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_win.cc | 508 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file.cc | 158 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file.h | 155 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file_posix.cc | 110 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file_win.cc | 152 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/platform_file.h | 43 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_file.cc | 49 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_file.h | 115 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_file_linux.cc | 122 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_temp_dir.cc | 105 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_temp_dir.h | 71 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/format_macros.h | 98 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/functional/bind.h | 459 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/functional/bind_internal.h | 1826 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/functional/callback.h | 496 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/functional/callback_forward.h | 24 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/functional/callback_helpers.h | 252 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/functional/callback_internal.cc | 75 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/functional/callback_internal.h | 219 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/functional/callback_tags.h | 34 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/functional/disallow_unretained.h | 71 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/functional/function_ref.h | 106 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/functional/identity.h | 28 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/functional/invoke.h | 152 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/functional/unretained_traits.h | 157 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/gtest_prod_util.h | 66 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/immediate_crash.h | 154 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/location.cc | 156 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/location.h | 127 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/logging.h | 774 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/mac/foundation_util.h | 320 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/mac/foundation_util.mm | 482 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/mac/mac_logging.h | 101 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/mac/mach_logging.cc | 92 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/mac/mach_logging.h | 171 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/mac/scoped_cftyperef.h | 50 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/mac/scoped_mach_port.h | 79 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/mac/scoped_typeref.h | 146 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/memory/raw_ptr.h | 13 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/memory/raw_ptr_asan_bound_arg_tracker.h | 123 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/memory/raw_ptr_asan_service.h | 101 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/memory/raw_ptr_exclusion.h | 13 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/memory/raw_ref.h | 13 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/memory/raw_scoped_refptr_mismatch_checker.h | 55 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/memory/ref_counted.cc | 106 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/memory/ref_counted.h | 492 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/memory/safe_ref_traits.h | 22 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/memory/scoped_policy.h | 25 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/memory/scoped_refptr.h | 435 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/memory/weak_ptr.h | 479 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/no_destructor.h | 132 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/notreached.h | 98 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/numerics/checked_math.h | 380 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/numerics/checked_math_impl.h | 593 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/numerics/clamped_math.h | 260 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/numerics/clamped_math_impl.h | 340 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/numerics/safe_conversions.h | 388 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/numerics/safe_conversions_arm_impl.h | 51 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/numerics/safe_conversions_impl.h | 855 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/numerics/safe_math.h | 12 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/numerics/safe_math_arm_impl.h | 125 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/numerics/safe_math_clang_gcc_impl.h | 157 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/numerics/safe_math_shared_impl.h | 216 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/path_service.cc | 375 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/path_service.h | 93 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/posix/eintr_wrapper.h | 68 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/posix/safe_strerror.cc | 116 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/posix/safe_strerror.h | 44 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/process/process_handle.h | 145 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/process/process_handle_posix.cc | 23 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/process/process_handle_win.cc | 55 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/process/process_metrics.h | 648 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/rand_util.cc | 153 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/rand_util.h | 213 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/rand_util_posix.cc | 257 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/rand_util_win.cc | 106 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/ranges/algorithm.h | 5018 ++++++++++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/ranges/functional.h | 32 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/ranges/ranges.h | 140 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/scoped_clear_last_error.h | 55 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/scoped_clear_last_error_win.cc | 20 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/scoped_generic.h | 325 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/sequence_checker.h | 136 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/sequence_checker_impl.h | 68 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/sequence_token.h | 119 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/strcat.cc | 45 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/strcat.h | 109 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/strcat_internal.h | 76 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/strcat_win.cc | 31 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/strcat_win.h | 36 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/string_number_conversions.cc | 179 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/string_number_conversions.h | 156 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/string_number_conversions_internal.h | 285 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/string_number_conversions_win.h | 34 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/string_piece.h | 36 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/string_piece_forward.h | 25 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/string_split.cc | 149 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/string_split.h | 145 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/string_split_internal.h | 103 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/string_split_win.h | 45 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/string_tokenizer.h | 360 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/string_util.cc | 445 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/string_util.h | 604 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/string_util_constants.cc | 56 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/string_util_impl_helpers.h | 617 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/string_util_internal.h | 62 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/string_util_posix.h | 38 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/string_util_win.cc | 143 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/string_util_win.h | 200 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/stringprintf.cc | 224 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/stringprintf.h | 75 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/sys_string_conversions.h | 93 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/sys_string_conversions_posix.cc | 159 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/to_string.h | 117 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/utf_ostream_operators.cc | 31 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/utf_ostream_operators.h | 46 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/utf_string_conversion_utils.h | 119 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/utf_string_conversions.cc | 362 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/strings/utf_string_conversions.h | 102 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/synchronization/atomic_flag.h | 51 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/synchronization/lock.h | 140 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/synchronization/lock_impl.h | 260 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/synchronization/lock_impl_posix.cc | 126 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/synchronization/lock_impl_win.cc | 21 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/system/sys_info.h | 301 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/system/sys_info_internal.h | 58 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/system/sys_info_posix.cc | 313 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/system/sys_info_win.cc | 330 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/template_util.h | 146 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/test/gtest_util.h | 132 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/third_party/icu/LICENSE | 76 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/third_party/icu/icu_utf.h | 569 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/third_party/nspr/LICENSE | 35 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/third_party/nspr/prtime.cc | 1189 ++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/third_party/nspr/prtime.h | 263 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/thread_annotations.h | 263 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/threading/platform_thread.h | 361 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/threading/platform_thread_ref.h | 62 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/threading/thread_checker_impl.h | 108 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/threading/thread_collision_warner.h | 251 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/time/time.cc | 333 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/time/time.h | 1394 ++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/time/time_mac.mm | 259 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/time/time_now_posix.cc | 140 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/time/time_override.h | 95 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/time/time_win.cc | 834 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/trace_event/base_tracing.h | 35 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/trace_event/base_tracing_forward.h | 46 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/trace_event/common/trace_event_common.h | 1133 ++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/trace_event/memory_allocator_dump_guid.h | 55 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/trace_event/trace_event_stub.cc | 60 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/trace_event/trace_event_stub.h | 275 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/types/always_false.h | 48 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/types/pass_key.h | 48 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/types/supports_ostream_operator.h | 28 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/version.h | 77 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/win/current_module.h | 17 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/win/scoped_handle.cc | 77 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/win/scoped_handle.h | 227 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/win/shlwapi.h | 19 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/win/win_handle_types.h | 16 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/win/win_handle_types_list.inc | 25 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/win/win_util.cc | 842 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/win/win_util.h | 293 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/win/windows_defines.inc | 12 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/win/windows_types.h | 372 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/win/windows_undefines.inc | 9 firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/win/windows_version.cc | 511 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/win/windows_version.h | 260 firefox-esr-140.6.0esr/third_party/zucchini/chromium/build/build_config.h | 385 firefox-esr-140.6.0esr/third_party/zucchini/chromium/build/buildflag.h | 47 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/abs32_utils.cc | 211 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/abs32_utils.h | 142 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/abs32_utils_unittest.cc | 555 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/address_translator.cc | 258 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/address_translator.h | 201 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/address_translator_unittest.cc | 586 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/algorithm.h | 147 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/algorithm_unittest.cc | 360 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/arm_utils.cc | 597 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/arm_utils.h | 423 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/arm_utils_unittest.cc | 866 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/binary_data_histogram.cc | 91 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/binary_data_histogram.h | 90 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/binary_data_histogram_unittest.cc | 144 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/buffer_sink.cc | 11 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/buffer_sink.h | 69 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/buffer_sink_unittest.cc | 84 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/buffer_source.cc | 116 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/buffer_source.h | 155 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/buffer_source_unittest.cc | 428 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/buffer_view.h | 210 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/buffer_view_unittest.cc | 290 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/crc32.cc | 43 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/crc32.h | 17 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/crc32_unittest.cc | 49 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/disassembler.cc | 61 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/disassembler.h | 177 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/disassembler_elf.cc | 781 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/disassembler_elf.h | 363 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/disassembler_elf_unittest.cc | 177 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/disassembler_no_op.cc | 31 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/disassembler_no_op.h | 41 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/disassembler_win32.cc | 410 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/disassembler_win32.h | 135 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/element_detection.cc | 200 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/element_detection.h | 62 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/element_detection_unittest.cc | 102 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/encoded_view.cc | 78 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/encoded_view.h | 189 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/encoded_view_unittest.cc | 202 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/ensemble_matcher.cc | 37 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/ensemble_matcher.h | 60 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/equivalence_map.cc | 567 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/equivalence_map.h | 208 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/equivalence_map_unittest.cc | 659 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/exception_filter_helper_win.cc | 74 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/exception_filter_helper_win.h | 81 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/exception_filter_helper_win_unittest.cc | 237 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/heuristic_ensemble_matcher.cc | 370 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/heuristic_ensemble_matcher.h | 40 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/image_index.cc | 78 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/image_index.h | 116 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/image_index_unittest.cc | 131 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/image_utils.h | 275 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/image_utils_unittest.cc | 33 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/imposed_ensemble_matcher.cc | 142 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/imposed_ensemble_matcher.h | 83 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/imposed_ensemble_matcher_unittest.cc | 244 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/integration_test.cc | 111 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/io_utils.cc | 52 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/io_utils.h | 146 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/io_utils_unittest.cc | 160 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/main_utils.cc | 266 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/main_utils.h | 34 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/mapped_file.cc | 81 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/mapped_file.h | 93 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/mapped_file_unittest.cc | 61 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/patch_read_write_unittest.cc | 804 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/patch_reader.cc | 405 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/patch_reader.h | 283 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/patch_utils.h | 139 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/patch_utils_unittest.cc | 183 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/patch_writer.cc | 298 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/patch_writer.h | 272 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/reference_set.cc | 60 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/reference_set.h | 65 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/reference_set_unittest.cc | 49 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/rel32_finder.cc | 294 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/rel32_finder.h | 284 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/rel32_finder_unittest.cc | 744 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/rel32_utils.cc | 86 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/rel32_utils.h | 212 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/rel32_utils_unittest.cc | 548 + firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/reloc_elf.cc | 167 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/reloc_elf.h | 104 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/reloc_elf_unittest.cc | 242 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/reloc_win32.cc | 199 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/reloc_win32.h | 141 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/reloc_win32_unittest.cc | 250 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/suffix_array.h | 476 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/suffix_array_unittest.cc | 350 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/target_pool.cc | 83 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/target_pool.h | 81 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/target_pool_unittest.cc | 64 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/targets_affinity.cc | 108 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/targets_affinity.h | 74 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/targets_affinity_unittest.cc | 131 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/test_disassembler.cc | 61 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/test_disassembler.h | 77 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/test_reference_reader.cc | 20 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/test_reference_reader.h | 32 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/test_utils.cc | 26 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/test_utils.h | 35 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/type_elf.h | 283 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/type_win_pe.h | 191 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/typed_value.h | 57 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/typed_value_unittest.cc | 40 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/version_info.h | 30 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini.h | 80 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_apply.cc | 218 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_apply.h | 41 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_apply_unittest.cc | 14 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_commands.cc | 154 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_commands.h | 58 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_gen.cc | 468 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_gen.h | 85 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_gen_unittest.cc | 181 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_integration.cc | 274 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_integration.h | 78 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_main.cc | 63 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_tools.cc | 140 firefox-esr-140.6.0esr/third_party/zucchini/chromium/components/zucchini/zucchini_tools.h | 45 firefox-esr-140.6.0esr/third_party/zucchini/chromium/moz.yaml | 441 firefox-esr-140.6.0esr/third_party/zucchini/executable/moz.build | 43 firefox-esr-140.6.0esr/third_party/zucchini/moz.build | 167 firefox-esr-140.6.0esr/third_party/zucchini/moz_zucchini.cc | 183 firefox-esr-140.6.0esr/third_party/zucchini/moz_zucchini.h | 77 firefox-esr-140.6.0esr/third_party/zucchini/tests/gtest/moz.build | 80 firefox-esr-140.6.0esr/toolkit/components/cleardata/ClearDataService.sys.mjs | 66 firefox-esr-140.6.0esr/toolkit/components/extensions/moz.build | 1 firefox-esr-140.6.0esr/toolkit/components/extensions/parent/ext-identity.js | 2 firefox-esr-140.6.0esr/toolkit/components/extensions/test/browser/protocol-remote-false/browser.toml | 7 firefox-esr-140.6.0esr/toolkit/components/extensions/test/browser/protocol-remote-false/browser_ext_dir_listing.js | 130 firefox-esr-140.6.0esr/toolkit/content/gmp-sources/openh264.json | 16 firefox-esr-140.6.0esr/toolkit/content/license.html | 6 firefox-esr-140.6.0esr/toolkit/crashreporter/nsExceptionHandler.cpp | 17 firefox-esr-140.6.0esr/toolkit/modules/tests/xpcshell/test_GMPInstallManager.js | 2 firefox-esr-140.6.0esr/toolkit/mozapps/update/UpdateService.sys.mjs | 148 firefox-esr-140.6.0esr/toolkit/mozapps/update/metrics.yaml | 14 firefox-esr-140.6.0esr/toolkit/mozapps/update/nsIUpdateService.idl | 3 firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/data/README.md | 79 firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/data/xpcshellUtilsAUS.js | 90 firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/moz.build | 5 firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/test_file_change_mtime.cpp | 65 firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/test_file_hold_open.cpp | 53 firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/unit_aus_update/accessAndLockout.js | 122 firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/unit_aus_update/xpcshell.toml | 4 firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marCallbackAppStageSuccessPartialZucchini_win.js | 31 firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marCallbackAppSuccessPartialZucchini_win.js | 24 firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marFailurePartialZucchini.js | 39 firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marFileInUseStageFailurePartialZucchini_win.js | 44 firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marFileInUseSuccessPartialZucchini_win.js | 27 firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marFileLockedFailurePartialZucchini_win.js | 26 firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marFileLockedStageFailurePartialZucchini_win.js | 33 firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marRMRFDirFileInUseStageFailurePartialZucchini_win.js | 47 firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marRMRFDirFileInUseSuccessPartialZucchini_win.js | 30 firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marStageFailurePartialZucchini.js | 31 firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marStageSuccessPartialZucchini.js | 36 firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marSuccessPartialZucchini.js | 30 firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/marSuccessPartialZucchiniWhileBackgroundTaskRunning.js | 130 firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/xpcshell_base.toml | 42 firefox-esr-140.6.0esr/toolkit/mozapps/update/tests/unit_update_binary/xpcshell_service.toml | 36 firefox-esr-140.6.0esr/toolkit/mozapps/update/updater/bspatch/bspatch.cpp | 6 firefox-esr-140.6.0esr/toolkit/mozapps/update/updater/bspatch/bspatch.h | 2 firefox-esr-140.6.0esr/toolkit/mozapps/update/updater/updater-common.build | 11 firefox-esr-140.6.0esr/toolkit/mozapps/update/updater/updater.cpp | 335 firefox-esr-140.6.0esr/toolkit/toolkit.mozbuild | 13 firefox-esr-140.6.0esr/toolkit/xre/dllservices/mozglue/WindowsDllBlocklistDefs.in | 2 firefox-esr-140.6.0esr/toolkit/xre/dllservices/mozglue/interceptor/PatcherDetour.h | 7 firefox-esr-140.6.0esr/uriloader/base/nsDocLoader.cpp | 77 firefox-esr-140.6.0esr/uriloader/base/nsDocLoader.h | 4 firefox-esr-140.6.0esr/widget/ContentCache.cpp | 2 firefox-esr-140.6.0esr/widget/tests/browser/browser_test_ContentCache.js | 33 firefox-esr-140.6.0esr/widget/windows/TSFTextStore.cpp | 34 firefox-esr-140.6.0esr/widget/windows/TSFTextStoreBase.cpp | 5 4332 files changed, 177745 insertions(+), 9317 deletions(-) diff -Nru firefox-esr-140.5.0esr/CLOBBER firefox-esr-140.6.0esr/CLOBBER --- firefox-esr-140.5.0esr/CLOBBER 2025-11-07 00:11:00.000000000 +0000 +++ firefox-esr-140.6.0esr/CLOBBER 2025-12-01 18:15:29.000000000 +0000 @@ -22,4 +22,4 @@ # changes to stick? As of bug 928195, this shouldn't be necessary! Please # don't change CLOBBER for WebIDL changes any more. -Merge day clobber 2025-10-13 \ No newline at end of file +Merge day clobber 2025-11-10 \ No newline at end of file diff -Nru firefox-esr-140.5.0esr/browser/components/aboutlogins/content/components/login-item.mjs firefox-esr-140.6.0esr/browser/components/aboutlogins/content/components/login-item.mjs --- firefox-esr-140.5.0esr/browser/components/aboutlogins/content/components/login-item.mjs 2025-11-07 00:11:00.000000000 +0000 +++ firefox-esr-140.6.0esr/browser/components/aboutlogins/content/components/login-item.mjs 2025-12-01 18:15:29.000000000 +0000 @@ -969,13 +969,6 @@ } _updatePasswordRevealState() { - if ( - window.AboutLoginsUtils && - window.AboutLoginsUtils.passwordRevealVisible === false - ) { - this._revealCheckbox.hidden = true; - } - let { checked } = this._revealCheckbox; let inputType = checked ? "text" : "password"; this._passwordInput.type = inputType; @@ -988,6 +981,13 @@ this._revealCheckbox.hidden = false; } + if ( + window.AboutLoginsUtils && + window.AboutLoginsUtils.passwordRevealVisible === false + ) { + this._revealCheckbox.hidden = true; + } + // Swap which is in the document depending on whether we need the // real .value (which means that the primary password was already entered, // if applicable) diff -Nru firefox-esr-140.5.0esr/browser/components/enterprisepolicies/tests/browser/browser_policy_disable_password_reveal.js firefox-esr-140.6.0esr/browser/components/enterprisepolicies/tests/browser/browser_policy_disable_password_reveal.js --- firefox-esr-140.5.0esr/browser/components/enterprisepolicies/tests/browser/browser_policy_disable_password_reveal.js 2025-11-07 00:11:01.000000000 +0000 +++ firefox-esr-140.6.0esr/browser/components/enterprisepolicies/tests/browser/browser_policy_disable_password_reveal.js 2025-12-01 18:15:30.000000000 +0000 @@ -4,6 +4,41 @@ "use strict"; add_task(async function test_hidden_reveal_password() { + let login = Cc["@mozilla.org/login-manager/loginInfo;1"].createInstance( + Ci.nsILoginInfo + ); + login.init("https://example.com", "", null, "username", "password"); + login.QueryInterface(Ci.nsILoginMetaInfo); + login.timePasswordChanged = Date.now(); + await Services.logins.addLoginAsync(login); + + await setupPolicyEngineWithJson({ + policies: { + DisablePasswordReveal: true, + }, + }); + + let aboutLoginsTab = await BrowserTestUtils.openNewForegroundTab({ + gBrowser, + url: "about:logins", + }); + + let browser = gBrowser.selectedBrowser; + + await SpecialPowers.spawn(browser, [], () => { + let loginItem = Cu.waiveXrays(content.document.querySelector("login-item")); + + let passwordReveal = loginItem.shadowRoot.querySelector( + ".reveal-password-checkbox" + ); + is(passwordReveal.hidden, true, "Password reveal button should be hidden"); + }); + BrowserTestUtils.removeTab(aboutLoginsTab); + + await Services.logins.removeAllLogins(); +}); + +add_task(async function test_bug_1696948() { await setupPolicyEngineWithJson({ policies: { DisablePasswordReveal: true, diff -Nru firefox-esr-140.5.0esr/browser/components/firefoxview/history.mjs firefox-esr-140.6.0esr/browser/components/firefoxview/history.mjs --- firefox-esr-140.5.0esr/browser/components/firefoxview/history.mjs 2025-11-07 00:11:00.000000000 +0000 +++ firefox-esr-140.6.0esr/browser/components/firefoxview/history.mjs 2025-12-01 18:15:29.000000000 +0000 @@ -214,7 +214,8 @@ return ( this.profileAge < 8 && !this.hasImportedHistoryPref && - !this.importHistoryDismissedPref + !this.importHistoryDismissedPref && + Services.policies.isAllowed("profileImport") ); } diff -Nru firefox-esr-140.5.0esr/browser/components/resistfingerprinting/test/browser/browser_bug1975753_site_specific_zoom_level.js firefox-esr-140.6.0esr/browser/components/resistfingerprinting/test/browser/browser_bug1975753_site_specific_zoom_level.js --- firefox-esr-140.5.0esr/browser/components/resistfingerprinting/test/browser/browser_bug1975753_site_specific_zoom_level.js 2025-11-07 00:11:01.000000000 +0000 +++ firefox-esr-140.6.0esr/browser/components/resistfingerprinting/test/browser/browser_bug1975753_site_specific_zoom_level.js 2025-12-01 18:15:30.000000000 +0000 @@ -3,10 +3,14 @@ const PATH_NET = TEST_PATH + "file_dummy.html"; const PATH_ORG = PATH_NET.replace("example.net", "example.org"); -add_task(async function () { +async function runTest(defaultZoom) { let tab1, tab1Zoom; tab1 = await BrowserTestUtils.openNewForegroundTab(gBrowser, PATH_NET); + + tab1Zoom = ZoomManager.getZoomForBrowser(tab1.linkedBrowser); + is(tab1Zoom, defaultZoom, "We are starting with the default zoom."); + await FullZoom.setZoom(1.25, tab1.linkedBrowser); tab1Zoom = ZoomManager.getZoomForBrowser(tab1.linkedBrowser); @@ -46,7 +50,7 @@ is( tab1Zoom, - 1.0, + defaultZoom, "privacy.resistFingerprinting is true, site-specific zoom should be reset when clearing FPP state for tab1" ); @@ -55,4 +59,29 @@ BrowserTestUtils.removeTab(tab1); await SpecialPowers.popPrefEnv(); +} + +add_task(async function () { + await runTest(1.0); + + let defaultZoom = 1.5; + let context = Cu.createLoadContext(); + let cps2 = Cc["@mozilla.org/content-pref/service;1"].getService( + Ci.nsIContentPrefService2 + ); + let { promise, resolve, reject } = Promise.withResolvers(); + cps2.setGlobal(FullZoom.name, defaultZoom, context, { + handleError(error) { + reject(error); + }, + handleCompletion() { + resolve(); + }, + }); + await promise; + try { + await runTest(defaultZoom); + } finally { + cps2.removeGlobal(FullZoom.name, context); + } }); diff -Nru firefox-esr-140.5.0esr/browser/components/sidebar/sidebar-history.mjs firefox-esr-140.6.0esr/browser/components/sidebar/sidebar-history.mjs --- firefox-esr-140.5.0esr/browser/components/sidebar/sidebar-history.mjs 2025-11-07 00:11:00.000000000 +0000 +++ firefox-esr-140.6.0esr/browser/components/sidebar/sidebar-history.mjs 2025-12-01 18:15:29.000000000 +0000 @@ -16,6 +16,7 @@ ChromeUtils.defineESModuleGetters(lazy, { HistoryController: "resource:///modules/HistoryController.sys.mjs", + PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs", Sanitizer: "resource:///modules/Sanitizer.sys.mjs", }); @@ -72,6 +73,10 @@ if (!this.triggerNode) { e.preventDefault(); } + let privateWindowMenuItem = this._contextMenu.querySelector( + "#sidebar-history-context-open-in-private-window" + ); + privateWindowMenuItem.hidden = !lazy.PrivateBrowsingUtils.enabled; } handleCommandEvent(e) { diff -Nru firefox-esr-140.5.0esr/browser/components/sidebar/sidebar-syncedtabs.mjs firefox-esr-140.6.0esr/browser/components/sidebar/sidebar-syncedtabs.mjs --- firefox-esr-140.5.0esr/browser/components/sidebar/sidebar-syncedtabs.mjs 2025-11-07 00:11:01.000000000 +0000 +++ firefox-esr-140.6.0esr/browser/components/sidebar/sidebar-syncedtabs.mjs 2025-12-01 18:15:30.000000000 +0000 @@ -4,6 +4,7 @@ const lazy = {}; ChromeUtils.defineESModuleGetters(lazy, { + PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs", SyncedTabsController: "resource:///modules/SyncedTabsController.sys.mjs", }); @@ -75,6 +76,11 @@ ); // Enable the feature only if the device supports it closeTabMenuItem.disabled = !this.triggerNode.canClose; + + let privateWindowMenuItem = contextMenu.querySelector( + "#sidebar-synced-tabs-context-open-in-private-window" + ); + privateWindowMenuItem.hidden = !lazy.PrivateBrowsingUtils.enabled; } handleCommandEvent(e) { diff -Nru firefox-esr-140.5.0esr/browser/components/urlbar/private/AddonSuggestions.sys.mjs firefox-esr-140.6.0esr/browser/components/urlbar/private/AddonSuggestions.sys.mjs --- firefox-esr-140.5.0esr/browser/components/urlbar/private/AddonSuggestions.sys.mjs 2025-11-07 00:11:00.000000000 +0000 +++ firefox-esr-140.6.0esr/browser/components/urlbar/private/AddonSuggestions.sys.mjs 2025-12-01 18:15:29.000000000 +0000 @@ -82,11 +82,6 @@ return null; } - if (suggestion.source == "rust") { - suggestion.icon = suggestion.iconUrl; - delete suggestion.iconUrl; - } - // Set UTM params unless they're already defined. This allows remote // settings or Merino to override them if need be. let url = new URL(suggestion.url); @@ -100,6 +95,8 @@ url: url.href, originalUrl: suggestion.url, shouldShowUrl: true, + // Rust uses `iconUrl` but Merino uses `icon`. + icon: suggestion.iconUrl ?? suggestion.icon, title: suggestion.title, description: suggestion.description, bottomTextL10n: { id: "firefox-suggest-addons-recommended" }, diff -Nru firefox-esr-140.5.0esr/browser/components/urlbar/tests/quicksuggest/QuickSuggestTestUtils.sys.mjs firefox-esr-140.6.0esr/browser/components/urlbar/tests/quicksuggest/QuickSuggestTestUtils.sys.mjs --- firefox-esr-140.5.0esr/browser/components/urlbar/tests/quicksuggest/QuickSuggestTestUtils.sys.mjs 2025-11-07 00:11:00.000000000 +0000 +++ firefox-esr-140.6.0esr/browser/components/urlbar/tests/quicksuggest/QuickSuggestTestUtils.sys.mjs 2025-12-01 18:15:29.000000000 +0000 @@ -943,8 +943,10 @@ source = "rust", provider = "Yelp", isTopPick = false, - // The default Yelp suggestedIndex is 0, unlike most other Suggest - // suggestion types, which use -1. + // The logic for the default Yelp `suggestedIndex` is complex and depends on + // whether `UrlbarProviderSearchSuggestions` is active and whether search + // suggestions are shown first. By default -- when the answer to both of + // those questions is Yes -- Yelp's `suggestedIndex` is 0. suggestedIndex = 0, isSuggestedIndexRelativeToGroup = true, originalUrl = undefined, diff -Nru firefox-esr-140.5.0esr/browser/components/urlbar/tests/quicksuggest/unit/head.js firefox-esr-140.6.0esr/browser/components/urlbar/tests/quicksuggest/unit/head.js --- firefox-esr-140.5.0esr/browser/components/urlbar/tests/quicksuggest/unit/head.js 2025-11-07 00:11:01.000000000 +0000 +++ firefox-esr-140.6.0esr/browser/components/urlbar/tests/quicksuggest/unit/head.js 2025-12-01 18:15:30.000000000 +0000 @@ -263,10 +263,16 @@ "quicksuggest-dismissals-changed" ); + let actualResult = await getActualResult({ + providers: [UrlbarProviderQuickSuggest.name], + query: queriesForDismissals[0].query, + expectedResult: result, + }); + triggerCommand({ - result, command, feature, + result: actualResult, expectedCountsByCall: { removeResult: 1, }, @@ -280,7 +286,7 @@ "canClearDismissedSuggestions should return true after triggering command" ); Assert.ok( - await QuickSuggest.isResultDismissed(result), + await QuickSuggest.isResultDismissed(actualResult), "The result should be dismissed" ); @@ -374,10 +380,16 @@ "quicksuggest-dismissals-changed" ); + let actualResult = await getActualResult({ + providers: [UrlbarProviderQuickSuggest.name], + query: queries[0].query, + expectedResult: result, + }); + triggerCommand({ - result, command, feature, + result: actualResult, expectedCountsByCall: { removeResult: 1, }, @@ -443,6 +455,44 @@ } /** + * Does a search, asserts an actual result exists that matches the given result, + * and returns it. + * + * @param {object} options + * Options object. + * @param {SuggestFeature} options.query + * The search string. + * @param {UrlbarResult} options.expectedResult + * The expected result. + * @param {string[]} [options.providers] + * The providers to query. + */ +async function getActualResult({ + query, + expectedResult, + providers = [UrlbarProviderQuickSuggest.name], +}) { + info("Doing search to get an actual result: " + JSON.stringify(query)); + let context = createContext(query, { + providers, + isPrivate: false, + }); + await check_results({ + context, + matches: [expectedResult], + }); + + let actualResult = context.results.find( + r => + r.providerName == UrlbarProviderQuickSuggest.name && + r.payload.provider == expectedResult.payload.provider + ); + Assert.ok(actualResult, "Search should have returned a matching result"); + + return actualResult; +} + +/** * Does some "show less frequently" tests where the cap is set in remote * settings and Nimbus. See `doOneShowLessFrequentlyTest()`. This function * assumes the matching behavior implemented by the given `SuggestFeature` is diff -Nru firefox-esr-140.5.0esr/browser/config/mozconfigs/win32/mingwclang firefox-esr-140.6.0esr/browser/config/mozconfigs/win32/mingwclang --- firefox-esr-140.5.0esr/browser/config/mozconfigs/win32/mingwclang 2025-11-07 00:11:00.000000000 +0000 +++ firefox-esr-140.6.0esr/browser/config/mozconfigs/win32/mingwclang 2025-12-01 18:15:29.000000000 +0000 @@ -34,6 +34,7 @@ ac_add_options --disable-update-agent # Bug 1561797 ac_add_options --disable-default-browser-agent # Relies on toast notifications which don't build on mingw. ac_add_options --disable-notification-server # Toast notifications don't build on mingw. +ac_add_options --disable-zucchini # Bug 1975960: SEH unavailable in mingwclang on win32 # Find our toolchain HOST_CC="$MOZ_FETCHES_DIR/clang/bin/clang" diff -Nru firefox-esr-140.5.0esr/browser/config/mozconfigs/win64/mingwclang firefox-esr-140.6.0esr/browser/config/mozconfigs/win64/mingwclang --- firefox-esr-140.5.0esr/browser/config/mozconfigs/win64/mingwclang 2025-11-07 00:11:00.000000000 +0000 +++ firefox-esr-140.6.0esr/browser/config/mozconfigs/win64/mingwclang 2025-12-01 18:15:29.000000000 +0000 @@ -34,6 +34,7 @@ ac_add_options --disable-update-agent # Bug 1561797 ac_add_options --disable-default-browser-agent # Relies on toast notifications which don't build on mingw. ac_add_options --disable-notification-server # Toast notifications don't build on mingw. +ac_add_options --disable-zucchini # Bug 1975960: SEH unavailable in mingwclang on win32, disable on win64 for parity # Find our toolchain HOST_CC="$MOZ_FETCHES_DIR/clang/bin/clang" diff -Nru firefox-esr-140.5.0esr/browser/config/version.txt firefox-esr-140.6.0esr/browser/config/version.txt --- firefox-esr-140.5.0esr/browser/config/version.txt 2025-11-07 00:11:01.000000000 +0000 +++ firefox-esr-140.6.0esr/browser/config/version.txt 2025-12-01 18:15:30.000000000 +0000 @@ -1 +1 @@ -140.5.0 +140.6.0 diff -Nru firefox-esr-140.5.0esr/browser/config/version_display.txt firefox-esr-140.6.0esr/browser/config/version_display.txt --- firefox-esr-140.5.0esr/browser/config/version_display.txt 2025-11-07 00:11:01.000000000 +0000 +++ firefox-esr-140.6.0esr/browser/config/version_display.txt 2025-12-01 18:15:30.000000000 +0000 @@ -1 +1 @@ -140.5.0esr +140.6.0esr diff -Nru firefox-esr-140.5.0esr/browser/extensions/webcompat/data/interventions.json firefox-esr-140.6.0esr/browser/extensions/webcompat/data/interventions.json --- firefox-esr-140.5.0esr/browser/extensions/webcompat/data/interventions.json 2025-11-07 00:11:00.000000000 +0000 +++ firefox-esr-140.6.0esr/browser/extensions/webcompat/data/interventions.json 2025-12-01 18:15:29.000000000 +0000 @@ -3332,7 +3332,10 @@ "interventions": [ { "platforms": ["all"], - "ua_string": ["Chrome", "add_Firefox_as_Gecko"] + "content_scripts": { + "js": ["bug1950282-f1tv.formula1.com-unblock-firefox.js"] + }, + "ua_string": ["Chrome"] }, { "platforms": ["linux"], @@ -3695,5 +3698,32 @@ "ua_string": ["Chrome", "add_Firefox_as_Gecko"] } ] + }, + "1996823": { + "label": "rogers.com and fido.ca", + "bugs": { + "1996823": { + "issue": "page-fails-to-load", + "matches": [ + "*://www.rogers.com/bbapp/bbapi.js*", + "*://www.fido.ca/bbapp/bbapi.js*" + ] + } + }, + "interventions": [ + { + "platforms": ["all"], + "replace_string_in_request": [ + { + "find": "window\\.location\\.href = link;", + "replace": "let url = new URL(window.location.href); url.hash = link; window.location.href = url.href;", + "urls": [ + "*://www.rogers.com/bbapp/bbapi.js*", + "*://www.fido.ca/bbapp/bbapi.js*" + ] + } + ] + } + ] } } diff -Nru firefox-esr-140.5.0esr/browser/extensions/webcompat/injections/js/bug1950282-f1tv.formula1.com-unblock-firefox.js firefox-esr-140.6.0esr/browser/extensions/webcompat/injections/js/bug1950282-f1tv.formula1.com-unblock-firefox.js --- firefox-esr-140.5.0esr/browser/extensions/webcompat/injections/js/bug1950282-f1tv.formula1.com-unblock-firefox.js 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/browser/extensions/webcompat/injections/js/bug1950282-f1tv.formula1.com-unblock-firefox.js 2025-12-01 18:15:29.000000000 +0000 @@ -0,0 +1,122 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +/** + * Bug 1950282 - UA spoof for f1tv.formula1.com + * + * This site is deliberately blocking Firefox, possibly due to bug 1992579. + */ + +/* globals cloneInto, exportFunction */ + +console.info( + "The window environment is being altered for compatibility reasons. If you're a web developer working on this site, please get in touch with developer-outreach@mozilla.com. See https://bugzilla.mozilla.org/show_bug.cgi?id=1950282 for details." +); + +delete window.wrappedJSObject.InstallTrigger; +delete window.wrappedJSObject.mozInnerScreenX; +delete window.wrappedJSObject.mozInnerScreenY; +delete window.wrappedJSObject.MozConsentBanner; + +const nav = Object.getPrototypeOf(navigator.wrappedJSObject); +const vendor = Object.getOwnPropertyDescriptor(nav, "vendor"); +vendor.get = exportFunction(() => "Google Inc.", window); +Object.defineProperty(nav, "vendor", vendor); + +const css = CSS.wrappedJSObject; +const supports = Object.getOwnPropertyDescriptor(css, "supports"); +const oldSupports = supports.value; +supports.value = exportFunction(function (query) { + if (query.includes("moz-")) { + return false; + } + return oldSupports.call(this, query); +}, window); +Object.defineProperty(css, "supports", supports); + +function generateTimeStamp(base, factor = 10) { + if (base) { + // increase another timestamp by a little + return (base + Math.random() * factor).toString().substr(0, 14); + } + const r = Math.random().toString(); + const d10 = `1${r.substr(5, 9)}`; + const d3 = r.substr(2, 3); + return parseFloat(`${d10}.${d3}`); +} + +const startLoadTime = generateTimeStamp(); +const commitLoadTime = generateTimeStamp(startLoadTime); +const firstPaintTime = generateTimeStamp(commitLoadTime); +const finishDocumentLoadTime = generateTimeStamp(firstPaintTime); +const finishLoadTime = generateTimeStamp(finishDocumentLoadTime); + +const csi = cloneInto( + { + onloadT: parseInt(finishDocumentLoadTime * 100), + pageT: generateTimeStamp().toString().substr(-11), + startE: parseInt(parseFloat(startLoadTime * 100)), + tran: 10 + parseInt(4 + Math.random() * 4), + }, + window +); + +const loadTimes = cloneInto( + { + commitLoadTime, + connectionInfo: "h3", + finishDocumentLoadTime, + finishLoadTime, + firstPaintAfterLoadTime: 0, + firstPaintTime, + navigationType: "Other", + npnNegotiatedProtocol: "h3", + requestTime: startLoadTime, + startLoadTime, + wasAlternateProtocolAvailable: false, + wasFetchedViaSpdy: true, + wasNpnNegotiated: true, + }, + window +); + +window.wrappedJSObject.chrome = cloneInto( + { + app: { + InstallState: { + DISABLED: "disabled", + INSTALLED: "installed", + NOT_INSTALLED: "not_installed", + }, + RunningState: { + CANNOT_RUN: "cannot_run", + READY_TO_RUN: "ready_to_run", + RUNNING: "running", + }, + getDetails() { + return null; + }, + getIsInstalled() { + return false; + }, + installState() { + return undefined; + }, + isInstalled: false, + runningState() { + return window.chrome.app.InstallState.NOT_INSTALLED; + }, + }, + csi() { + return csi; + }, + loadTimes() { + return loadTimes; + }, + }, + window, + { cloneFunctions: true } +); diff -Nru firefox-esr-140.5.0esr/browser/extensions/webcompat/manifest.json firefox-esr-140.6.0esr/browser/extensions/webcompat/manifest.json --- firefox-esr-140.5.0esr/browser/extensions/webcompat/manifest.json 2025-11-07 00:11:00.000000000 +0000 +++ firefox-esr-140.6.0esr/browser/extensions/webcompat/manifest.json 2025-12-01 18:15:30.000000000 +0000 @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "Web Compatibility Interventions", "description": "Urgent post-release fixes for web compatibility.", - "version": "140.8.0", + "version": "140.11.0", "browser_specific_settings": { "gecko": { "id": "webcompat@mozilla.org", diff -Nru firefox-esr-140.5.0esr/browser/locales/en-US/browser/permissions.ftl firefox-esr-140.6.0esr/browser/locales/en-US/browser/permissions.ftl --- firefox-esr-140.5.0esr/browser/locales/en-US/browser/permissions.ftl 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/browser/locales/en-US/browser/permissions.ftl 2025-12-01 18:15:29.000000000 +0000 @@ -0,0 +1,5 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. + +perm-persistent-storage-remember = Remember this decision diff -Nru firefox-esr-140.5.0esr/browser/locales/l10n-changesets.json firefox-esr-140.6.0esr/browser/locales/l10n-changesets.json --- firefox-esr-140.5.0esr/browser/locales/l10n-changesets.json 2025-11-07 00:11:01.000000000 +0000 +++ firefox-esr-140.6.0esr/browser/locales/l10n-changesets.json 2025-12-01 18:15:30.000000000 +0000 @@ -17,7 +17,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "af": { "pin": false, @@ -37,7 +37,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "an": { "pin": false, @@ -57,7 +57,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ar": { "pin": false, @@ -77,7 +77,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ast": { "pin": false, @@ -97,7 +97,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "az": { "pin": false, @@ -117,7 +117,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "be": { "pin": false, @@ -137,7 +137,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "bg": { "pin": false, @@ -157,7 +157,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "bn": { "pin": false, @@ -177,7 +177,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "br": { "pin": false, @@ -197,7 +197,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "bs": { "pin": false, @@ -217,7 +217,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ca": { "pin": false, @@ -237,7 +237,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ca-valencia": { "pin": false, @@ -257,7 +257,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "cak": { "pin": false, @@ -277,7 +277,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "cs": { "pin": false, @@ -297,7 +297,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "cy": { "pin": false, @@ -317,7 +317,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "da": { "pin": false, @@ -337,7 +337,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "de": { "pin": false, @@ -357,7 +357,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "dsb": { "pin": false, @@ -377,7 +377,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "el": { "pin": false, @@ -397,7 +397,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "en-CA": { "pin": false, @@ -417,7 +417,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "en-GB": { "pin": false, @@ -437,7 +437,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "eo": { "pin": false, @@ -457,7 +457,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "es-AR": { "pin": false, @@ -477,7 +477,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "es-CL": { "pin": false, @@ -497,7 +497,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "es-ES": { "pin": false, @@ -517,7 +517,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "es-MX": { "pin": false, @@ -537,7 +537,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "et": { "pin": false, @@ -557,7 +557,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "eu": { "pin": false, @@ -577,7 +577,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "fa": { "pin": false, @@ -597,7 +597,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ff": { "pin": false, @@ -617,7 +617,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "fi": { "pin": false, @@ -637,7 +637,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "fr": { "pin": false, @@ -657,7 +657,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "fur": { "pin": false, @@ -677,7 +677,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "fy-NL": { "pin": false, @@ -697,7 +697,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ga-IE": { "pin": false, @@ -717,7 +717,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "gd": { "pin": false, @@ -737,7 +737,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "gl": { "pin": false, @@ -757,7 +757,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "gn": { "pin": false, @@ -777,7 +777,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "gu-IN": { "pin": false, @@ -797,7 +797,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "he": { "pin": false, @@ -817,7 +817,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "hi-IN": { "pin": false, @@ -837,7 +837,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "hr": { "pin": false, @@ -857,7 +857,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "hsb": { "pin": false, @@ -877,7 +877,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "hu": { "pin": false, @@ -897,7 +897,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "hy-AM": { "pin": false, @@ -917,7 +917,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ia": { "pin": false, @@ -937,7 +937,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "id": { "pin": false, @@ -957,7 +957,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "is": { "pin": false, @@ -977,7 +977,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "it": { "pin": false, @@ -997,7 +997,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ja": { "pin": false, @@ -1015,7 +1015,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ja-JP-mac": { "pin": false, @@ -1023,7 +1023,7 @@ "macosx64", "macosx64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ka": { "pin": false, @@ -1043,7 +1043,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "kab": { "pin": false, @@ -1063,7 +1063,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "kk": { "pin": false, @@ -1083,7 +1083,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "km": { "pin": false, @@ -1103,7 +1103,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "kn": { "pin": false, @@ -1123,7 +1123,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ko": { "pin": false, @@ -1143,7 +1143,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "lij": { "pin": false, @@ -1163,7 +1163,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "lt": { "pin": false, @@ -1183,7 +1183,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "lv": { "pin": false, @@ -1203,7 +1203,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "mk": { "pin": false, @@ -1223,7 +1223,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "mr": { "pin": false, @@ -1243,7 +1243,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ms": { "pin": false, @@ -1263,7 +1263,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "my": { "pin": false, @@ -1283,7 +1283,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "nb-NO": { "pin": false, @@ -1303,7 +1303,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ne-NP": { "pin": false, @@ -1323,7 +1323,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "nl": { "pin": false, @@ -1343,7 +1343,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "nn-NO": { "pin": false, @@ -1363,7 +1363,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "oc": { "pin": false, @@ -1383,7 +1383,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "pa-IN": { "pin": false, @@ -1403,7 +1403,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "pl": { "pin": false, @@ -1423,7 +1423,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "pt-BR": { "pin": false, @@ -1443,7 +1443,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "pt-PT": { "pin": false, @@ -1463,7 +1463,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "rm": { "pin": false, @@ -1483,7 +1483,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ro": { "pin": false, @@ -1503,7 +1503,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ru": { "pin": false, @@ -1523,7 +1523,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "sat": { "pin": false, @@ -1543,7 +1543,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "sc": { "pin": false, @@ -1563,7 +1563,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "sco": { "pin": false, @@ -1583,7 +1583,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "si": { "pin": false, @@ -1603,7 +1603,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "sk": { "pin": false, @@ -1623,7 +1623,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "skr": { "pin": false, @@ -1643,7 +1643,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "sl": { "pin": false, @@ -1663,7 +1663,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "son": { "pin": false, @@ -1683,7 +1683,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "sq": { "pin": false, @@ -1703,7 +1703,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "sr": { "pin": false, @@ -1723,7 +1723,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "sv-SE": { "pin": false, @@ -1743,7 +1743,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "szl": { "pin": false, @@ -1763,7 +1763,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ta": { "pin": false, @@ -1783,7 +1783,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "te": { "pin": false, @@ -1803,7 +1803,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "tg": { "pin": false, @@ -1823,7 +1823,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "th": { "pin": false, @@ -1843,7 +1843,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "tl": { "pin": false, @@ -1863,7 +1863,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "tr": { "pin": false, @@ -1883,7 +1883,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "trs": { "pin": false, @@ -1903,7 +1903,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "uk": { "pin": false, @@ -1923,7 +1923,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "ur": { "pin": false, @@ -1943,7 +1943,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "uz": { "pin": false, @@ -1963,7 +1963,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "vi": { "pin": false, @@ -1983,7 +1983,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "xh": { "pin": false, @@ -2003,7 +2003,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "zh-CN": { "pin": false, @@ -2023,7 +2023,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" }, "zh-TW": { "pin": false, @@ -2043,6 +2043,6 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "64046fdc97c1b1886a479dead61e6dc5428ae6e6" + "revision": "412690f1368e37f70af57eecabb93497167eb9ba" } } \ No newline at end of file diff -Nru firefox-esr-140.5.0esr/browser/modules/PermissionUI.sys.mjs firefox-esr-140.6.0esr/browser/modules/PermissionUI.sys.mjs --- firefox-esr-140.5.0esr/browser/modules/PermissionUI.sys.mjs 2025-11-07 00:11:00.000000000 +0000 +++ firefox-esr-140.6.0esr/browser/modules/PermissionUI.sys.mjs 2025-12-01 18:15:30.000000000 +0000 @@ -99,6 +99,10 @@ ); }); +ChromeUtils.defineLazyGetter(lazy, "gFluentStrings", function () { + return new Localization(["browser/permissions.ftl"], true /* aSync */); +}); + import { SITEPERMS_ADDON_PROVIDER_PREF } from "resource://gre/modules/addons/siteperms-addon-utils.sys.mjs"; XPCOMUtils.defineLazyPreferenceGetter( @@ -1167,11 +1171,25 @@ let learnMoreURL = Services.urlFormatter.formatURLPref("app.support.baseURL") + "storage-permissions"; - return { + let options = { learnMoreURL, displayURI: false, name: this.getPrincipalName(), }; + + options.checkbox = { + show: !lazy.PrivateBrowsingUtils.isWindowPrivate( + this.browser.ownerGlobal + ), + }; + + if (options.checkbox.show) { + options.checkbox.label = lazy.gFluentStrings.formatValueSync( + "perm-persistent-storage-remember" + ); + } + + return options; } get notificationID() { diff -Nru firefox-esr-140.5.0esr/build/moz.configure/update-programs.configure firefox-esr-140.6.0esr/build/moz.configure/update-programs.configure --- firefox-esr-140.5.0esr/build/moz.configure/update-programs.configure 2025-11-07 00:11:01.000000000 +0000 +++ firefox-esr-140.6.0esr/build/moz.configure/update-programs.configure 2025-12-01 18:15:30.000000000 +0000 @@ -264,3 +264,46 @@ ) set_config("MOZ_NOTIFICATION_SERVER", True, when="--enable-notification-server") + +# Supported patch formats for the updater +# ======================================= + + +@depends(target, when="--enable-updater") +def zucchini_is_available(target): + # Desktop Linux, macOS or Windows: we exclude Android by checking for GNU. + return (target.os, target.kernel) == ("GNU", "Linux") or target.os in ( + "OSX", + "WINNT", + ) + + +with only_when(~zucchini_is_available): + set_config("MOZ_BSPATCH", True, when="--enable-updater") + set_define("MOZ_BSPATCH", True, when="--enable-updater") + + +with only_when(zucchini_is_available): + option( + "--disable-bspatch", + help="Disable bspatch support", + ) + + set_config("MOZ_BSPATCH", True, when="--enable-bspatch") + set_define("MOZ_BSPATCH", True, when="--enable-bspatch") + + option( + "--disable-zucchini", + help="Disable zucchini support", + ) + + set_config("MOZ_ZUCCHINI", True, when="--enable-zucchini") + set_define("MOZ_ZUCCHINI", True, when="--enable-zucchini") + + @depends("--enable-bspatch", "--enable-zucchini") + def check_at_least_one_patch_format(bspatch, zucchini): + if not bspatch and not zucchini: + die( + "You must enable at least one patch format when --enable-updater " + "is used. Use --enable-bspatch or --enable-zucchini." + ) diff -Nru firefox-esr-140.5.0esr/config/milestone.txt firefox-esr-140.6.0esr/config/milestone.txt --- firefox-esr-140.5.0esr/config/milestone.txt 2025-11-07 00:11:00.000000000 +0000 +++ firefox-esr-140.6.0esr/config/milestone.txt 2025-12-01 18:15:29.000000000 +0000 @@ -10,4 +10,4 @@ # hardcoded milestones in the tree from these two files. #-------------------------------------------------------- -140.5.0 +140.6.0 diff -Nru firefox-esr-140.5.0esr/debian/changelog firefox-esr-140.6.0esr/debian/changelog --- firefox-esr-140.5.0esr/debian/changelog 2025-11-11 22:25:00.000000000 +0000 +++ firefox-esr-140.6.0esr/debian/changelog 2025-12-09 22:02:19.000000000 +0000 @@ -1,3 +1,13 @@ +firefox-esr (140.6.0esr-1~deb13u1) trixie-security; urgency=medium + + * New upstream release. + * Fixes for mfsa2025-94, also known as: + CVE-2025-14321, CVE-2025-14322, CVE-2025-14323, CVE-2025-14324, + CVE-2025-14325, CVE-2025-14328, CVE-2025-14329, CVE-2025-14330, + CVE-2025-14331, CVE-2025-14333. + + -- Mike Hommey Wed, 10 Dec 2025 07:02:19 +0900 + firefox-esr (140.5.0esr-1~deb13u1) trixie-security; urgency=medium * New upstream release. diff -Nru firefox-esr-140.5.0esr/devtools/client/netmonitor/test/browser_net_curl-utils.js firefox-esr-140.6.0esr/devtools/client/netmonitor/test/browser_net_curl-utils.js --- firefox-esr-140.5.0esr/devtools/client/netmonitor/test/browser_net_curl-utils.js 2025-11-07 00:11:01.000000000 +0000 +++ firefox-esr-140.6.0esr/devtools/client/netmonitor/test/browser_net_curl-utils.js 2025-12-01 18:15:30.000000000 +0000 @@ -360,6 +360,21 @@ '^\"query=evil^\n\n^\n\ncmd^\\^\" /c timeout /t 3 ^& calc.exe^\n\n^\n\n^\"', "The evil command is escaped properly" ); + + // Control characters https://www.ascii-code.com/characters/control-characters + const containsControlChars = " - \u0007 \u0010 \u0014 \u001B \x1a - "; + is( + CurlUtils.escapeStringWin(containsControlChars), + '^\" - \u0007 \u0010 \u0014 \u001b \u001a - ^\"', + "Control characters should not be escaped with ^." + ); + + const controlCharsWithWhitespaces = " -\tcalc.exe\f- "; + is( + CurlUtils.escapeStringWin(controlCharsWithWhitespaces), + '^\" - calc.exe - ^\"', + "Control (non-printable) characters which are whitespace like charaters e.g (tab & form feed)" + ); } async function createCurlData(selected, getLongString, requestData) { diff -Nru firefox-esr-140.5.0esr/devtools/client/shared/curl.js firefox-esr-140.6.0esr/devtools/client/shared/curl.js --- firefox-esr-140.5.0esr/devtools/client/shared/curl.js 2025-11-07 00:11:01.000000000 +0000 +++ firefox-esr-140.6.0esr/devtools/client/shared/curl.js 2025-12-01 18:15:30.000000000 +0000 @@ -463,7 +463,9 @@ // Then escape all characters we are not sure about with ^ to ensure it // gets to MS Crt parser safely. - .replace(/[^a-zA-Z0-9\s_\-:=+~\/.',?;()*`]/g, "^$&") + // Note: Also do not escape unicode control (C) non-printable characters + // https://www.compart.com/en/unicode/category (this is captured with `\p{C}` and the `u` unicode flag) + .replace(/[^-a-zA-Z0-9\s_:=+~\/.',?;()*`\p{C}]/gu, "^$&") // The % character is special because MS Crt parser will try and look for // ENV variables and fill them in its place. We cannot escape them with % @@ -474,6 +476,14 @@ // by the previous replace. .replace(/%(?=[a-zA-Z0-9_])/g, "%^") + // All other whitespace characters are replaced with a single space, as there + // is no way to enter their literal values in a command line, and they do break + // the command allowing for injection. + // Since want to keep line breaks, we need to exclude them in the regex (`[^\r\n]`), + // and use double negations to get the other whitespace chars (`[^\S]` translates + // to "not not whitespace") + .replace(/[^\S\r\n]/g, " ") + // Lastly we replace new lines with ^ and TWO new lines because the first // new line is there to enact the escape command the second is the character // to escape (in this case new line). diff -Nru firefox-esr-140.5.0esr/dom/base/test/jsmodules/importmaps/chrome.toml firefox-esr-140.6.0esr/dom/base/test/jsmodules/importmaps/chrome.toml --- firefox-esr-140.5.0esr/dom/base/test/jsmodules/importmaps/chrome.toml 2025-11-07 00:11:02.000000000 +0000 +++ firefox-esr-140.6.0esr/dom/base/test/jsmodules/importmaps/chrome.toml 2025-12-01 18:15:30.000000000 +0000 @@ -2,18 +2,25 @@ support-files = [ "external_importMap.js", "insert_a_base_element.js", + "module_1979050.mjs", "module_simpleImportMap.mjs", "module_simpleImportMap_dir.mjs", "module_simpleImportMap_remap.mjs", "module_simpleImportMap_remap_https.mjs", "module_simpleExport.mjs", "module_sortedImportMap.mjs", + "scope1/module_1979050.mjs", "scope1/module_simpleExport.mjs", "scope1/module_simpleImportMap.mjs", + "scope1/scope2/module_1979050.mjs", "scope1/scope2/module_simpleExport.mjs", "scope1/scope2/module_simpleImportMap.mjs", ] +["test_1979050.html"] + +["test_1979050_2.html"] + ["test_dynamic_import_reject_importMap.html"] ["test_externalImportMap.html"] diff -Nru firefox-esr-140.5.0esr/dom/base/test/jsmodules/importmaps/module_1979050.mjs firefox-esr-140.6.0esr/dom/base/test/jsmodules/importmaps/module_1979050.mjs --- firefox-esr-140.5.0esr/dom/base/test/jsmodules/importmaps/module_1979050.mjs 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/dom/base/test/jsmodules/importmaps/module_1979050.mjs 2025-12-01 18:15:30.000000000 +0000 @@ -0,0 +1,3 @@ +import { x } from "./module_simpleExport.mjs"; + +result = x; diff -Nru firefox-esr-140.5.0esr/dom/base/test/jsmodules/importmaps/scope1/module_1979050.mjs firefox-esr-140.6.0esr/dom/base/test/jsmodules/importmaps/scope1/module_1979050.mjs --- firefox-esr-140.5.0esr/dom/base/test/jsmodules/importmaps/scope1/module_1979050.mjs 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/dom/base/test/jsmodules/importmaps/scope1/module_1979050.mjs 2025-12-01 18:15:30.000000000 +0000 @@ -0,0 +1,5 @@ +import { x } from "./module_simpleExport.mjs"; + +result2 = x; + +export let y = x; diff -Nru firefox-esr-140.5.0esr/dom/base/test/jsmodules/importmaps/scope1/scope2/module_1979050.mjs firefox-esr-140.6.0esr/dom/base/test/jsmodules/importmaps/scope1/scope2/module_1979050.mjs --- firefox-esr-140.5.0esr/dom/base/test/jsmodules/importmaps/scope1/scope2/module_1979050.mjs 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/dom/base/test/jsmodules/importmaps/scope1/scope2/module_1979050.mjs 2025-12-01 18:15:31.000000000 +0000 @@ -0,0 +1,5 @@ +import { x } from "./module_simpleExport.mjs"; + +result3 = x; + +export let z = x; diff -Nru firefox-esr-140.5.0esr/dom/base/test/jsmodules/importmaps/test_1979050.html firefox-esr-140.6.0esr/dom/base/test/jsmodules/importmaps/test_1979050.html --- firefox-esr-140.5.0esr/dom/base/test/jsmodules/importmaps/test_1979050.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/dom/base/test/jsmodules/importmaps/test_1979050.html 2025-12-01 18:15:30.000000000 +0000 @@ -0,0 +1,50 @@ + + +Test bug 1979050 + + + + + + + + + + diff -Nru firefox-esr-140.5.0esr/dom/base/test/jsmodules/importmaps/test_1979050_2.html firefox-esr-140.6.0esr/dom/base/test/jsmodules/importmaps/test_1979050_2.html --- firefox-esr-140.5.0esr/dom/base/test/jsmodules/importmaps/test_1979050_2.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/dom/base/test/jsmodules/importmaps/test_1979050_2.html 2025-12-01 18:15:30.000000000 +0000 @@ -0,0 +1,69 @@ + + +Test bug 1979050 + + + + + + + + + diff -Nru firefox-esr-140.5.0esr/dom/canvas/TexUnpackBlob.cpp firefox-esr-140.6.0esr/dom/canvas/TexUnpackBlob.cpp --- firefox-esr-140.5.0esr/dom/canvas/TexUnpackBlob.cpp 2025-11-07 00:11:02.000000000 +0000 +++ firefox-esr-140.6.0esr/dom/canvas/TexUnpackBlob.cpp 2025-12-01 18:15:30.000000000 +0000 @@ -406,7 +406,17 @@ if (!rowLength || !rowCount) return true; - if (srcStride <= 0 || dstStride <= 0) { + auto minSrcStride = + CheckedInt( + WebGLTexelConversions::TexelBytesForFormat(srcFormat)) * + rowLength; + auto minDstStride = + CheckedInt( + WebGLTexelConversions::TexelBytesForFormat(dstFormat)) * + rowLength; + if (srcStride <= 0 || dstStride <= 0 || !minSrcStride.isValid() || + !minDstStride.isValid() || size_t(srcStride) < minSrcStride.value() || + size_t(dstStride) < minDstStride.value()) { webgl->ErrorInvalidOperation("Invalid stride."); return false; } diff -Nru firefox-esr-140.5.0esr/dom/media/tools/generateGmpJson.py firefox-esr-140.6.0esr/dom/media/tools/generateGmpJson.py --- firefox-esr-140.5.0esr/dom/media/tools/generateGmpJson.py 2025-11-07 00:11:03.000000000 +0000 +++ firefox-esr-140.6.0esr/dom/media/tools/generateGmpJson.py 2025-12-01 18:15:32.000000000 +0000 @@ -313,7 +313,7 @@ args = parser.parse_args() if args.plugin == "openh264": - url_base = "http://ciscobinary.openh264.org" + url_base = "https://ciscobinary.openh264.org" if args.version is None or args.revision is None: parser.error("openh264 requires version and revision") elif args.plugin == "widevine": diff -Nru firefox-esr-140.5.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp firefox-esr-140.6.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp --- firefox-esr-140.5.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp 2025-11-07 00:11:03.000000000 +0000 +++ firefox-esr-140.6.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp 2025-12-01 18:15:31.000000000 +0000 @@ -12,8 +12,21 @@ #include "js/ArrayBuffer.h" namespace mozilla::dom { -NS_IMPL_CYCLE_COLLECTION_WITH_JS_MEMBERS(RTCEncodedFrameBase, (mGlobal), - (mData)) + +NS_IMPL_CYCLE_COLLECTION_CLASS(RTCEncodedFrameBase) +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(RTCEncodedFrameBase) + using ::ImplCycleCollectionUnlink; + tmp->DetachData(); + NS_IMPL_CYCLE_COLLECTION_UNLINK(mGlobal) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mData) +NS_IMPL_CYCLE_COLLECTION_UNLINK_END +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(RTCEncodedFrameBase) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mGlobal) +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END +NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(RTCEncodedFrameBase) + NS_IMPL_CYCLE_COLLECTION_TRACE_JS_MEMBERS(mData) +NS_IMPL_CYCLE_COLLECTION_TRACE_END + NS_IMPL_CYCLE_COLLECTING_ADDREF(RTCEncodedFrameBase) NS_IMPL_CYCLE_COLLECTING_RELEASE(RTCEncodedFrameBase) @@ -39,11 +52,27 @@ jsapi.cx(), mFrame->GetData().size(), (void*)(mFrame->GetData().data())); } -RTCEncodedFrameBase::~RTCEncodedFrameBase() = default; +RTCEncodedFrameBase::~RTCEncodedFrameBase() { DetachData(); } + +void RTCEncodedFrameBase::DetachData() { + // We might have handled this in unlink already + if (mGlobal) { + AutoJSAPI jsapi; + if (NS_WARN_IF(!jsapi.Init(mGlobal))) { + return; + } + + JS::Rooted rootedData(jsapi.cx(), mData); + if (rootedData) { + JS::DetachArrayBuffer(jsapi.cx(), rootedData); + } + } +} unsigned long RTCEncodedFrameBase::Timestamp() const { return mTimestamp; } void RTCEncodedFrameBase::SetData(const ArrayBuffer& aData) { + DetachData(); mData.set(aData.Obj()); if (mFrame) { aData.ProcessData([&](const Span& aData, JS::AutoCheckCannotGC&&) { @@ -61,12 +90,7 @@ std::unique_ptr RTCEncodedFrameBase::TakeFrame() { - AutoJSAPI jsapi; - if (!jsapi.Init(mGlobal)) { - MOZ_CRASH("Could not init JSAPI!"); - } - JS::Rooted rootedData(jsapi.cx(), mData); - JS::DetachArrayBuffer(jsapi.cx(), rootedData); + DetachData(); return std::move(mFrame); } diff -Nru firefox-esr-140.5.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h firefox-esr-140.6.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h --- firefox-esr-140.5.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h 2025-11-07 00:11:03.000000000 +0000 +++ firefox-esr-140.6.0esr/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h 2025-12-01 18:15:32.000000000 +0000 @@ -47,6 +47,8 @@ protected: virtual ~RTCEncodedFrameBase(); + void DetachData(); + RefPtr mGlobal; std::unique_ptr mFrame; const uint64_t mCounter = 0; diff -Nru firefox-esr-140.5.0esr/dom/permission/PermissionStatusSink.cpp firefox-esr-140.6.0esr/dom/permission/PermissionStatusSink.cpp --- firefox-esr-140.5.0esr/dom/permission/PermissionStatusSink.cpp 2025-11-07 00:11:03.000000000 +0000 +++ firefox-esr-140.6.0esr/dom/permission/PermissionStatusSink.cpp 2025-12-01 18:15:31.000000000 +0000 @@ -50,10 +50,26 @@ MutexAutoLock lock(mMutex); - mWorkerRef = WeakWorkerRef::Create( - workerPrivate, [self = RefPtr(this)] { self->Disentangle(); }); + RefPtr workerRef = StrongWorkerRef::Create( + workerPrivate, "PermissionStatusSink", + [self = RefPtr(this)]() { self->Disentangle(); }); + if (NS_WARN_IF(!workerRef)) { + // If WorkerRef creation fails, the Worker has started shutting down. But + // we are on the Worker thread, promise handlers in + // PermissionStatus::Init()/Permissions::Query() can still be dispatched + // to the Worker thread for outer promise rejection. + return PermissionStatePromise::CreateAndReject(NS_ERROR_FAILURE, + __func__); + ; + } + + mWorkerRef = new ThreadSafeWorkerRef(workerRef); } + // On the Worker thread, so the below async function must be executed before + // WorkerRef callback which should also be on the Worker thread. So the above + // created WorkerRef should protect the outer promise handling can be + // dispatched on the Worker thread. return InvokeAsync(GetMainThreadSerialEventTarget(), __func__, [self = RefPtr(this)] { MOZ_ASSERT(!self->mObserver); @@ -101,6 +117,17 @@ void PermissionStatusSink::PermissionChangedOnMainThread() { MOZ_ASSERT(NS_IsMainThread()); + // Nothing to do if Worker had shutted down. + if (!mSerialEventTarget->IsOnCurrentThread()) { + MutexAutoLock lock(mMutex); + if (!mWorkerRef) { + return; + } + } + + // mWorkerRef is not nullptr, it will protect the promise handling can be + // dispatched to the Worker thread, even though the Worker starts shutdown, + // because mWorkerRef is nullify on the main thread. ComputeStateOnMainThread()->Then( mSerialEventTarget, __func__, [self = RefPtr(this)]( @@ -116,17 +143,16 @@ mPermissionStatus = nullptr; - { - MutexAutoLock lock(mMutex); - mWorkerRef = nullptr; - } - NS_DispatchToMainThread( NS_NewRunnableFunction(__func__, [self = RefPtr(this)] { if (self->mObserver) { self->mObserver->RemoveSink(self); self->mObserver = nullptr; } + { + MutexAutoLock lock(self->mMutex); + self->mWorkerRef = nullptr; + } })); } @@ -166,7 +192,7 @@ // If we have mWorkerRef, we haven't received the WorkerRef notification // yet. - WorkerPrivate* workerPrivate = mWorkerRef->GetUnsafePrivate(); + WorkerPrivate* workerPrivate = mWorkerRef->Private(); MOZ_ASSERT(workerPrivate); ancestorWindow = workerPrivate->GetAncestorWindow(); diff -Nru firefox-esr-140.5.0esr/dom/permission/PermissionStatusSink.h firefox-esr-140.6.0esr/dom/permission/PermissionStatusSink.h --- firefox-esr-140.5.0esr/dom/permission/PermissionStatusSink.h 2025-11-07 00:11:03.000000000 +0000 +++ firefox-esr-140.6.0esr/dom/permission/PermissionStatusSink.h 2025-12-01 18:15:31.000000000 +0000 @@ -19,7 +19,7 @@ class PermissionObserver; class PermissionStatus; -class WeakWorkerRef; +class ThreadSafeWorkerRef; class PermissionStatusSink { public: @@ -70,7 +70,7 @@ // Protected by mutex. // Created and released on worker-thread. Used also on main-thread. - RefPtr mWorkerRef MOZ_GUARDED_BY(mMutex); + RefPtr mWorkerRef MOZ_GUARDED_BY(mMutex); PermissionName mPermissionName; nsCString mPermissionType; diff -Nru firefox-esr-140.5.0esr/dom/webtransport/api/WebTransport.cpp firefox-esr-140.6.0esr/dom/webtransport/api/WebTransport.cpp --- firefox-esr-140.5.0esr/dom/webtransport/api/WebTransport.cpp 2025-11-07 00:11:04.000000000 +0000 +++ firefox-esr-140.6.0esr/dom/webtransport/api/WebTransport.cpp 2025-12-01 18:15:31.000000000 +0000 @@ -277,6 +277,7 @@ PBackgroundChild* backgroundChild = BackgroundChild::GetOrCreateForCurrentThread(); if (NS_WARN_IF(!backgroundChild)) { + aError.Throw(NS_ERROR_FAILURE); return; } @@ -295,9 +296,11 @@ RefPtr child = new WebTransportChild(this); if (NS_IsMainThread()) { if (!childEndpoint.Bind(child)) { + aError.Throw(NS_ERROR_FAILURE); return; } } else if (!childEndpoint.Bind(child, mGlobal->SerialEventTarget())) { + aError.Throw(NS_ERROR_FAILURE); return; } diff -Nru firefox-esr-140.5.0esr/editor/libeditor/EditorBase.cpp firefox-esr-140.6.0esr/editor/libeditor/EditorBase.cpp --- firefox-esr-140.5.0esr/editor/libeditor/EditorBase.cpp 2025-11-07 00:11:03.000000000 +0000 +++ firefox-esr-140.6.0esr/editor/libeditor/EditorBase.cpp 2025-12-01 18:15:32.000000000 +0000 @@ -6591,16 +6591,11 @@ mParentData(aEditorBase.mEditActionData), mData(VoidString()), mRawEditAction(aEditAction), - mTopLevelEditSubAction(EditSubAction::eNone), - mAborted(false), - mHasTriedToDispatchBeforeInputEvent(false), - mBeforeInputEventCanceled(false), - mMakeBeforeInputEventNonCancelable(false), - mHasTriedToDispatchClipboardEvent(false), mEditorWasDestroyedDuringHandlingEditAction( mParentData && mParentData->mEditorWasDestroyedDuringHandlingEditAction), - mHandled(false) { + mEditorWasReinitialized(mParentData && + mParentData->mEditorWasReinitialized) { // If we're nested edit action, copies necessary data from the parent. if (mParentData) { mSelection = mParentData->mSelection; diff -Nru firefox-esr-140.5.0esr/editor/libeditor/EditorBase.h firefox-esr-140.6.0esr/editor/libeditor/EditorBase.h --- firefox-esr-140.5.0esr/editor/libeditor/EditorBase.h 2025-11-07 00:11:03.000000000 +0000 +++ firefox-esr-140.6.0esr/editor/libeditor/EditorBase.h 2025-12-01 18:15:32.000000000 +0000 @@ -1002,6 +1002,8 @@ AutoEditActionDataSetter(const EditorBase& aEditorBase, EditAction aEditAction, nsIPrincipal* aPrincipal = nullptr); + AutoEditActionDataSetter() = delete; + AutoEditActionDataSetter(const AutoEditActionDataSetter& aOther) = delete; ~AutoEditActionDataSetter(); void SetSelectionCreatedByDoubleclick(bool aSelectionCreatedByDoubleclick) { @@ -1031,11 +1033,11 @@ [[nodiscard]] bool CanHandle() const { #ifdef DEBUG mHasCanHandleChecked = true; -#endif // #ifdefn DEBUG +#endif // #ifdef DEBUG // Don't allow to run new edit action when an edit action caused // destroying the editor while it's being handled. if (mEditAction != EditAction::eInitializing && - mEditorWasDestroyedDuringHandlingEditAction) { + HasEditorDestroyedDuringHandlingEditActionAndNotYetReinitialized()) { NS_WARNING("Editor was destroyed during an edit action being handled"); return false; } @@ -1231,14 +1233,38 @@ // something other unexpected event listeners. In the cases, new child // edit action shouldn't been aborted. mEditorWasDestroyedDuringHandlingEditAction = true; + mEditorWasReinitialized = false; } if (mParentData) { mParentData->OnEditorDestroy(); } } - bool HasEditorDestroyedDuringHandlingEditAction() const { + void OnEditorInitialized() { + if (mEditorWasDestroyedDuringHandlingEditAction) { + mEditorWasReinitialized = true; + } + if (mParentData) { + mParentData->OnEditorInitialized(); + } + } + /** + * Return true if the editor was destroyed at least once while the + * EditAction is being handled. Note that the editor may have already been + * reinitialized even if this returns true. + */ + [[nodiscard]] bool HasEditorDestroyedDuringHandlingEditAction() const { return mEditorWasDestroyedDuringHandlingEditAction; } + /** + * Return true if the editor was destroyed while the EditAction is being + * handled and has not been reinitialized. I.e., the editor is still under + * the destroyed state. + */ + [[nodiscard]] bool + HasEditorDestroyedDuringHandlingEditActionAndNotYetReinitialized() const { + return mEditorWasDestroyedDuringHandlingEditAction && + !mEditorWasReinitialized; + } void SetTopLevelEditSubAction(EditSubAction aEditSubAction, EDirection aDirection = eNone) { @@ -1475,40 +1501,40 @@ // instance's mTopLevelEditSubAction member since it's copied from the // parent instance at construction and it's always cleared before this // won't be overwritten and cleared before destruction. - EditSubAction mTopLevelEditSubAction; + EditSubAction mTopLevelEditSubAction = EditSubAction::eNone; - EDirection mDirectionOfTopLevelEditSubAction; + EDirection mDirectionOfTopLevelEditSubAction = nsIEditor::eNone; - bool mAborted; + bool mAborted = false; // Set to true when this handles "beforeinput" event dispatching. Note // that even if "beforeinput" event shouldn't be dispatched for this, // instance, this is set to true when it's considered. - bool mHasTriedToDispatchBeforeInputEvent; + bool mHasTriedToDispatchBeforeInputEvent = false; // Set to true if "beforeinput" event was dispatched and it's canceled. - bool mBeforeInputEventCanceled; + bool mBeforeInputEventCanceled = false; // Set to true if `beforeinput` event must not be cancelable even if // its inputType is defined as cancelable by the standards. - bool mMakeBeforeInputEventNonCancelable; + bool mMakeBeforeInputEventNonCancelable = false; // Set to true when the edit action handler tries to dispatch a clipboard // event. - bool mHasTriedToDispatchClipboardEvent; + bool mHasTriedToDispatchClipboardEvent = false; // The editor instance may be destroyed once temporarily if `document.write` // etc runs. In such case, we should mark this flag of being handled // edit action. bool mEditorWasDestroyedDuringHandlingEditAction; + // This is set to `true` if the editor was destroyed but now, it's + // initialized again. + bool mEditorWasReinitialized; // This is set before dispatching `input` event and notifying editor // observers. - bool mHandled; + bool mHandled = false; // Whether the editor is dispatching a `beforeinput` or `input` event. bool mDispatchingInputEvent = false; #ifdef DEBUG mutable bool mHasCanHandleChecked = false; #endif // #ifdef DEBUG - - AutoEditActionDataSetter() = delete; - AutoEditActionDataSetter(const AutoEditActionDataSetter& aOther) = delete; }; void UpdateEditActionData(const nsAString& aData) { diff -Nru firefox-esr-140.5.0esr/editor/libeditor/HTMLEditor.cpp firefox-esr-140.6.0esr/editor/libeditor/HTMLEditor.cpp --- firefox-esr-140.5.0esr/editor/libeditor/HTMLEditor.cpp 2025-11-07 00:11:03.000000000 +0000 +++ firefox-esr-140.6.0esr/editor/libeditor/HTMLEditor.cpp 2025-12-01 18:15:32.000000000 +0000 @@ -435,6 +435,7 @@ MOZ_ASSERT(!mInitSucceeded, "HTMLEditor::Init() shouldn't be nested"); mInitSucceeded = true; + editActionData.OnEditorInitialized(); return NS_OK; } diff -Nru firefox-esr-140.5.0esr/editor/libeditor/TextEditor.cpp firefox-esr-140.6.0esr/editor/libeditor/TextEditor.cpp --- firefox-esr-140.5.0esr/editor/libeditor/TextEditor.cpp 2025-11-07 00:11:03.000000000 +0000 +++ firefox-esr-140.6.0esr/editor/libeditor/TextEditor.cpp 2025-12-01 18:15:31.000000000 +0000 @@ -168,11 +168,12 @@ return NS_ERROR_FAILURE; } - // We set mInitSucceeded here rather than at the end of the function, + // We set the initialized state here rather than at the end of the function, // since InitEditorContentAndSelection() can perform some transactions // and can warn if mInitSucceeded is still false. MOZ_ASSERT(!mInitSucceeded, "TextEditor::Init() shouldn't be nested"); mInitSucceeded = true; + editActionData.OnEditorInitialized(); rv = InitEditorContentAndSelection(); if (NS_FAILED(rv)) { @@ -180,6 +181,7 @@ // XXX Shouldn't we expose `NS_ERROR_EDITOR_DESTROYED` even though this // is a public method? mInitSucceeded = false; + editActionData.OnEditorDestroy(); return EditorBase::ToGenericNSResult(rv); } diff -Nru firefox-esr-140.5.0esr/image/imgLoader.cpp firefox-esr-140.6.0esr/image/imgLoader.cpp --- firefox-esr-140.5.0esr/image/imgLoader.cpp 2025-11-07 00:11:04.000000000 +0000 +++ firefox-esr-140.6.0esr/image/imgLoader.cpp 2025-12-01 18:15:32.000000000 +0000 @@ -923,12 +923,14 @@ } else { // either we are loading something inside a document, in which case // we should always have a requestingNode, or we are loading something - // outside a document, in which case the triggeringPrincipal and - // triggeringPrincipal should always be the systemPrincipal. - // However, there are exceptions: one is Notifications which create a - // channel in the parent process in which case we can't get a - // requestingNode. - rv = NS_NewChannel(aResult, aURI, nsContentUtils::GetSystemPrincipal(), + // outside a document, in which case the triggeringPrincipal should be the + // systemPrincipal. However, there are exceptions: one is Notifications + // which create a channel in the parent process in which case we can't get a + // requestingNode though we might have a valid triggeringPrincipal. + rv = NS_NewChannel(aResult, aURI, + aTriggeringPrincipal + ? aTriggeringPrincipal + : nsContentUtils::GetSystemPrincipal(), securityFlags, aPolicyType, nullptr, // nsICookieJarSettings nullptr, // PerformanceStorage diff -Nru firefox-esr-140.5.0esr/js/loader/ImportMap.cpp firefox-esr-140.6.0esr/js/loader/ImportMap.cpp --- firefox-esr-140.5.0esr/js/loader/ImportMap.cpp 2025-11-07 00:11:04.000000000 +0000 +++ firefox-esr-140.6.0esr/js/loader/ImportMap.cpp 2025-12-01 18:15:33.000000000 +0000 @@ -9,6 +9,7 @@ #include "js/Array.h" // IsArrayObject #include "js/friend/ErrorMessages.h" // js::GetErrorMessage, JSMSG_* #include "js/JSON.h" // JS_ParseJSON +#include "js/PropertyDescriptor.h" // JS::PropertyDescriptor #include "LoadedScript.h" #include "ModuleLoaderBase.h" // ScriptLoaderInterface #include "nsContentUtils.h" @@ -371,6 +372,21 @@ return normalized; } +static bool GetOwnProperty(JSContext* aCx, Handle aObj, + const char* aName, MutableHandle aValueOut) { + JS::Rooted> desc(aCx); + if (!JS_GetOwnPropertyDescriptor(aCx, aObj, aName, &desc)) { + return false; + } + + if (desc.isNothing()) { + return true; + } + MOZ_ASSERT(!desc->isAccessorDescriptor()); + aValueOut.set(desc->value()); + return true; +} + // https://html.spec.whatwg.org/multipage/webappapis.html#parse-an-import-map-string // static UniquePtr ImportMap::ParseString( @@ -415,9 +431,9 @@ return nullptr; } - JS::RootedObject parsedObj(aCx, &parsedVal.toObject()); - JS::RootedValue importsVal(aCx); - if (!JS_GetProperty(aCx, parsedObj, "imports", &importsVal)) { + RootedObject parsedObj(aCx, &parsedVal.toObject()); + RootedValue importsVal(aCx); + if (!GetOwnProperty(aCx, parsedObj, "imports", &importsVal)) { return nullptr; } @@ -452,8 +468,8 @@ } } - JS::RootedValue scopesVal(aCx); - if (!JS_GetProperty(aCx, parsedObj, "scopes", &scopesVal)) { + RootedValue scopesVal(aCx); + if (!GetOwnProperty(aCx, parsedObj, "scopes", &scopesVal)) { return nullptr; } @@ -488,8 +504,8 @@ } } - JS::RootedValue integrityVal(aCx); - if (!JS_GetProperty(aCx, parsedObj, "integrity", &integrityVal)) { + RootedValue integrityVal(aCx); + if (!GetOwnProperty(aCx, parsedObj, "integrity", &integrityVal)) { return nullptr; } @@ -583,7 +599,6 @@ const SpecifierMap* aSpecifierMap) { // Step 1. For each specifierKey → resolutionResult of specifierMap, for (auto&& [specifierKey, resolutionResult] : *aSpecifierMap) { - nsAutoString specifier{aNormalizedSpecifier}; nsCString asURL = aAsURL ? aAsURL->GetSpecOrDefault() : EmptyCString(); // Step 1.1. If specifierKey is normalizedSpecifier, then: diff -Nru firefox-esr-140.5.0esr/js/src/jit/CacheIR.cpp firefox-esr-140.6.0esr/js/src/jit/CacheIR.cpp --- firefox-esr-140.5.0esr/js/src/jit/CacheIR.cpp 2025-11-07 00:11:05.000000000 +0000 +++ firefox-esr-140.6.0esr/js/src/jit/CacheIR.cpp 2025-12-01 18:15:33.000000000 +0000 @@ -5554,12 +5554,13 @@ return false; } } else { - // Normal Case: If property exists this isn't an "add" + // Normal Case: If property exists or is an OOB typed array index, this + // isn't an "add". PropertyResult prop; if (!LookupOwnPropertyPure(cx_, nobj, id, &prop)) { return false; } - if (prop.isFound()) { + if (prop.isFound() || prop.isTypedArrayOutOfRange()) { return false; } } @@ -5663,6 +5664,10 @@ } JSObject* obj = &lhsVal_.toObject(); + if (!obj->is()) { + return AttachDecision::NoAction; + } + NativeObject* nobj = &obj->as(); PropertyResult prop; if (!LookupOwnPropertyPure(cx_, obj, id, &prop)) { @@ -5672,11 +5677,7 @@ return AttachDecision::NoAction; } - if (!obj->is()) { - return AttachDecision::NoAction; - } - auto* nobj = &obj->as(); - + MOZ_RELEASE_ASSERT(prop.isNativeProperty()); PropertyInfo propInfo = prop.propertyInfo(); NativeObject* holder = nobj; @@ -5688,6 +5689,7 @@ // The property must be the last added property of the object. SharedShape* newShape = holder->sharedShape(); + MOZ_RELEASE_ASSERT(oldShape != newShape); MOZ_RELEASE_ASSERT(newShape->lastProperty() == propInfo); #ifdef DEBUG diff -Nru firefox-esr-140.5.0esr/js/src/jit/riscv64/MacroAssembler-riscv64.h firefox-esr-140.6.0esr/js/src/jit/riscv64/MacroAssembler-riscv64.h --- firefox-esr-140.5.0esr/js/src/jit/riscv64/MacroAssembler-riscv64.h 2025-11-07 00:11:05.000000000 +0000 +++ firefox-esr-140.6.0esr/js/src/jit/riscv64/MacroAssembler-riscv64.h 2025-12-01 18:15:33.000000000 +0000 @@ -791,10 +791,10 @@ void unboxGCThingForGCBarrier(const Address& src, Register dest) { loadPtr(src, dest); - ExtractBits(dest, dest, 0, JSVAL_TAG_SHIFT - 1); + ExtractBits(dest, dest, 0, JSVAL_TAG_SHIFT); } void unboxGCThingForGCBarrier(const ValueOperand& src, Register dest) { - ExtractBits(dest, src.valueReg(), 0, JSVAL_TAG_SHIFT - 1); + ExtractBits(dest, src.valueReg(), 0, JSVAL_TAG_SHIFT); } void unboxWasmAnyRefGCThingForGCBarrier(const Address& src, Register dest) { diff -Nru firefox-esr-140.5.0esr/js/src/jit/shared/IonAssemblerBufferWithConstantPools.h firefox-esr-140.6.0esr/js/src/jit/shared/IonAssemblerBufferWithConstantPools.h --- firefox-esr-140.5.0esr/js/src/jit/shared/IonAssemblerBufferWithConstantPools.h 2025-11-07 00:11:05.000000000 +0000 +++ firefox-esr-140.6.0esr/js/src/jit/shared/IonAssemblerBufferWithConstantPools.h 2025-12-01 18:15:34.000000000 +0000 @@ -746,8 +746,10 @@ // secondary range veneers assuming the worst case deadlines. // Total pending secondary range veneer size. - size_t secondaryVeneers = guardSize_ * (branchDeadlines_.size() - - branchDeadlines_.maxRangeSize()); + size_t secondaryVeneers = + guardSize_ * + (branchDeadlines_.size() - branchDeadlines_.maxRangeSize()) * + InstSize; if (deadline < poolEnd + secondaryVeneers) { return false; diff -Nru firefox-esr-140.5.0esr/js/src/jit-test/tests/bigint/loosely-equal.js firefox-esr-140.6.0esr/js/src/jit-test/tests/bigint/loosely-equal.js --- firefox-esr-140.5.0esr/js/src/jit-test/tests/bigint/loosely-equal.js 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/js/src/jit-test/tests/bigint/loosely-equal.js 2025-12-01 18:15:33.000000000 +0000 @@ -0,0 +1,18 @@ +function check() { + for (let i = 1; i < 2000; i++) { + assertEq(Object(true) == 1n, true); + assertEq(1n == Object(true), true); + assertEq(Object(false) == 0n, true); + assertEq(0n == Object(false), true); + + let called = false; + assertEq({ valueOf() { called = true; return 0; }} == 0n, true); + assertEq(called, true); + + called = false; + assertEq(1n == { valueOf() { called = true; return 1; }}, true); + assertEq(called, true); + } +} + +check(); diff -Nru firefox-esr-140.5.0esr/js/src/vm/BigIntType.cpp firefox-esr-140.6.0esr/js/src/vm/BigIntType.cpp --- firefox-esr-140.5.0esr/js/src/vm/BigIntType.cpp 2025-11-07 00:11:08.000000000 +0000 +++ firefox-esr-140.6.0esr/js/src/vm/BigIntType.cpp 2025-12-01 18:15:36.000000000 +0000 @@ -3684,42 +3684,6 @@ return equal(lhs, rhsBigInt); } -// BigInt proposal section 3.2.5 -JS::Result BigInt::looselyEqual(JSContext* cx, HandleBigInt lhs, - HandleValue rhs) { - // Step 1. - if (rhs.isBigInt()) { - return equal(lhs, rhs.toBigInt()); - } - - // Steps 2-5 (not applicable). - - // Steps 6-7. - if (rhs.isString()) { - RootedString rhsString(cx, rhs.toString()); - return equal(cx, lhs, rhsString); - } - - // Steps 8-9 (not applicable). - - // Steps 10-11. - if (rhs.isObject()) { - RootedValue rhsPrimitive(cx, rhs); - if (!ToPrimitive(cx, &rhsPrimitive)) { - return cx->alreadyReportedError(); - } - return looselyEqual(cx, lhs, rhsPrimitive); - } - - // Step 12. - if (rhs.isNumber()) { - return equal(lhs, rhs.toNumber()); - } - - // Step 13. - return false; -} - // BigInt proposal section 1.1.12. BigInt::lessThan ( x, y ) bool BigInt::lessThan(const BigInt* x, const BigInt* y) { return compare(x, y) < 0; diff -Nru firefox-esr-140.5.0esr/js/src/vm/BigIntType.h firefox-esr-140.6.0esr/js/src/vm/BigIntType.h --- firefox-esr-140.5.0esr/js/src/vm/BigIntType.h 2025-11-07 00:11:08.000000000 +0000 +++ firefox-esr-140.6.0esr/js/src/vm/BigIntType.h 2025-12-01 18:15:35.000000000 +0000 @@ -255,8 +255,6 @@ static bool equal(const BigInt* lhs, double rhs); static JS::Result equal(JSContext* cx, Handle lhs, HandleString rhs); - static JS::Result looselyEqual(JSContext* cx, Handle lhs, - HandleValue rhs); static bool lessThan(const BigInt* x, const BigInt* y); // These methods return Nothing when the non-BigInt operand is NaN diff -Nru firefox-esr-140.5.0esr/js/src/vm/EqualityOperations.cpp firefox-esr-140.6.0esr/js/src/vm/EqualityOperations.cpp --- firefox-esr-140.5.0esr/js/src/vm/EqualityOperations.cpp 2025-11-07 00:11:08.000000000 +0000 +++ firefox-esr-140.6.0esr/js/src/vm/EqualityOperations.cpp 2025-12-01 18:15:36.000000000 +0000 @@ -78,37 +78,47 @@ return js::LooselyEqual(cx, lvalue, rval, result); } -// ES6 draft rev32 7.2.12 Abstract Equality Comparison +// ES2026 Draft rev e936549f1c05ac1b206ad4c5817e77ee3ecbc787 +// +// IsLooselyEqual ( x, y ) +// https://tc39.es/ecma262/#sec-islooselyequal bool js::LooselyEqual(JSContext* cx, JS::Handle lval, JS::Handle rval, bool* result) { - // Step 3. + // Step 1. If SameType(x, y) is true, then if (JS::SameType(lval, rval)) { + // Step 1.a. Return IsStrictlyEqual(x, y). return EqualGivenSameType(cx, lval, rval, result); } - // Handle int32 x double. + // NOTE: JS::SameType distinguishes between Int32 vs Double, + // but the spec's SameType doesn't. if (lval.isNumber() && rval.isNumber()) { *result = (lval.toNumber() == rval.toNumber()); return true; } - // Step 4. This a bit more complex, because of the undefined emulating object. + // Step 2. If x is null and y is undefined, return true. + // Step 3. If x is undefined and y is null, return true. + // Step 4. Normative Optional + // If the host is a web browser or otherwise supports The + // [[IsHTMLDDA]] Internal Slot, then + // Step 4.a. If x is an Object, x has an [[IsHTMLDDA]] internal slot, and y + // is either undefined or null, return true. + // Step 4.b. If x is either undefined or null, y is an Object, and y has an + // [[IsHTMLDDA]] internal slot, return true. if (lval.isNullOrUndefined()) { - // We can return early here, because null | undefined is only equal to the - // same set. *result = rval.isNullOrUndefined() || (rval.isObject() && EmulatesUndefined(&rval.toObject())); return true; } - - // Step 5. if (rval.isNullOrUndefined()) { MOZ_ASSERT(!lval.isNullOrUndefined()); *result = lval.isObject() && EmulatesUndefined(&lval.toObject()); return true; } - // Step 6. + // Step 5. If x is a Number and y is a String, return ! IsLooselyEqual(x, ! + // ToNumber(y)). if (lval.isNumber() && rval.isString()) { double num; if (!StringToNumber(cx, rval.toString(), &num)) { @@ -118,7 +128,8 @@ return true; } - // Step 7. + // Step 6. If x is a String and y is a Number, return ! IsLooselyEqual(! + // ToNumber(x), y). if (lval.isString() && rval.isNumber()) { double num; if (!StringToNumber(cx, lval.toString(), &num)) { @@ -128,18 +139,50 @@ return true; } - // Step 8. + // Step 7. If x is a BigInt and y is a String, then + if (lval.isBigInt() && rval.isString()) { + // Step 7.a. Let n be StringToBigInt(y). + BigInt* n; + JS::Rooted str(cx, rval.toString()); + JS_TRY_VAR_OR_RETURN_FALSE(cx, n, StringToBigInt(cx, str)); + if (!n) { + // Step 7.b. If n is undefined, return false. + *result = false; + return true; + } + // Step 7.c. Return ! IsLooselyEqual(x, n). + *result = JS::BigInt::equal(lval.toBigInt(), n); + return true; + } + + // Step 8. If x is a String and y is a BigInt, return ! IsLooselyEqual(y, + // x). + if (lval.isString() && rval.isBigInt()) { + BigInt* n; + JS::Rooted str(cx, lval.toString()); + JS_TRY_VAR_OR_RETURN_FALSE(cx, n, StringToBigInt(cx, str)); + if (!n) { + *result = false; + return true; + } + *result = JS::BigInt::equal(rval.toBigInt(), n); + return true; + } + + // Step 9. If x is a Boolean, return ! IsLooselyEqual(! ToNumber(x), y). if (lval.isBoolean()) { return LooselyEqualBooleanAndOther(cx, lval, rval, result); } - // Step 9. + // Step 10. If y is a Boolean, return ! IsLooselyEqual(x, ! ToNumber(y)). if (rval.isBoolean()) { return LooselyEqualBooleanAndOther(cx, rval, lval, result); } - // Step 10. - if ((lval.isString() || lval.isNumber() || lval.isSymbol()) && + // Step 11. If x is either a String, a Number, a BigInt, or a Symbol and y + // is an Object, return ! IsLooselyEqual(x, ? ToPrimitive(y)). + if ((lval.isString() || lval.isNumber() || lval.isBigInt() || + lval.isSymbol()) && rval.isObject()) { JS::Rooted rvalue(cx, rval); if (!ToPrimitive(cx, &rvalue)) { @@ -148,9 +191,10 @@ return js::LooselyEqual(cx, lval, rvalue, result); } - // Step 11. - if (lval.isObject() && - (rval.isString() || rval.isNumber() || rval.isSymbol())) { + // Step 12. If x is an Object and y is either a String, a Number, a BigInt, + // or a Symbol, return ! IsLooselyEqual(? ToPrimitive(x), y). + if (lval.isObject() && (rval.isString() || rval.isNumber() || + rval.isBigInt() || rval.isSymbol())) { JS::Rooted lvalue(cx, lval); if (!ToPrimitive(cx, &lvalue)) { return false; @@ -158,25 +202,20 @@ return js::LooselyEqual(cx, lvalue, rval, result); } - if (lval.isBigInt()) { - JS::Rooted lbi(cx, lval.toBigInt()); - bool tmpResult; - JS_TRY_VAR_OR_RETURN_FALSE(cx, tmpResult, - JS::BigInt::looselyEqual(cx, lbi, rval)); - *result = tmpResult; + // Step 13. If x is a BigInt and y is a Number, or if x is a Number and y + // is a BigInt, then + if (lval.isBigInt() && rval.isNumber()) { + // Step 13.a. If x is not finite or y is not finite, return false. + // Step 13.b. If ℝ(x) = ℝ(y), return true; otherwise return false. + *result = BigInt::equal(lval.toBigInt(), rval.toNumber()); return true; } - - if (rval.isBigInt()) { - JS::Rooted rbi(cx, rval.toBigInt()); - bool tmpResult; - JS_TRY_VAR_OR_RETURN_FALSE(cx, tmpResult, - JS::BigInt::looselyEqual(cx, rbi, lval)); - *result = tmpResult; + if (lval.isNumber() && rval.isBigInt()) { + *result = BigInt::equal(rval.toBigInt(), lval.toNumber()); return true; } - // Step 12. + // Step 14. Return false. *result = false; return true; } diff -Nru firefox-esr-140.5.0esr/l10n-ach/browser/browser/preferences/colors.ftl firefox-esr-140.6.0esr/l10n-ach/browser/browser/preferences/colors.ftl --- firefox-esr-140.5.0esr/l10n-ach/browser/browser/preferences/colors.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ach/browser/browser/preferences/colors.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -13,6 +13,12 @@ colors-page-override-option-never = .label = Pe matwal colors-text-and-background = Coc ki Ngeye +colors-text = + .label = Coc + .accesskey = C +colors-text-background = + .label = Ngeye + .accesskey = N colors-text-header = Coc .accesskey = C colors-background = Ngeye @@ -24,6 +30,12 @@ .label = Ngol te kakube .accesskey = l colors-links-header = Rangi me kakube +colors-links-unvisited = + .label = Kakube mape kilimo + .accesskey = K +colors-links-visited = + .label = Kakube ma kilimo + .accesskey = a colors-unvisited-links = Kakube mape kilimo .accesskey = K colors-visited-links = Kakube ma kilimo diff -Nru firefox-esr-140.5.0esr/l10n-ach/browser/browser/preferences/formAutofill.ftl firefox-esr-140.6.0esr/l10n-ach/browser/browser/preferences/formAutofill.ftl --- firefox-esr-140.5.0esr/l10n-ach/browser/browser/preferences/formAutofill.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ach/browser/browser/preferences/formAutofill.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -15,7 +15,9 @@ autofill-manage-add-button = Med… autofill-manage-edit-button = Yub… -## The address capture doorhanger +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding # The dialog title for editing addresses in browser preferences. autofill-edit-address-title = Yub kanonge @@ -25,17 +27,24 @@ autofill-address-organization = Dul autofill-address-street = Kanonge me yoo gudo -## address-level-2 names +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding autofill-address-city = Boma -## address-level-1 names +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding autofill-address-province = But lobo autofill-address-state = District -## Postal code name types +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding +# Postal code field. autofill-address-zip = Kod me ZIP ## diff -Nru firefox-esr-140.5.0esr/l10n-ach/browser/browser/preferences/preferences.ftl firefox-esr-140.6.0esr/l10n-ach/browser/browser/preferences/preferences.ftl --- firefox-esr-140.5.0esr/l10n-ach/browser/browser/preferences/preferences.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ach/browser/browser/preferences/preferences.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -66,6 +66,10 @@ always-check-default = .label = Jwijwi rot kace { -brand-short-name } tye layeny mamegi makwongo .accesskey = j +is-default-browser = + .message = { -brand-short-name } kombedi tye layeny mamegi makwongo +is-not-default-browser = + .message = { -brand-short-name } pe tye layeny mamegi makwongo is-default = { -brand-short-name } kombedi tye layeny mamegi makwongo is-not-default = { -brand-short-name } pe tye layeny mamegi makwongo set-as-my-default-browser = @@ -162,6 +166,11 @@ ## General Section - Files and Applications files-and-applications-title = Pwail ki Purugram +downloads-header-2 = + .label = Gam +download-save-where-2 = + .label = Gwok pwail bot + .accesskey = w download-header = Gam download-save-where = Gwok pwail bot .accesskey = w @@ -318,7 +327,7 @@ home-new-windows-tabs-header = Dirica ki dirica matino manyen home-new-windows-tabs-description2 = Yer ngo ma ineno ka iyabo potbuk me acakki mamegi, dirica manyen, ki dirica matino manyen. -## Home Section - Home Page Customization +## Custom Homepage subpage home-homepage-mode-label = Potbuk me acakki ki dirica manyen home-newtabs-mode-label = Dirica matino manyen @@ -429,6 +438,8 @@ ## Containers Section containers-header = Dirica matidi me mako jami +containers-section-header = + .heading = Dirica matidi me mako jami containers-add-button = .label = Med lamak jami manyen .accesskey = e @@ -530,6 +541,14 @@ ## The device name controls. sync-device-name-header = Nying Nyonyo +# Variables: +# $placeholder (string) - The placeholder text of the input +sync-device-name-input = + .aria-label = Nying Nyonyo + .placeholder = { $placeholder } +sync-device-name-change-2 = + .label = Lok nying nyonyo + .accesskey = o sync-device-name-change = .label = Lok nying nyonyo… .accesskey = o @@ -607,6 +626,10 @@ .label = Pe i poo ikom gin mukato matwal history-remember-option-custom = .label = Tii ki ter mamegi pi gin mukato +history-remember-description2 = + .description = { -brand-short-name } bi poo ikom yeny mamegi, gam, pwom ki yeny mukato. +history-dontremember-description2 = + .description = { -brand-short-name } bi tic ki ter acel calo yeny me mung, ka pe bi poo ikom gin mukato mo keken kun nongo i yenyo Kakube. history-remember-description = { -brand-short-name } bi poo ikom yeny mamegi, gam, pwom ki yeny mukato. history-dontremember-description = { -brand-short-name } bi tic ki ter acel calo yeny me mung, ka pe bi poo ikom gin mukato mo keken kun nongo i yenyo Kakube. history-private-browsing-permanent = @@ -722,6 +745,8 @@ permissions-notification-pause = .label = Juk jami angeya wang ma { -brand-short-name } onwoyo cake .accesskey = n +permissions-autoplay2 = + .label = Tuk pire kene permissions-autoplay = Tuk pire kene permissions-autoplay-settings = .label = Ter… @@ -735,6 +760,14 @@ permissions-addon-exceptions = .label = Ma kiweko woko… .accesskey = M +permissions-location2 = + .label = Kabedo +permissions-camera2 = + .label = Lamak cal +permissions-microphone2 = + .label = Mikropon +permissions-notification2 = + .label = Jami angeya ## Privacy Section - Data Collection @@ -778,6 +811,7 @@ certs-devices = .label = Nyonyo me ber bedo… .accesskey = N +certs-devices-enable-fips = Mii tic me FIPS ## Privacy Section - HTTPS-Only diff -Nru firefox-esr-140.5.0esr/l10n-ach/browser/browser/webauthnDialog.ftl firefox-esr-140.6.0esr/l10n-ach/browser/browser/webauthnDialog.ftl --- firefox-esr-140.5.0esr/l10n-ach/browser/browser/webauthnDialog.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ach/browser/browser/webauthnDialog.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -2,3 +2,8 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. + +## WebAuthn prompts + +webauthn-cancel = Juki + .accesskey = u diff -Nru firefox-esr-140.5.0esr/l10n-ach/devtools/client/toolbox-options.ftl firefox-esr-140.6.0esr/l10n-ach/devtools/client/toolbox-options.ftl --- firefox-esr-140.5.0esr/l10n-ach/devtools/client/toolbox-options.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ach/devtools/client/toolbox-options.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -98,5 +98,5 @@ options-enable-service-workers-http-label = Cak Service Workers i HTTP (kacce bok me gitic tye ayaba) options-enable-service-workers-http-tooltip = .title = Cako ter man bicako service workers i HTTP pi dirica matino weng matye ki bok me gitic ayaba. -# The message shown for settings that trigger page reload +# The message shown for settings that trigger page reload and will only apply to the current session options-context-triggers-page-refresh = * Kare ma kombedi ni keken, nwoyo cano pot buk diff -Nru firefox-esr-140.5.0esr/l10n-ach/toolkit/toolkit/global/browser-utils.ftl firefox-esr-140.6.0esr/l10n-ach/toolkit/toolkit/global/browser-utils.ftl --- firefox-esr-140.5.0esr/l10n-ach/toolkit/toolkit/global/browser-utils.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ach/toolkit/toolkit/global/browser-utils.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -2,3 +2,9 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. +# Variables: +# $scheme (string) - URI scheme like jar: about: +browser-utils-url-scheme = kakare { $scheme } +# Special case of done-scheme for file: +# This is used as an eTLD replacement for local files, so make it lower case +browser-utils-file-scheme = pwail ma gang diff -Nru firefox-esr-140.5.0esr/l10n-af/browser/browser/preferences/colors.ftl firefox-esr-140.6.0esr/l10n-af/browser/browser/preferences/colors.ftl --- firefox-esr-140.5.0esr/l10n-af/browser/browser/preferences/colors.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-af/browser/browser/preferences/colors.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -13,6 +13,12 @@ colors-page-override-option-never = .label = Nooit colors-text-and-background = Teks en agtergrond +colors-text = + .label = Teks + .accesskey = T +colors-text-background = + .label = Agtergrond + .accesskey = A colors-text-header = Teks .accesskey = T colors-background = Agtergrond @@ -24,6 +30,12 @@ .label = Onderstreep skakels .accesskey = O colors-links-header = Skakelkleure +colors-links-unvisited = + .label = Onbesoekte Skakels: + .accesskey = O +colors-links-visited = + .label = Besoekte skakels + .accesskey = B colors-unvisited-links = Onbesoekte Skakels: .accesskey = O colors-visited-links = Besoekte skakels diff -Nru firefox-esr-140.5.0esr/l10n-af/browser/browser/preferences/preferences.ftl firefox-esr-140.6.0esr/l10n-af/browser/browser/preferences/preferences.ftl --- firefox-esr-140.5.0esr/l10n-af/browser/browser/preferences/preferences.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-af/browser/browser/preferences/preferences.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -43,6 +43,10 @@ always-check-default = .label = Kontroleer altyd of { -brand-short-name } die verstekblaaier is .accesskey = K +is-default-browser = + .message = { -brand-short-name } is tans die verstekblaaier +is-not-default-browser = + .message = { -brand-short-name } is nie die verstekblaaier nie is-default = { -brand-short-name } is tans die verstekblaaier is-not-default = { -brand-short-name } is nie die verstekblaaier nie set-as-my-default-browser = @@ -140,6 +144,11 @@ ## General Section - Files and Applications files-and-applications-title = Lêers en Toepassings +downloads-header-2 = + .label = Aflaaie +download-save-where-2 = + .label = Stoor lêers na + .accesskey = o download-header = Aflaaie download-save-where = Stoor lêers na .accesskey = o @@ -276,7 +285,7 @@ home-new-windows-tabs-header = Nuwe Vensters en Oortjies -## Home Section - Home Page Customization +## Custom Homepage subpage home-homepage-mode-label = Tuisblad en nuwe vensters home-newtabs-mode-label = Nuwe oortjies @@ -347,6 +356,8 @@ ## Containers Section containers-header = Konteksoortjies +containers-section-header = + .heading = Konteksoortjies containers-add-button = .label = Voeg nuwe konteks by .accesskey = V @@ -417,6 +428,14 @@ ## The device name controls. sync-device-name-header = Toestelnaam +# Variables: +# $placeholder (string) - The placeholder text of the input +sync-device-name-input = + .aria-label = Toestelnaam + .placeholder = { $placeholder } +sync-device-name-change-2 = + .label = Verander toestelnaam + .accesskey = V sync-device-name-change = .label = Verander toestelnaam… .accesskey = V @@ -491,6 +510,8 @@ .label = nooit geskiedenis onthou nie history-remember-option-custom = .label = eie instellings vir geskiedenis gebruik +history-dontremember-description2 = + .description = { -brand-short-name } gebruik dieselfde instellings as private blaaiery en sal nie enige geskiedenis onthou wanneer u die web besoek nie. history-dontremember-description = { -brand-short-name } gebruik dieselfde instellings as private blaaiery en sal nie enige geskiedenis onthou wanneer u die web besoek nie. history-private-browsing-permanent = .label = Gebruik altyd privaatblaai-modus @@ -577,6 +598,14 @@ permissions-addon-exceptions = .label = Uitsonderings… .accesskey = U +permissions-location2 = + .label = Ligging +permissions-xr2 = + .label = Virtuele Realiteit +permissions-microphone2 = + .label = Mikrofoon +permissions-notification2 = + .label = Kennisgewings ## Privacy Section - Data Collection @@ -604,6 +633,7 @@ certs-enable-ocsp = .label = Bevestig huidige geldigheid van sertifikate deur OCSP-bedieners te vra .accesskey = B +certs-devices-enable-fips = Aktiveer FIPS ## The following strings are used in the Download section of settings diff -Nru firefox-esr-140.5.0esr/l10n-af/toolkit/toolkit/global/browser-utils.ftl firefox-esr-140.6.0esr/l10n-af/toolkit/toolkit/global/browser-utils.ftl --- firefox-esr-140.5.0esr/l10n-af/toolkit/toolkit/global/browser-utils.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-af/toolkit/toolkit/global/browser-utils.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -2,3 +2,9 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. +# Variables: +# $scheme (string) - URI scheme like jar: about: +browser-utils-url-scheme = { $scheme }-hulpbron +# Special case of done-scheme for file: +# This is used as an eTLD replacement for local files, so make it lower case +browser-utils-file-scheme = plaaslike lêer diff -Nru firefox-esr-140.5.0esr/l10n-an/browser/browser/preferences/colors.ftl firefox-esr-140.6.0esr/l10n-an/browser/browser/preferences/colors.ftl --- firefox-esr-140.5.0esr/l10n-an/browser/browser/preferences/colors.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-an/browser/browser/preferences/colors.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -13,6 +13,12 @@ colors-page-override-option-never = .label = Nunca colors-text-and-background = Texto y fundo +colors-text = + .label = Texto + .accesskey = T +colors-text-background = + .label = Fundo + .accesskey = B colors-text-header = Texto .accesskey = T colors-background = Fundo @@ -24,6 +30,12 @@ .label = Subrayar os vinclos .accesskey = b colors-links-header = Color d'os vinclos +colors-links-unvisited = + .label = Vinclos no vesitaus + .accesskey = L +colors-links-visited = + .label = Vinclos vesitaus + .accesskey = V colors-unvisited-links = Vinclos no vesitaus .accesskey = L colors-visited-links = Vinclos vesitaus diff -Nru firefox-esr-140.5.0esr/l10n-an/browser/browser/preferences/formAutofill.ftl firefox-esr-140.6.0esr/l10n-an/browser/browser/preferences/formAutofill.ftl --- firefox-esr-140.5.0esr/l10n-an/browser/browser/preferences/formAutofill.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-an/browser/browser/preferences/formAutofill.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -15,7 +15,9 @@ autofill-manage-add-button = Anyader… autofill-manage-edit-button = Editar… -## The address capture doorhanger +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding # The dialog title for editing addresses in browser preferences. autofill-edit-address-title = Editar adreza @@ -25,53 +27,64 @@ autofill-address-organization = Organización autofill-address-street = Adreza postal -## address-level-3 (Sublocality) names +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding -# Used in IR, MX +# Used in Iran (IR), Mexico (MX) as sublocality (civil entity below a locality, e.g. within a city). autofill-address-neighborhood = Barrio -# Used in MY +# Used in Malaysia (MY) as sublocality (civil entity below a locality, e.g. within a city). autofill-address-village-township = Lugar u villa autofill-address-island = Isla -# Used in IE +# Used in Ireland (IE) as sublocality (civil entity below a locality, e.g. within a city). autofill-address-townland = Municipio -## address-level-2 names +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding autofill-address-city = Ciudat -# Used in HK, SD, SY, TR as Address Level-2 and used in KR as Sublocality. +# Used in Hong Kong (HK), Sudan (SD), Syria (SY), Türkiye (TR) as as secondary address information (2 levels below the country level). +# Used in Korea as sublocality (civil entity below a locality, e.g. within a city). autofill-address-district = Distrito -# Used in GB, NO, SE +# Used in United Kingdom (GB), Norway (NO), Sweden (SE) as as secondary address information (2 levels below the country level). autofill-address-post-town = Localidat -# Used in AU as Address Level-2 and used in ZZ as Sublocality. +# Used in Australia (AU) as as secondary address information (below the country level). +# Used for international addresses as sublocality (civil entity below a locality, e.g. within a city). autofill-address-suburb = Suburbio -## address-level-1 names +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding autofill-address-province = Provincia autofill-address-state = Estau autofill-address-county = Condau -# Used in BB, JM +# Used in Barbados (BB), Jamaica (JM) as primary address information (1 level below the country level). autofill-address-parish = Parroquia -# Used in JP +# Used in Japan (JP) as primary address information (1 level below the country level). autofill-address-prefecture = Prefectura -# Used in HK +# Used in Honk Kong (HK) as primary address information (1 level below the country level). autofill-address-area = Aria -# Used in KR +# Used in Korea (KO) as primary address information (1 level below the country level). autofill-address-do-si = Do/Si -# Used in NI, CO +# Used in Nicaragua (NI), Colombia (CO) as primary address information (1 level below the country level). autofill-address-department = Department -# Used in AE +# Used in United Arab Emirates (AE) as primary address information (1 level below the country level). autofill-address-emirate = Emirato -# Used in RU and UA +# Used in Russia (RU), Ukraine (UA) as primary address information (1 level below the country level). autofill-address-oblast = Oblast -## Postal code name types +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding -# Used in IN +# Postal code field used in India (IN). autofill-address-pin = Pin autofill-address-postal-code = Codigo postal +# Postal code field. autofill-address-zip = Codigo postal (Estaus Unius) -# Used in IE +# Postal code field used in Ireland (IE). autofill-address-eircode = Codigo postal (Eircode) ## diff -Nru firefox-esr-140.5.0esr/l10n-an/browser/browser/preferences/preferences.ftl firefox-esr-140.6.0esr/l10n-an/browser/browser/preferences/preferences.ftl --- firefox-esr-140.5.0esr/l10n-an/browser/browser/preferences/preferences.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-an/browser/browser/preferences/preferences.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -73,6 +73,10 @@ always-check-default = .label = Comprebar siempre si lo { -brand-short-name } ye o suyo navegador por defecto .accesskey = o +is-default-browser = + .message = { -brand-short-name } ye agora o suyo navegador por defecto +is-not-default-browser = + .message = { -brand-short-name } no ye o suyo navegador por defecto is-default = { -brand-short-name } ye agora o suyo navegador por defecto is-not-default = { -brand-short-name } no ye o suyo navegador por defecto set-as-my-default-browser = @@ -184,6 +188,11 @@ ## General Section - Files and Applications files-and-applications-title = Fichers y aplicacions +downloads-header-2 = + .label = Descargas +download-save-where-2 = + .label = Alzar os fichers en + .accesskey = A download-header = Descargas download-save-where = Alzar os fichers en .accesskey = A @@ -374,7 +383,7 @@ home-new-windows-tabs-header = Nuevas finestras y pestanyas home-new-windows-tabs-description2 = Triar qué ye lo que se vei quan s'ubre la pachina d'inicio, finestras nuevas y pestanyas nuevas. -## Home Section - Home Page Customization +## Custom Homepage subpage home-homepage-mode-label = Pachina d'inicio y nuevas finestras home-newtabs-mode-label = Nuevas pestanyas @@ -497,6 +506,8 @@ ## Containers Section containers-header = Pestanyas contenederas +containers-section-header = + .heading = Pestanyas contenederas containers-add-button = .label = Anyader nuevo contenedor .accesskey = A @@ -617,6 +628,14 @@ ## The device name controls. sync-device-name-header = Nombre d'o dispositivo +# Variables: +# $placeholder (string) - The placeholder text of the input +sync-device-name-input = + .aria-label = Nombre d'o dispositivo + .placeholder = { $placeholder } +sync-device-name-change-2 = + .label = Cambiar lo nombre d'o dispositivo + .accesskey = b sync-device-name-change = .label = Cambiar lo nombre d'o dispositivo... .accesskey = b @@ -722,6 +741,10 @@ .label = no remerará l'historial history-remember-option-custom = .label = ferá servir a configuración personalizada de l'historial +history-remember-description2 = + .description = { -brand-short-name } recordará la tuya navegación, descargas, formularios y historial de busqueda. +history-dontremember-description2 = + .description = O { -brand-short-name } ferá servir a mesma configuración que en a navegación privada, y no remerará garra dato d'o suyo historial entre que navega por a Web. history-remember-description = { -brand-short-name } recordará la tuya navegación, descargas, formularios y historial de busqueda. history-dontremember-description = O { -brand-short-name } ferá servir a mesma configuración que en a navegación privada, y no remerará garra dato d'o suyo historial entre que navega por a Web. history-private-browsing-permanent = @@ -901,6 +924,8 @@ permissions-notification-pause = .label = Notificacions de pausa dica que { -brand-short-name } se reinicie .accesskey = n +permissions-autoplay2 = + .label = Reproducción automatica permissions-autoplay = Reproducción automatica permissions-autoplay-settings = .label = Configuración… @@ -914,6 +939,16 @@ permissions-addon-exceptions = .label = Excepcions… .accesskey = E +permissions-location2 = + .label = Puesto +permissions-xr2 = + .label = Realidat Virtual +permissions-camera2 = + .label = Camara +permissions-microphone2 = + .label = Microfono +permissions-notification2 = + .label = Notificacions ## Privacy Section - Data Collection @@ -966,6 +1001,7 @@ certs-devices = .label = Dispositivos de seguranza… .accesskey = D +certs-devices-enable-fips = Activar os FIPS ## Privacy Section - HTTPS-Only diff -Nru firefox-esr-140.5.0esr/l10n-an/browser/browser/webauthnDialog.ftl firefox-esr-140.6.0esr/l10n-an/browser/browser/webauthnDialog.ftl --- firefox-esr-140.5.0esr/l10n-an/browser/browser/webauthnDialog.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-an/browser/browser/webauthnDialog.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -2,3 +2,8 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. + +## WebAuthn prompts + +webauthn-cancel = Cancelar + .accesskey = c diff -Nru firefox-esr-140.5.0esr/l10n-an/devtools/client/toolbox-options.ftl firefox-esr-140.6.0esr/l10n-an/devtools/client/toolbox-options.ftl --- firefox-esr-140.5.0esr/l10n-an/devtools/client/toolbox-options.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-an/devtools/client/toolbox-options.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -105,5 +105,5 @@ options-source-maps-label = Habilitar los mapas fuent options-source-maps-tooltip = .title = Si activas esta opción las fuents serán mapiadas en as ferramientas. -# The message shown for settings that trigger page reload +# The message shown for settings that trigger page reload and will only apply to the current session options-context-triggers-page-refresh = * esviella a pachina nomás ta ista sesión diff -Nru firefox-esr-140.5.0esr/l10n-an/toolkit/toolkit/global/browser-utils.ftl firefox-esr-140.6.0esr/l10n-an/toolkit/toolkit/global/browser-utils.ftl --- firefox-esr-140.5.0esr/l10n-an/toolkit/toolkit/global/browser-utils.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-an/toolkit/toolkit/global/browser-utils.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -2,3 +2,9 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. +# Variables: +# $scheme (string) - URI scheme like jar: about: +browser-utils-url-scheme = Recurso { $scheme } +# Special case of done-scheme for file: +# This is used as an eTLD replacement for local files, so make it lower case +browser-utils-file-scheme = fichero local diff -Nru firefox-esr-140.5.0esr/l10n-ar/browser/browser/browser.ftl firefox-esr-140.6.0esr/l10n-ar/browser/browser/browser.ftl --- firefox-esr-140.5.0esr/l10n-ar/browser/browser/browser.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ar/browser/browser/browser.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -117,6 +117,9 @@ [macos] { -brand-full-name } — التصفح الخاص *[other] { -brand-full-name } التصفح الخاص } +# This is only used on macOS; on other OSes we use the full private window +# title (so including the brand name) as a suffix +browser-main-private-suffix-for-content = التصفح الخاص ## @@ -835,6 +838,19 @@ # particular type. urlbar-result-dismissal-acknowledgment-all = شكرًا لملاحظاتك. لن ترى هذه الاقتراحات بعد الآن. +## These strings are used for suggestions of important dates in the urlbar. + +# The name of an event and a note that it is happening today separated by a +# middot. +# Variables: +# $name (string) - The name of the event. +urlbar-result-dates-today = { $name } · اليوم +# The name of multiple day long event and a note that it is ends today +# separated by a middot. +# Variables: +# $name (string) - The name of the event. +urlbar-result-dates-ends-today = { $name } · ينتهي اليوم + ## Strings used for buttons in the urlbar # Label prompting user to search with a particular search engine. @@ -1348,6 +1364,10 @@ # $popupURI (String): the URI for the pop-up window popup-show-popup-menuitem = .label = أظهر ”{ $popupURI }“ +# Variables: +# $redirectURI (String): the URI for the redirect +popup-trigger-redirect-menuitem = + .label = أظهر "{ $redirectURI }" ## File-picker crash notification ("FilePickerCrashed.sys.mjs") @@ -1377,7 +1397,7 @@ .label = أنهِ الإعداد .tooltiptext = أنهِ إعداد { -brand-short-name } -## The urlbar trust panel +## The urlbar trust icon & panel trustpanel-etp-label-disabled = الحماية الموسّعة من التعقب معطّلة # Variables @@ -1392,32 +1412,40 @@ trustpanel-connection-label-secure = الاتصال آمن trustpanel-connection-label-insecure = الاتصال غير آمن trustpanel-header-enabled = { -brand-product-name } على الحراسة -trustpanel-description-enabled = أنت محمي. إذا لاحظنا أي شيء، سنُعلمك. +trustpanel-description-enabled2 = أنت محمي. إذا لاحظنا أي شيء، سنُعلمك. +trustpanel-header-enabled-insecure = كن حذرًا على هذا الموقع +trustpanel-description-enabled-insecure = { -brand-product-name } لاحظ شيئًا مريبًا. trustpanel-header-disabled = لقد أوقفت الحماية trustpanel-description-disabled = { -brand-product-name } خارج الخدمة. نقترح إعادة تفعيل الحماية. trustpanel-clear-cookies-button = امسح الكعكات و بيانات المواقع trustpanel-privacy-link = إعدادات الخصوصية +# Variables +# $host (String): the hostname of the site that is being displayed. +trustpanel-clear-cookies-header = + .title = امحُ ملفات تعريف الارتباط وبيانات الموقع لـ { $host } trustpanel-clear-cookies-subview-button-clear = امسح trustpanel-clear-cookies-subview-button-cancel = ألغِ # Variables # $host (String): the hostname of the site that is being displayed. trustpanel-site-information-header = .title = حماية الاتصال لـ { $host } -trustpanel-connection-secure = أنت متصل مع هذا الموقع بأمان. -trustpanel-connection-not-secure = لست متصلاً مع هذا الموقع بأمان. trustpanel-siteinformation-morelink = مزيد من المعلومات حول الموقع trustpanel-blocker-see-all = اعرض الكل +# Variables +# $host (String): the hostname of the site that is being displayed. +trustpanel-blocker-header = + .title = حماية التتبع لـ { $host } ## Variables ## $count (String): the number of trackers blocked. trustpanel-blocker-description = { -brand-product-name } يرى أن على الشركات تقليل متابعتك. لذلك نحظر أكبر عدد ممكن منها. +trustpanel-blocked-header = قام { -brand-product-name } بحظر هذه الأشياء من أجلك: trustpanel-tracking-header = سمح { -brand-product-name } بهذه الأشياء حتى لا تتعطل المواقع: trustpanel-tracking-description = دون المتعقّبات، قد لا تعمل بعض الأزرار والنماذج وحقول الولوج. trustpanel-insecure-section-header = اتّصالك غير آمن trustpanel-insecure-description = البيانات التي ترسلها إلى هذا الموقع غير مُعمّاة، مما قد يعرضها للعرض أو السرقة أو التعديل. trustpanel-list-label-tracking-content = المحتوى الذي يتعقّبك -trustpanel-social-tracking-tab-list-header = تحاول هذه المواقع تتبعك: -trustpanel-tracking-cookies-tab-list-header = تحاول هذه المواقع تتبعك: trustpanel-tracking-content-tab-list-header = تحاول هذه المواقع تتبعك: trustpanel-fingerprinter-list-header = تحاول هذه المواقع تبصيمك: +trustpanel-cryptominer-tab-list-header = تحاول هذه المواقع تعدين العُملات الرقمية: diff -Nru firefox-esr-140.5.0esr/l10n-ar/browser/browser/contextual-manager.ftl firefox-esr-140.6.0esr/l10n-ar/browser/browser/contextual-manager.ftl --- firefox-esr-140.5.0esr/l10n-ar/browser/browser/contextual-manager.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ar/browser/browser/contextual-manager.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -129,8 +129,6 @@ contextual-manager-passwords-update-password-success-heading = .heading = حُفظت كلمة السر contextual-manager-passwords-update-password-success-button = تمّ -contextual-manager-passwords-update-username-success-heading = - .heading = حُفظ اسم المستخدم contextual-manager-passwords-delete-password-success-button = تمّ # # Radiobutton label to display total number of passwords diff -Nru firefox-esr-140.5.0esr/l10n-ar/browser/browser/linuxDesktopEntry.ftl firefox-esr-140.6.0esr/l10n-ar/browser/browser/linuxDesktopEntry.ftl --- firefox-esr-140.5.0esr/l10n-ar/browser/browser/linuxDesktopEntry.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ar/browser/browser/linuxDesktopEntry.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -9,9 +9,13 @@ # The entry name is the label on the desktop icon, among other things. desktop-entry-name = { -brand-shortcut-name } # The comment usually appears as a tooltip when hovering over application menu entry. +desktop-entry-comment-1 = متصفح سريع وخاص +# The comment usually appears as a tooltip when hovering over application menu entry. desktop-entry-comment = تصفح شبكة الوِب العالمية desktop-entry-generic-name = متصفح الإنترنت # Combine Name and GenericName. This string is specific to GNOME. +desktop-entry-x-gnome-full-name-1 = { -brand-full-name } +# Combine Name and GenericName. This string is specific to GNOME. desktop-entry-x-gnome-full-name = متصفح { -brand-shortcut-name } # Keywords are search terms used to find this application. # The string is a list of keywords separated by semicolons: diff -Nru firefox-esr-140.5.0esr/l10n-ar/browser/browser/newtab/asrouter.ftl firefox-esr-140.6.0esr/l10n-ar/browser/browser/newtab/asrouter.ftl --- firefox-esr-140.5.0esr/l10n-ar/browser/browser/newtab/asrouter.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ar/browser/browser/newtab/asrouter.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -76,6 +76,7 @@ cfr-doorhanger-bookmark-fxa-close-btn-tooltip = .aria-label = زر الإغلاق .title = أغلِق +fxa-adoption-addresses-backup-title = دعنا نحتفظ بنسخة احتياطية من عناوينك المحفوظة ## Protections panel @@ -238,6 +239,13 @@ set-default-pdf-handler-headline = يُفتح الآن ملفات PDF الخاصة بك في { -brand-short-name }. حرر النماذج أو التوقيع عليها مباشرةً في متصفحك. للتغيير، ابحث عن "PDF" في الإعدادات. set-default-pdf-handler-primary = فهمت +## PDF Annotations strings + +annotations-make-default-pdf-primary-cta = + .label = اجعله المبدئي +annotations-make-default-pdf-next = + .label = التالي + ## FxA sync CFR fxa-sync-cfr-header = جهاز جديد في مستقبلك؟ @@ -323,6 +331,8 @@ .title = أغلق .aria-label = أغلق fxa-menu-message-sign-up-button = سجّل حسابًا +fxa-menu-message-sign-in-button = لِج +fxa-menu-message-sync-button = ابدأ المزامنة fxa-menu-message-sync-devices-primary-text = زامِن كل أجهزتك fxa-menu-message-sync-devices-secondary-text = احصل على معلوماتك على الفور — مثل العلامات وكلمات السر — في أي مكان تستخدم فيه { -brand-short-name }. fxa-menu-message-sync-devices-collapsed-text = زامِن كل أجهزتك @@ -345,3 +355,12 @@ multi-cta-fox-doodle-main-browser-primary-button-label = اضبط { -brand-short-name } ليكون متصفّحي الرئيسي multi-cta-fox-doodle-quick-reminder-subtitle = فيما يلي تذكير سريع بأنه يمكنك الاحتفاظ بمتصفحك المفضل الذي يركز على الخصوصية بنقرة واحدة فقط. multi-cta-fox-doodle-msix-privacy-focused-subtitle = حافظ على متصفحك المفضل الذي يُركز على الخصوصية بنقرة واحدة. عيّن { -brand-short-name } كمتصفحك المبدئي لفتح الروابط، ثم ثبّته على شريط المهام وقائمة البدء. + +## Windows 10 EoS Sync messages group 1 toast notification + +windows-10-eos-sync-toast-primary-label = ابدأ +windows-10-eos-sync-toast-secondary-label = ذكّرني لاحقًا + +## Windows 10 EoS sync messages group 2 feature callouts + +windows-10-eos-challenger-pin-primary-button = ثبّت { -brand-shorter-name } diff -Nru firefox-esr-140.5.0esr/l10n-ar/browser/browser/newtab/newtab.ftl firefox-esr-140.6.0esr/l10n-ar/browser/browser/newtab/newtab.ftl --- firefox-esr-140.5.0esr/l10n-ar/browser/browser/newtab/newtab.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ar/browser/browser/newtab/newtab.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -370,7 +370,7 @@ newtab-wallpaper-gradient-orange = تدرج اللون البرتقالي والوردي newtab-wallpaper-abstract-blue-purple = الأشكال الزرقاء والأرجوانية -## Celestial +## Firefox newtab-wallpaper-white-mountains = جبال بيضاء newtab-wallpaper-feature-highlight-header = جرب دفقة من الألوان @@ -462,3 +462,42 @@ newtab-report-submit = أرسِل newtab-toast-thanks-for-reporting = .message = شكرا لك على الإبلاغ عن هذا. + +## Strings for task / to-do list productivity widget + +# A simple label next to the default list name letting users know this is a new / beta feature +newtab-widget-lists-label-new = + .label = جديد +newtab-widget-lists-label-beta = + .label = تجريبي +newtab-widget-task-list-menu-copy = انسخ +newtab-widget-lists-menu-edit = حرّر اسم القائمة +newtab-widget-lists-menu-create = أنشئ قائمة جديدة +newtab-widget-lists-menu-delete = احذف هذه القائمة +newtab-widget-lists-menu-copy = انسخ القائمة إلى الحافظة +newtab-widget-lists-menu-hide = أخفِ جميع القوائم +newtab-widget-lists-menu-learn-more = اطّلع على المزيد +newtab-widget-lists-input-add-an-item = + .placeholder = أضف عنصر +newtab-widget-lists-input-menu-delete = احذف +newtab-widget-lists-input-menu-edit = حرّر +newtab-widget-lists-name-placeholder-default = + .placeholder = قائمة المهام +# The placeholder value of the name field for a newly created list +newtab-widget-lists-name-placeholder-new = + .placeholder = قائمة جديدة + +## Strings for timer productivity widget +## When the timer ends, a system notification may be shown. Depending on which mode the timer is in, that message would be shown + +newtab-widget-timer-notification-title = المؤقت +newtab-widget-timer-label-play = + .label = شغّل +newtab-widget-timer-label-pause = + .label = ألبِث +newtab-widget-timer-menu-learn-more = اطّلع على المزيد +newtab-promo-card-title = ادعم { -brand-product-name } +newtab-promo-card-cta = اطّلع على المزيد +newtab-promo-card-dismiss-button = + .title = أهمِل + .aria-label = أهمِل diff -Nru firefox-esr-140.5.0esr/l10n-ar/browser/browser/preferences/colors.ftl firefox-esr-140.6.0esr/l10n-ar/browser/browser/preferences/colors.ftl --- firefox-esr-140.5.0esr/l10n-ar/browser/browser/preferences/colors.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ar/browser/browser/preferences/colors.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -16,6 +16,12 @@ colors-page-override-option-never = .label = أبدًا colors-text-and-background = النّصّ و الخلفيّة +colors-text = + .label = النّص + .accesskey = ن +colors-text-background = + .label = الخلفية + .accesskey = خ colors-text-header = النّص .accesskey = ن colors-background = الخلفية @@ -27,6 +33,12 @@ .label = سطّر الروابط .accesskey = ط colors-links-header = ألوان الروابط +colors-links-unvisited = + .label = الروابط غير المزارة + .accesskey = غ +colors-links-visited = + .label = الروابط المزارة + .accesskey = م colors-unvisited-links = الروابط غير المزارة .accesskey = غ colors-visited-links = الروابط المزارة diff -Nru firefox-esr-140.5.0esr/l10n-ar/browser/browser/preferences/formAutofill.ftl firefox-esr-140.6.0esr/l10n-ar/browser/browser/preferences/formAutofill.ftl --- firefox-esr-140.5.0esr/l10n-ar/browser/browser/preferences/formAutofill.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ar/browser/browser/preferences/formAutofill.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -15,7 +15,9 @@ autofill-manage-add-button = أضِف… autofill-manage-edit-button = حرّر… -## The address capture doorhanger +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding address-capture-save-doorhanger-header = احفظ العنوان؟ address-capture-update-doorhanger-header = حدّث العنوان؟ @@ -42,53 +44,64 @@ autofill-address-street-address = عنوان الشارع autofill-address-street = عنوان الشارع -## address-level-3 (Sublocality) names +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding -# Used in IR, MX +# Used in Iran (IR), Mexico (MX) as sublocality (civil entity below a locality, e.g. within a city). autofill-address-neighborhood = الحي -# Used in MY +# Used in Malaysia (MY) as sublocality (civil entity below a locality, e.g. within a city). autofill-address-village-township = البلدة autofill-address-island = الجزيرة -# Used in IE +# Used in Ireland (IE) as sublocality (civil entity below a locality, e.g. within a city). autofill-address-townland = الأرض -## address-level-2 names +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding autofill-address-city = المدينة -# Used in HK, SD, SY, TR as Address Level-2 and used in KR as Sublocality. +# Used in Hong Kong (HK), Sudan (SD), Syria (SY), Türkiye (TR) as as secondary address information (2 levels below the country level). +# Used in Korea as sublocality (civil entity below a locality, e.g. within a city). autofill-address-district = المنطقة -# Used in GB, NO, SE +# Used in United Kingdom (GB), Norway (NO), Sweden (SE) as as secondary address information (2 levels below the country level). autofill-address-post-town = أنزل -# Used in AU as Address Level-2 and used in ZZ as Sublocality. +# Used in Australia (AU) as as secondary address information (below the country level). +# Used for international addresses as sublocality (civil entity below a locality, e.g. within a city). autofill-address-suburb = الضاحية -## address-level-1 names +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding autofill-address-province = المقاطعة autofill-address-state = الولاية autofill-address-county = البلد -# Used in BB, JM +# Used in Barbados (BB), Jamaica (JM) as primary address information (1 level below the country level). autofill-address-parish = الأبرشيّة -# Used in JP +# Used in Japan (JP) as primary address information (1 level below the country level). autofill-address-prefecture = المحافظة -# Used in HK +# Used in Honk Kong (HK) as primary address information (1 level below the country level). autofill-address-area = المنطقة -# Used in KR +# Used in Korea (KO) as primary address information (1 level below the country level). autofill-address-do-si = Do/Si -# Used in NI, CO +# Used in Nicaragua (NI), Colombia (CO) as primary address information (1 level below the country level). autofill-address-department = القِسم -# Used in AE +# Used in United Arab Emirates (AE) as primary address information (1 level below the country level). autofill-address-emirate = الإمارة -# Used in RU and UA +# Used in Russia (RU), Ukraine (UA) as primary address information (1 level below the country level). autofill-address-oblast = المقاطعة -## Postal code name types +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding -# Used in IN +# Postal code field used in India (IN). autofill-address-pin = الرمز البريدي autofill-address-postal-code = الرمز البريدي +# Postal code field. autofill-address-zip = الرمز البريدي -# Used in IE +# Postal code field used in Ireland (IE). autofill-address-eircode = الرمز البريدي الأيرلندي ## diff -Nru firefox-esr-140.5.0esr/l10n-ar/browser/browser/preferences/preferences.ftl firefox-esr-140.6.0esr/l10n-ar/browser/browser/preferences/preferences.ftl --- firefox-esr-140.5.0esr/l10n-ar/browser/browser/preferences/preferences.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ar/browser/browser/preferences/preferences.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -13,6 +13,8 @@ .label = أخبر مواقع الويب بعدم بيع بياناتي أو مشاركتها .accesskey = ش non-technical-privacy-header = تفضيلات خصوصية الموقع +non-technical-privacy-label = + .aria-label = { non-technical-privacy-header } # Do not translate. # "Global Privacy Control" or "GPC" are a web platform feature name and abbreviation # included to facilitate power-user search of the about:preferences page. @@ -68,6 +70,8 @@ .key = f close-button = .aria-label = أغلق +do-not-track-removal2 = + .label = لم نعد ندعم إشارة "لا تتعقبني" ## Browser Restart Dialog @@ -123,6 +127,10 @@ always-check-default = .label = تحقق دائمًا من كون { -brand-short-name } متصفّحك المبدئي .accesskey = د +is-default-browser = + .message = ‏{ -brand-short-name } هو المتصفح المبدئي حاليًا +is-not-default-browser = + .message = ‏{ -brand-short-name } ليس المتصفح المبدئي حاليًا is-default = ‏{ -brand-short-name } هو المتصفح المبدئي حاليًا is-not-default = ‏{ -brand-short-name } ليس المتصفح المبدئي حاليًا set-as-my-default-browser = @@ -249,6 +257,15 @@ language-and-appearance-header = اللغة و المظهر preferences-web-appearance-header = مظهر الموقع preferences-web-appearance-description = تكيف بعض المواقع مخطط ألوانها بناء على تفضيلاتك. أختر مخطط الألوان الذي تريد إستخدامه لهذه المواقع. +preferences-web-appearance-choice-auto2 = + .label = تلقائي + .title = غيّر تلقائيًا خلفيات الموقع و المحتوى بناءً على إعدادات نظامك و سمة { -brand-short-name }. +preferences-web-appearance-choice-light2 = + .label = فاتح + .title = استخدم مظهرًا فاتحً لخلفيات موقع الويب ومحتواه. +preferences-web-appearance-choice-dark2 = + .label = داكن + .title = استخدم مظهرًا داكنًا لخلفيات موقع الويب ومحتواه. preferences-web-appearance-choice-auto = تلقائي preferences-web-appearance-choice-light = فاتح preferences-web-appearance-choice-dark = داكن @@ -268,6 +285,8 @@ # system colors. preferences-web-appearance-override-warning3 = .message = إعدادات التحكم في التباين لديك تتغلب على مظهر موقع الوِب. +preferences-web-appearance-link = + .label = أدِر سمات { -brand-short-name } في الامتدادات والسمات # This can appear when using windows HCM or "Override colors: always" without # system colors. preferences-web-appearance-override-warning = إن اختياراتك للألوان تهيمن على مظهر موقع الويب. إدارة الألوان @@ -340,6 +359,11 @@ ## General Section - Files and Applications files-and-applications-title = الملفات و التطبيقات +downloads-header-2 = + .label = التّنزيلات +download-save-where-2 = + .label = احفظ الملفّات في + .accesskey = ظ download-header = التّنزيلات download-save-where = احفظ الملفّات في .accesskey = ظ @@ -511,6 +535,8 @@ ## General Section - Browsing browsing-title = التّصفّح +browsing-group-label = + .aria-label = التّصفّح browsing-use-autoscroll = .label = استخدم اللّف الآلي .accesskey = ف @@ -565,7 +591,7 @@ home-new-windows-tabs-header = النوافذ و الألسنة الجديدة home-new-windows-tabs-description2 = اختر ما تراه عندما تفتح صفحة البداية و النوافذ و الألسنة الجديدة. -## Home Section - Home Page Customization +## Custom Homepage subpage home-homepage-mode-label = صفحة البداية و النوافذ الجديدة home-newtabs-mode-label = الألسنة الجديدة @@ -716,6 +742,9 @@ search-add-engine = .label = أضِف .accesskey = ض +search-edit-engine = + .label = حرّر + .accesskey = ر search-find-more-link = اعثر على المزيد من محركات البحث # This warning is displayed when the chosen keyword is already in use # ('Duplicate' is an adjective) @@ -724,6 +753,7 @@ # $name (string) - Name of a search engine. search-keyword-warning-engine = لقد اخترت كلمة مفتاحية يستخدمها ”{ $name }“ حاليا. من فضلك اختر واحدة أخرى. search-keyword-warning-bookmark = لقد اخترت كلمة مفتاحية تستخدمها علامة حاليا. من فضلك اختر واحدة أخرى. +remove-engine-remove = أزِل remove-addon-engine-alert = لإزالة محرك البحث هذا،أزِل الإضافة المرتبطة به. ## Containers Section @@ -731,6 +761,8 @@ containers-back-button2 = .aria-label = عُد إلى الإعدادات containers-header = الألسنة الحاوية +containers-section-header = + .heading = الألسنة الحاوية containers-add-button = .label = أضف حاوية جديدة .accesskey = ح @@ -888,6 +920,14 @@ ## The device name controls. sync-device-name-header = اسم الجهاز +# Variables: +# $placeholder (string) - The placeholder text of the input +sync-device-name-input = + .aria-label = اسم الجهاز + .placeholder = { $placeholder } +sync-device-name-change-2 = + .label = غيّر اسم الجهاز + .accesskey = ه sync-device-name-change = .label = غيّر اسم الجهاز… .accesskey = ه @@ -1032,6 +1072,10 @@ .label = لا يتذكر التأريخ أبدًا history-remember-option-custom = .label = يستخدم إعدادات مخصصة للتأريخ +history-remember-description2 = + .description = سيتذكر { -brand-short-name } تأريخ التصفح، و التنزيلات، و الاستمارات، و البحث. +history-dontremember-description2 = + .description = سيستخدم { -brand-short-name } نفس إعدادات التصفح الخاص، بحيث لن يحتفظ بأيّ تأريخ لتصفحك للوب. history-remember-description = سيتذكر { -brand-short-name } تأريخ التصفح، و التنزيلات، و الاستمارات، و البحث. history-dontremember-description = سيستخدم { -brand-short-name } نفس إعدادات التصفح الخاص، بحيث لن يحتفظ بأيّ تأريخ لتصفحك للوب. history-private-browsing-permanent = @@ -1065,6 +1109,8 @@ sitedata-delete-on-close = .label = احذف الكعكات وبيانات المواقع عندما ينغلق { -brand-short-name } .accesskey = ذ +sitedata-delete-on-close-private-browsing3 = + .message = استنادًا إلى إعدادات التأريخ لديك، يحذف { -brand-short-name } الكعكات وبيانات الموقع من جلستك عند إغلاق المتصفح. sitedata-delete-on-close-private-browsing = في وضع التصفح الخاص الدائم، تُمسح الكعكات وبيانات المواقع متى ما أُغلق { -brand-short-name }. sitedata-delete-on-close-private-browsing2 = استنادًا إلى إعدادات التأريخ لديك، يحذف { -brand-short-name } الكعكات وبيانات الموقع من جلستك عند إغلاق المتصفح. sitedata-allow-cookies-option = @@ -1089,6 +1135,9 @@ .label = كل الكعكات بين المواقع (قد تتسبب بتعطُل المواقع) sitedata-option-block-all = .label = كل الكعكات (يمكن أن تعطب المواقع هكذا) +sitedata-clear2 = + .label = امحُ بيانات التصفح + .accesskey = م sitedata-clear = .label = امسح البيانات… .accesskey = س @@ -1153,6 +1202,10 @@ addressbar-locbar-showtrendingsuggestions-option = .label = أظهر اقتراحات البحث المُتداولة .accesskey = ه +# Toggles whether suggestions are obtained from Firefox Suggest or not (local or online). +addressbar-locbar-suggest-all-option = + .label = اقتراحات من { -brand-short-name } +addressbar-locbar-suggest-all-option-desc = احصل على اقتراحات من الوِب تتعلق ببحثك. # Nonsponsored suggestions refers to Firefox Suggest suggestions like Wikipedia. addressbar-locbar-suggest-nonsponsored-option = .label = اقتراحات من { -brand-short-name } @@ -1298,6 +1351,8 @@ permissions-notification-pause = .label = ألبِث التنبيهات حتى يُعاد تشغيل { -brand-short-name } .accesskey = ث +permissions-autoplay2 = + .label = التشغيل التلقائي permissions-autoplay = التشغيل التلقائي permissions-autoplay-settings = .label = الإعدادات… @@ -1317,6 +1372,16 @@ permissions-addon-exceptions = .label = الاستثناءات… .accesskey = ث +permissions-location2 = + .label = المكان +permissions-xr2 = + .label = الواقع الافتراضي +permissions-camera2 = + .label = الكاميرا +permissions-microphone2 = + .label = الميكروفون +permissions-notification2 = + .label = التنبيهات ## Privacy Section - Data Collection @@ -1404,6 +1469,7 @@ certs-thirdparty-toggle = .label = اسمح بأن يثق { -brand-short-name } تلقائيا بشهادات جذر من أطراف خارجية تقوم بتثبيتها .accesskey = ه +certs-devices-enable-fips = مكّن FIPS space-alert-over-5gb-settings-button = .label = افتح الإعدادات .accesskey = ف @@ -1413,6 +1479,9 @@ ## Privacy Section - HTTPS-Only httpsonly-header = وضع HTTPS فقط +httpsonly-label = + .aria-label = { httpsonly-header } + .description = يسمح فقط بالاتصالات الآمنة بمواقع الوب. سيسأل { -brand-short-name } قبل الاتصال بشكل غير آمن. httpsonly-description3 = يسمح فقط بالاتصالات الآمنة بمواقع الوب. سيسأل { -brand-short-name } قبل الاتصال بشكل غير آمن. httpsonly-learn-more2 = كيف يعمل HTTPS-Only httpsonly-description = يقدّم بروتوكول HTTPS اتصالًا آمنًا ومعمًى بين { -brand-short-name } والمواقع التي تزورها. تدعم أغلب المواقع HTTPS، ولو فعّلت وضع ”HTTPS فقط“ فسيُرقّي { -brand-short-name } كل الاتصالات لتكون ببروتوكول HTTPS. diff -Nru firefox-esr-140.5.0esr/l10n-ar/browser/browser/profiles.ftl firefox-esr-140.6.0esr/l10n-ar/browser/browser/profiles.ftl --- firefox-esr-140.5.0esr/l10n-ar/browser/browser/profiles.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ar/browser/browser/profiles.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -76,6 +76,6 @@ custom-avatar-alt = .alt = صورة رمزية مخصّصة -## Labels for default avatar icons +## Tooltips for default avatar icons custom-avatar = صورة رمزية مخصّصة diff -Nru firefox-esr-140.5.0esr/l10n-ar/browser/browser/sidebar.ftl firefox-esr-140.6.0esr/l10n-ar/browser/browser/sidebar.ftl --- firefox-esr-140.5.0esr/l10n-ar/browser/browser/sidebar.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ar/browser/browser/sidebar.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -2,6 +2,10 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. +menu-view-genai-chat = + .label = روبوت دردشة بالذكاء الاصطناعي +menu-view-contextual-password-manager = + .label = كلمات السر sidebar-options-menu-button = .title = افتح القائمة @@ -17,10 +21,22 @@ .heading = { DATETIME($date, dateStyle: "full") } sidebar-history-date-prev-month = .heading = { DATETIME($date, month: "long", year: "numeric") } +# When history is sorted by site, this heading is used in place of a domain, in +# order to group sites that do not come from an outside host. +# For example, this would be the heading for all file:/// URLs in history. +sidebar-history-site-localhost = + .heading = (ملفات محلية) sidebar-history-delete = .title = احذف من التأريخ sidebar-history-clear = .label = امسح التأريخ +sidebar-history-sort-by-heading = رتّب حسب: +sidebar-history-sort-option-date = + .label = التاريخ +sidebar-history-sort-option-site = + .label = الموقع +sidebar-history-sort-option-date-and-site = + .label = التاريخ والموقع ## Labels for sidebar search @@ -40,10 +56,13 @@ .label = ألسنة العمودية sidebar-settings = .label = إعدادات الشريط الجانبي +sidebar-hide-tabs-and-sidebar = + .label = أخفِ الألسنة والشريط الجانبي sidebar-show-on-the-right = .label = انقل الشريط الجانبي إلى اليمين sidebar-show-on-the-left = .label = انقل الشريط الجانبي إلى اليسار +sidebar-manage-extensions = أدِر الامتدادات ## Labels for sidebar context menu items @@ -53,6 +72,10 @@ .label = أزِل الامتداد sidebar-context-menu-report-extension = .label = أبلِغ عن الامتداد +sidebar-context-menu-open-in-tab = + .label = افتح في لسان جديد +sidebar-context-menu-open-in-container-tab = + .label = افتح في لسانٍ حاوٍ جديد sidebar-context-menu-open-in-window = .label = افتح في نافذة جديدة sidebar-context-menu-open-in-private-window = @@ -61,17 +84,30 @@ .label = علّم اللسان… sidebar-context-menu-copy-link = .label = انسخ الرابط +sidebar-context-menu-hide-sidebar = + .label = أخفِ الشريط الجانبي +sidebar-context-menu-enable-vertical-tabs = + .label = فعِّل الألسنة العمودية sidebar-context-menu-customize-sidebar = .label = تخصيص الشريط الجانبي # Variables: # $deviceName (String) - The name of the device the user is closing a tab for sidebar-context-menu-close-remote-tab = .label = أغلق اللسان على { $deviceName } +sidebar-context-menu-remove-extension2 = + .label = أزل من { -brand-short-name } sidebar-context-menu-unpin-extension = .label = أزل من الشريط الجانبي +## Labels for sidebar history context menu items + +sidebar-history-context-menu-bookmark-page = + .label = علِّم الصفحة… + ## Labels for sidebar menu items. +sidebar-menu-genai-chat-label = + .label = روبوت دردشة بالذكاء الاصطناعي sidebar-menu-history-label = .label = التأريخ sidebar-menu-synced-tabs-label = @@ -80,6 +116,10 @@ .label = العلامات sidebar-menu-customize-label = .label = تخصيص الشريط الجانبي +sidebar-menu-contextual-password-manager-label = + .label = كلمات السر +sidebar-menu-more-tools-label = + .label = المزيد من الأدوات ## Tooltips for sidebar menu items. @@ -100,6 +140,15 @@ # $shortcut (String) - The OS specific keyboard shortcut. sidebar-menu-close-bookmarks-tooltip = أغلق العلامات ({ $shortcut }) +## Tooltips displayed over the AI chatbot icon. +## Variables: +## $shortcut (String) - The OS specific keyboard shortcut. +## $provider (String) - The name of the AI chatbot provider (if available). + +sidebar-menu-open-ai-chatbot-provider-tooltip = افتح { $provider } ({ $shortcut }) +sidebar-menu-close-ai-chatbot-tooltip-generic = أغلق روبوت المحادثة AI ({ $shortcut }) +sidebar-menu-close-ai-chatbot-provider-tooltip = أغلق { $provider } ({ $shortcut }) + ## Headings for sidebar menu panels. sidebar-menu-customize-header = @@ -108,6 +157,8 @@ .heading = تاريخ sidebar-menu-syncedtabs-header = .heading = ألسنة من أجهزة أخرى +sidebar-menu-cpm-header = + .heading = كلمات السر sidebar-panel-header-close-button = .tooltiptext = أغلق diff -Nru firefox-esr-140.5.0esr/l10n-ar/browser/browser/tabbrowser.ftl firefox-esr-140.6.0esr/l10n-ar/browser/browser/tabbrowser.ftl --- firefox-esr-140.5.0esr/l10n-ar/browser/browser/tabbrowser.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ar/browser/browser/tabbrowser.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -261,9 +261,7 @@ .label = { $tabGroupName } .tooltiptext = { $tabGroupName } — النافذة الحالية -## Variables: -## $tabGroupName (String): The name of the tab group. Defaults to the value -## of tab-group-name-default. +## tab-group-editor-title-create = أنشئ مجموعة لسان tab-group-editor-title-edit = أدر مجموعة لسان diff -Nru firefox-esr-140.5.0esr/l10n-ar/browser/browser/webauthnDialog.ftl firefox-esr-140.6.0esr/l10n-ar/browser/browser/webauthnDialog.ftl --- firefox-esr-140.5.0esr/l10n-ar/browser/browser/webauthnDialog.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ar/browser/browser/webauthnDialog.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -11,3 +11,42 @@ # $domain (String): the domain of the site. webauthn-specific-passkey-label = مفتاح السر لـ{ $domain } webauthn-uv-invalid-short-prompt = فشل التحقق من المستخدم. أعد المحاولة + +## WebAuthn prompts + +# Variables: +# $hostname (String): the origin (website) asking for the security key. +webauthn-user-presence-prompt = المس مفتاح الأمن للمواصلة مع { $hostname }. +# The website is asking for extended information about your +# hardware authenticator that shouldn't be generally necessary. Permitting +# this is safe if you only use one account at this website. If you have +# multiple accounts at this website, and you use the same hardware +# authenticator, then the website could link those accounts together. +# And this is true even if you use a different profile / browser (or even Tor +# Browser). To avoid this, you should use different hardware authenticators +# for different accounts on this website. +# Variables: +# $hostname (String): the origin (website) asking for the extended information. +webauthn-register-direct-prompt = يطلب الموقع { $hostname } معلومات إضافية تخصّ مفتاح الأمان لديك، وهذا قد يؤثر على خصوصيتك. +webauthn-register-direct-prompt-hint = يمكن لمتصفّح { -brand-short-name } تجهيل هذه المعلومات، ولكن قد يؤدي ذلك إلى رفض الموقع لهذا المفتاح. يمكنك إعادة المحاولة لو حدث ذلك. +# Variables: +# $hostname (String): the origin (website) for which an account needs to be selected. +webauthn-select-sign-result-prompt = عُثر على حسابات متعددة لـ { $hostname }. حدّد الحساب الذي تريد استخدامه أو إلغاؤه. +# Variables: +# $hostname (String): the origin (website) for which a device needs to be selected. +webauthn-select-device-prompt = عُثر على أجهزة متعددة لـ { $hostname }. يُرجى اختيار جهاز واحد. +# Variables: +# $hostname (String): the origin (website) for which user verification failed. +webauthn-device-blocked-prompt = فشل التحقق من المستخدم على { $hostname }. لم يتبقَّ أي محاولات، وقد قُفل جهازك بسبب إدخال رقم تعريف شخصي خاطئ مراتٍ عديدة. يحتاج الجهاز إلى إعادة ضبط. +# Variables: +# $hostname (String): the origin (website) for which user verification failed. +webauthn-pin-auth-blocked-prompt = فشل التحقق من المستخدم على { $hostname }. كانت هناك محاولات فاشلة كثيرة متتالية، وحُظر استثاق رقم التعريف الشخصي (PIN) مؤقتًا. يحتاج جهازك إلى إعادة تشغيل (فصله وإعادة توصيله). +# Variables: +# $hostname (String): the origin (website) for which user verification failed. +webauthn-pin-not-set-prompt = فشل التحقق من المستخدم على { $hostname }. قد تحتاج إلى تعيين رقم تعريف شخصي (PIN) على جهازك. +# Variables: +# $hostname (String): the origin (website) for which user verification failed. +webauthn-uv-blocked-prompt = فشل التحقق من المستخدم على { $hostname }. كان هناك عدد كبير جدًا من المحاولات الفاشلة، وحُظرت طريقة التحقق المُدمجة من المستخدم. +webauthn-already-registered-prompt = هذا الجهاز مُسجَّل مُسبقًا. جرِّب جهازًا آخر. +webauthn-cancel = ألغِ + .accesskey = غ diff -Nru firefox-esr-140.5.0esr/l10n-ar/browser/chrome/browser/browser.properties firefox-esr-140.6.0esr/l10n-ar/browser/chrome/browser/browser.properties --- firefox-esr-140.5.0esr/l10n-ar/browser/chrome/browser/browser.properties 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ar/browser/chrome/browser/browser.properties 2025-11-21 02:32:14.000000000 +0000 @@ -321,13 +321,11 @@ # localhost and localnetwork permission UI # %S is replaced by the origin of the website localhost.allowWithSite = تسمح لـ%S بالوصول إلى التطبيقات والخدمات الأخرى على هذا الجهاز؟ -localhost.remember = لا تسأل ثانيا لهذا الموقع localhost.allowlabel = اسمح localhost.blocklabel = احجب # local-network permission UI # %S is replaced by the origin of the website localNetwork.allowWithSite = تسمح لـ%S بالوصول إلى التطبيقات والخدمات على الأجهزة المتصلة بشبكتك المحلية؟ -localNetwork.remember = لا تسأل ثانيا لهذا الموقع localNetwork.allowLabel = اسمح localNetwork.blockLabel = احجب # Phishing/Malware Notification Bar. diff -Nru firefox-esr-140.5.0esr/l10n-ar/devtools/client/toolbox-options.ftl firefox-esr-140.6.0esr/l10n-ar/devtools/client/toolbox-options.ftl --- firefox-esr-140.5.0esr/l10n-ar/devtools/client/toolbox-options.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ar/devtools/client/toolbox-options.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -89,5 +89,5 @@ options-enable-remote-label = فعِّل التنقيح البعيد # The label for checkbox that toggles the service workers testing over HTTP on or off. options-enable-service-workers-http-label = فعّل عمّال الخدمة عبر HTTP (عندما يكون صندوق الأدوات مفتوحا) -# The message shown for settings that trigger page reload +# The message shown for settings that trigger page reload and will only apply to the current session options-context-triggers-page-refresh = * في الجلسة الحالية فقط، تُعيد تحميل الصفحة diff -Nru firefox-esr-140.5.0esr/l10n-ar/toolkit/toolkit/global/browser-utils.ftl firefox-esr-140.6.0esr/l10n-ar/toolkit/toolkit/global/browser-utils.ftl --- firefox-esr-140.5.0esr/l10n-ar/toolkit/toolkit/global/browser-utils.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ar/toolkit/toolkit/global/browser-utils.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -4,6 +4,12 @@ # Used for data: URLs where we don't have any useful origin information browser-utils-url-data = (بيانات) +# Variables: +# $scheme (string) - URI scheme like jar: about: +browser-utils-url-scheme = مورد { $scheme } +# Special case of done-scheme for file: +# This is used as an eTLD replacement for local files, so make it lower case +browser-utils-file-scheme = ملف محلي # Used for extension URLs # Variables: # $extension (string) - Name of the extension that generated the URL diff -Nru firefox-esr-140.5.0esr/l10n-ar/toolkit/toolkit/global/datetimepicker.ftl firefox-esr-140.6.0esr/l10n-ar/toolkit/toolkit/global/datetimepicker.ftl --- firefox-esr-140.5.0esr/l10n-ar/toolkit/toolkit/global/datetimepicker.ftl 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ar/toolkit/toolkit/global/datetimepicker.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -0,0 +1,69 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +### Datetimepicker - Dialog for default HTML's + + +## These labels are used by screenreaders and other assistive technology +## to indicate the purpose of this picker as both a calendar with a month-year +## and a time selection dialog for HTML's + + +## These labels are used by screenreaders and other assistive technology +## to indicate the purpose of a date picker calendar and a month-year selection +## spinner dialogs for HTML's default + +date-picker-label = + .aria-label = اختر تاريخًا +date-spinner-label = + .aria-label = اختر شهرًا وسنة + +## Text of the clear button + +date-picker-clear-button = امسح + +## These labels are used by screenreaders and other assistive technology +## to indicate the purpose of buttons that leaf through months of a calendar + +date-picker-previous = + .aria-label = الشهر الماضي +date-picker-next = + .aria-label = الشهر المقبل + +## These labels are used by screenreaders and other assistive technology +## to indicate the type of a value/unit that is being selected within a +## Month/Year date spinner dialogs on a datepicker calendar dialog + +date-spinner-month = + .aria-label = الشهر +date-spinner-year = + .aria-label = السنة + +## These labels are used by screenreaders and other assistive technology +## to indicate the purpose of buttons that leaf through either months +## or years of a Month/Year date spinner on a datepicker calendar dialog + +date-spinner-month-previous = + .aria-label = الشهر الماضي +date-spinner-month-next = + .aria-label = الشهر المقبل +date-spinner-year-previous = + .aria-label = السنة الماضية +date-spinner-year-next = + .aria-label = السنة المقبلة + +## This label is used by screenreaders and other assistive technology +## to indicate the purpose of a time picker dialog +## for HTML's default + + +## These labels are used by screenreaders and other assistive technology +## to indicate the type of a value/unit that is being selected within a +## time spinners on a timepicker dialog + + +## These labels are used by screenreaders and other assistive technology +## to indicate the purpose of buttons that leaf through time units of a spinner on a timepicker dialog + diff -Nru firefox-esr-140.5.0esr/l10n-ar/toolkit/toolkit/global/mozButton.ftl firefox-esr-140.6.0esr/l10n-ar/toolkit/toolkit/global/mozButton.ftl --- firefox-esr-140.5.0esr/l10n-ar/toolkit/toolkit/global/mozButton.ftl 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ar/toolkit/toolkit/global/mozButton.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -0,0 +1,7 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +moz-button-more-options = + .title = خيارات أكثر + .aria-label = خيارات أكثر diff -Nru firefox-esr-140.5.0esr/l10n-ar/toolkit/toolkit/neterror/certError.ftl firefox-esr-140.6.0esr/l10n-ar/toolkit/toolkit/neterror/certError.ftl --- firefox-esr-140.5.0esr/l10n-ar/toolkit/toolkit/neterror/certError.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ar/toolkit/toolkit/neterror/certError.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -164,6 +164,7 @@ unknownSocketType-title = استجابة غير متوقعة من الخادوم nssFailure2-title = فشل الاتصال الآمن csp-xfo-error-title = لا يمكن أن يعرض { -brand-short-name } الصفحة +corruptedContentErrorv2-title = خطأ محتوى فاسد corruptedContentError-title = خطأ محتوى فاسد sslv3Used-title = تعذّر الاتصال بأمان inadequateSecurityError-title = اتّصالك غير آمن diff -Nru firefox-esr-140.5.0esr/l10n-ast/browser/browser/preferences/colors.ftl firefox-esr-140.6.0esr/l10n-ast/browser/browser/preferences/colors.ftl --- firefox-esr-140.5.0esr/l10n-ast/browser/browser/preferences/colors.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ast/browser/browser/preferences/colors.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -13,6 +13,12 @@ colors-page-override-option-never = .label = Enxamás colors-text-and-background = Testu y fondu +colors-text = + .label = Testu + .accesskey = T +colors-text-background = + .label = Fondu + .accesskey = F colors-text-header = Testu .accesskey = T colors-background = Fondu @@ -24,6 +30,12 @@ .label = Sorrayar los enllaces .accesskey = S colors-links-header = Color de los enllaces +colors-links-unvisited = + .label = Enllaces ensin visitar + .accesskey = L +colors-links-visited = + .label = Enllaces visitaos + .accesskey = V colors-unvisited-links = Enllaces ensin visitar .accesskey = L colors-visited-links = Enllaces visitaos diff -Nru firefox-esr-140.5.0esr/l10n-ast/browser/browser/preferences/formAutofill.ftl firefox-esr-140.6.0esr/l10n-ast/browser/browser/preferences/formAutofill.ftl --- firefox-esr-140.5.0esr/l10n-ast/browser/browser/preferences/formAutofill.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ast/browser/browser/preferences/formAutofill.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -12,34 +12,45 @@ autofill-manage-add-button = Amestar… autofill-manage-edit-button = Editar… -## The address capture doorhanger +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding autofill-address-organization = Organización -## address-level-3 (Sublocality) names +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding autofill-address-island = Islla -## address-level-2 names +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding autofill-address-city = Ciudá -# Used in HK, SD, SY, TR as Address Level-2 and used in KR as Sublocality. +# Used in Hong Kong (HK), Sudan (SD), Syria (SY), Türkiye (TR) as as secondary address information (2 levels below the country level). +# Used in Korea as sublocality (civil entity below a locality, e.g. within a city). autofill-address-district = Distritu -## address-level-1 names +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding autofill-address-province = Provincia autofill-address-state = Estáu -# Used in JP +# Used in Japan (JP) as primary address information (1 level below the country level). autofill-address-prefecture = Perfeutura -# Used in HK +# Used in Honk Kong (HK) as primary address information (1 level below the country level). autofill-address-area = Área -# Used in NI, CO +# Used in Nicaragua (NI), Colombia (CO) as primary address information (1 level below the country level). autofill-address-department = Departamentu -# Used in AE +# Used in United Arab Emirates (AE) as primary address information (1 level below the country level). autofill-address-emirate = Emiratu -## Postal code name types +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding autofill-address-postal-code = Códigu postal diff -Nru firefox-esr-140.5.0esr/l10n-ast/browser/browser/preferences/preferences.ftl firefox-esr-140.6.0esr/l10n-ast/browser/browser/preferences/preferences.ftl --- firefox-esr-140.5.0esr/l10n-ast/browser/browser/preferences/preferences.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ast/browser/browser/preferences/preferences.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -96,6 +96,10 @@ always-check-default = .label = Comprobar siempres si { -brand-short-name } ye'l restolador predetermináu .accesskey = i +is-default-browser = + .message = Anguaño { -brand-short-name } ye'l restolador web predetermináu +is-not-default-browser = + .message = Anguaño { -brand-short-name } nun ye'l restolador web predetermináu is-default = Anguaño { -brand-short-name } ye'l restolador web predetermináu is-not-default = Anguaño { -brand-short-name } nun ye'l restolador web predetermináu set-as-my-default-browser = @@ -210,6 +214,11 @@ ## General Section - Files and Applications files-and-applications-title = Ficheros y aplicaciones +downloads-header-2 = + .label = Descargues +download-save-where-2 = + .label = Guardar los ficheros en + .accesskey = d download-header = Descargues download-save-where = Guardar los ficheros en .accesskey = d @@ -407,7 +416,7 @@ home-new-windows-tabs-header = Ventanes y llingüetes nueves home-new-windows-tabs-description2 = Escueyi lo que ves cuando abres la páxina d'aniciu, ventanes nueves y llingüetes nueves. -## Home Section - Home Page Customization +## Custom Homepage subpage home-homepage-mode-label = Páxina d'aniciu y ventanes nueves home-newtabs-mode-label = Llingüetes nueves @@ -539,6 +548,8 @@ ## Containers Section containers-header = Contenedores de llingüetes +containers-section-header = + .heading = Contenedores de llingüetes containers-add-button = .label = Amestar un contenedor nuevu .accesskey = A @@ -664,6 +675,14 @@ ## The device name controls. sync-device-name-header = Nome del preséu +# Variables: +# $placeholder (string) - The placeholder text of the input +sync-device-name-input = + .aria-label = Nome del preséu + .placeholder = { $placeholder } +sync-device-name-change-2 = + .label = Camudar el nome del preséu + .accesskey = m sync-device-name-change = .label = Camudar el nome del preséu… .accesskey = m @@ -761,6 +780,10 @@ .label = Dexar de recordar l'historial history-remember-option-custom = .label = Usar unos axustes personalizaos pal historial +history-remember-description2 = + .description = { -brand-short-name } va recordar los historiales de restolar, descargues, formularios y busques. +history-dontremember-description2 = + .description = { -brand-short-name } va usar los mesmos axustes del restolar en privao y nun va recordar nengún historial mentanto restoles la web. history-remember-description = { -brand-short-name } va recordar los historiales de restolar, descargues, formularios y busques. history-dontremember-description = { -brand-short-name } va usar los mesmos axustes del restolar en privao y nun va recordar nengún historial mentanto restoles la web. history-private-browsing-permanent = @@ -951,6 +974,8 @@ permissions-notification-pause = .label = Posar los avisos hasta reaniciar { -brand-short-name } .accesskey = v +permissions-autoplay2 = + .label = Reproducción automática permissions-autoplay = Reproducción automática permissions-autoplay-settings = .label = Axustes... @@ -970,6 +995,16 @@ permissions-addon-exceptions = .label = Esceiciones… .accesskey = E +permissions-location2 = + .label = Allugamientu +permissions-xr2 = + .label = Realidá virtual +permissions-camera2 = + .label = Cámara +permissions-microphone2 = + .label = Micrófonu +permissions-notification2 = + .label = Avisos ## Privacy Section - Data Collection diff -Nru firefox-esr-140.5.0esr/l10n-ast/browser/browser/webauthnDialog.ftl firefox-esr-140.6.0esr/l10n-ast/browser/browser/webauthnDialog.ftl --- firefox-esr-140.5.0esr/l10n-ast/browser/browser/webauthnDialog.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ast/browser/browser/webauthnDialog.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -2,3 +2,8 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. + +## WebAuthn prompts + +webauthn-cancel = Encaboxar + .accesskey = E diff -Nru firefox-esr-140.5.0esr/l10n-ast/devtools/client/toolbox-options.ftl firefox-esr-140.6.0esr/l10n-ast/devtools/client/toolbox-options.ftl --- firefox-esr-140.5.0esr/l10n-ast/devtools/client/toolbox-options.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ast/devtools/client/toolbox-options.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -41,5 +41,5 @@ options-disable-javascript-label = Desactivar JavaScript * # The label for checkbox that toggles remote debugging, i.e. the devtools.debugger.remote-enabled preference options-enable-remote-label = Activar la depuración remota -# The message shown for settings that trigger page reload +# The message shown for settings that trigger page reload and will only apply to the current session options-context-triggers-page-refresh = * Namás na sesión actual, recarga la páxina diff -Nru firefox-esr-140.5.0esr/l10n-ast/toolkit/toolkit/global/browser-utils.ftl firefox-esr-140.6.0esr/l10n-ast/toolkit/toolkit/global/browser-utils.ftl --- firefox-esr-140.5.0esr/l10n-ast/toolkit/toolkit/global/browser-utils.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-ast/toolkit/toolkit/global/browser-utils.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -2,3 +2,9 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. +# Variables: +# $scheme (string) - URI scheme like jar: about: +browser-utils-url-scheme = Recursu { $scheme } +# Special case of done-scheme for file: +# This is used as an eTLD replacement for local files, so make it lower case +browser-utils-file-scheme = ficheru llocal diff -Nru firefox-esr-140.5.0esr/l10n-az/browser/browser/preferences/colors.ftl firefox-esr-140.6.0esr/l10n-az/browser/browser/preferences/colors.ftl --- firefox-esr-140.5.0esr/l10n-az/browser/browser/preferences/colors.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-az/browser/browser/preferences/colors.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -13,6 +13,12 @@ colors-page-override-option-never = .label = Heç vaxt colors-text-and-background = Mətn və arxa fon +colors-text = + .label = Mətn + .accesskey = T +colors-text-background = + .label = Arxa fon + .accesskey = r colors-text-header = Mətn .accesskey = T colors-background = Arxa fon @@ -24,6 +30,12 @@ .label = Bağlantıların altını xətlə .accesskey = ı colors-links-header = Keçid rəngləri +colors-links-unvisited = + .label = Baxılmamış keçidlər + .accesskey = L +colors-links-visited = + .label = Baxılmış keçidlər + .accesskey = B colors-unvisited-links = Baxılmamış keçidlər .accesskey = L colors-visited-links = Baxılmış keçidlər diff -Nru firefox-esr-140.5.0esr/l10n-az/browser/browser/preferences/formAutofill.ftl firefox-esr-140.6.0esr/l10n-az/browser/browser/preferences/formAutofill.ftl --- firefox-esr-140.5.0esr/l10n-az/browser/browser/preferences/formAutofill.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-az/browser/browser/preferences/formAutofill.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -15,7 +15,9 @@ autofill-manage-add-button = Əlavə et… autofill-manage-edit-button = Düzəlt… -## The address capture doorhanger +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding # The dialog title for editing addresses in browser preferences. autofill-edit-address-title = Ünvanı düzəlt @@ -25,53 +27,64 @@ autofill-address-organization = Təşkilat autofill-address-street = Küçə ünvanı -## address-level-3 (Sublocality) names +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding -# Used in IR, MX +# Used in Iran (IR), Mexico (MX) as sublocality (civil entity below a locality, e.g. within a city). autofill-address-neighborhood = Qonşuluq -# Used in MY +# Used in Malaysia (MY) as sublocality (civil entity below a locality, e.g. within a city). autofill-address-village-township = Qəsəbə və ya Şəhərcik autofill-address-island = Ada -# Used in IE +# Used in Ireland (IE) as sublocality (civil entity below a locality, e.g. within a city). autofill-address-townland = Townland -## address-level-2 names +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding autofill-address-city = Şəhər -# Used in HK, SD, SY, TR as Address Level-2 and used in KR as Sublocality. +# Used in Hong Kong (HK), Sudan (SD), Syria (SY), Türkiye (TR) as as secondary address information (2 levels below the country level). +# Used in Korea as sublocality (civil entity below a locality, e.g. within a city). autofill-address-district = Rayon -# Used in GB, NO, SE +# Used in United Kingdom (GB), Norway (NO), Sweden (SE) as as secondary address information (2 levels below the country level). autofill-address-post-town = Poçt şəhərciyi -# Used in AU as Address Level-2 and used in ZZ as Sublocality. +# Used in Australia (AU) as as secondary address information (below the country level). +# Used for international addresses as sublocality (civil entity below a locality, e.g. within a city). autofill-address-suburb = Şəhər kənarı -## address-level-1 names +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding autofill-address-province = Əyalət autofill-address-state = Bölgə autofill-address-county = Dairə -# Used in BB, JM +# Used in Barbados (BB), Jamaica (JM) as primary address information (1 level below the country level). autofill-address-parish = Qraflıq -# Used in JP +# Used in Japan (JP) as primary address information (1 level below the country level). autofill-address-prefecture = Prefektura -# Used in HK +# Used in Honk Kong (HK) as primary address information (1 level below the country level). autofill-address-area = Ərazi -# Used in KR +# Used in Korea (KO) as primary address information (1 level below the country level). autofill-address-do-si = Do/Si -# Used in NI, CO +# Used in Nicaragua (NI), Colombia (CO) as primary address information (1 level below the country level). autofill-address-department = Şöbə -# Used in AE +# Used in United Arab Emirates (AE) as primary address information (1 level below the country level). autofill-address-emirate = Əmirlik -# Used in RU and UA +# Used in Russia (RU), Ukraine (UA) as primary address information (1 level below the country level). autofill-address-oblast = Oblast -## Postal code name types +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding -# Used in IN +# Postal code field used in India (IN). autofill-address-pin = Pin autofill-address-postal-code = Poçt kodu +# Postal code field. autofill-address-zip = ZIP kodu -# Used in IE +# Postal code field used in Ireland (IE). autofill-address-eircode = Eircode ## diff -Nru firefox-esr-140.5.0esr/l10n-az/browser/browser/preferences/preferences.ftl firefox-esr-140.6.0esr/l10n-az/browser/browser/preferences/preferences.ftl --- firefox-esr-140.5.0esr/l10n-az/browser/browser/preferences/preferences.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-az/browser/browser/preferences/preferences.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -65,6 +65,10 @@ always-check-default = .label = { -brand-short-name } səyyahının əsas səyyahınız olub olmadığını hər dəfə yoxla .accesskey = y +is-default-browser = + .message = { -brand-short-name } hazırda əsas səyyahınızdır +is-not-default-browser = + .message = { -brand-short-name } əsas səyyahınız deyil is-default = { -brand-short-name } hazırda əsas səyyahınızdır is-not-default = { -brand-short-name } əsas səyyahınız deyil set-as-my-default-browser = @@ -159,6 +163,11 @@ ## General Section - Files and Applications files-and-applications-title = Fayllar və Tətbiqlər +downloads-header-2 = + .label = Endirilənlər +download-save-where-2 = + .label = Faylların saxlandığı yer + .accesskey = y download-header = Endirilənlər download-save-where = Faylların saxlandığı yer .accesskey = y @@ -318,7 +327,7 @@ home-new-windows-tabs-header = Yeni Pəncərələr və Vərəqlər home-new-windows-tabs-description2 = Ev səhifənizi, yeni pəncərə və vərəqləri açdığınızda nə gördüyünüzü seçin. -## Home Section - Home Page Customization +## Custom Homepage subpage home-homepage-mode-label = Ev səhifəsi və yeni pəncərələr home-newtabs-mode-label = Yeni vərəqlər @@ -429,6 +438,8 @@ ## Containers Section containers-header = Konteyner Vərəqlər +containers-section-header = + .heading = Konteyner Vərəqlər containers-add-button = .label = Yeni konteyner əlavə et .accesskey = A @@ -505,6 +516,14 @@ ## The device name controls. sync-device-name-header = Cihaz Adı +# Variables: +# $placeholder (string) - The placeholder text of the input +sync-device-name-input = + .aria-label = Cihaz Adı + .placeholder = { $placeholder } +sync-device-name-change-2 = + .label = Cihaz adını dəyişdir + .accesskey = h sync-device-name-change = .label = Cihaz adını dəyişdir… .accesskey = h @@ -576,6 +595,10 @@ .label = Tarixçəni heç vaxt xatırlama history-remember-option-custom = .label = Tarixçə üçün fərdi tənzimləmələri işlət +history-remember-description2 = + .description = { -brand-short-name } səyahət, endirmə, forma və axtarış tarixçənizi yadda saxlayacaq. +history-dontremember-description2 = + .description = { -brand-short-name } gizli baxışdakı nizamlamalardan istifadə edəcək və siz Web-də gəzərkən keçmişlə bağlı heçnə xatırlamayacaq. history-remember-description = { -brand-short-name } səyahət, endirmə, forma və axtarış tarixçənizi yadda saxlayacaq. history-dontremember-description = { -brand-short-name } gizli baxışdakı nizamlamalardan istifadə edəcək və siz Web-də gəzərkən keçmişlə bağlı heçnə xatırlamayacaq. history-private-browsing-permanent = @@ -719,6 +742,14 @@ permissions-addon-exceptions = .label = İstisnalar… .accesskey = s +permissions-location2 = + .label = Mövqe +permissions-camera2 = + .label = Kamera +permissions-microphone2 = + .label = Mikrofon +permissions-notification2 = + .label = Bildirişlər ## Privacy Section - Data Collection @@ -767,6 +798,7 @@ certs-devices = .label = Təhlükəsizlik cihazları… .accesskey = T +certs-devices-enable-fips = FIPS aktivləşdir ## The following strings are used in the Download section of settings diff -Nru firefox-esr-140.5.0esr/l10n-az/browser/browser/webauthnDialog.ftl firefox-esr-140.6.0esr/l10n-az/browser/browser/webauthnDialog.ftl --- firefox-esr-140.5.0esr/l10n-az/browser/browser/webauthnDialog.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-az/browser/browser/webauthnDialog.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -2,3 +2,8 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. + +## WebAuthn prompts + +webauthn-cancel = Ləğv et + .accesskey = c diff -Nru firefox-esr-140.5.0esr/l10n-az/devtools/client/toolbox-options.ftl firefox-esr-140.6.0esr/l10n-az/devtools/client/toolbox-options.ftl --- firefox-esr-140.5.0esr/l10n-az/devtools/client/toolbox-options.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-az/devtools/client/toolbox-options.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -51,5 +51,5 @@ options-enable-chrome-label = Səyyah chrome-u və əlavə sazlama alət qutularını aktivləşdir # The label for checkbox that toggles remote debugging, i.e. the devtools.debugger.remote-enabled preference options-enable-remote-label = Uzaq sazlamanı aktivləşdir -# The message shown for settings that trigger page reload +# The message shown for settings that trigger page reload and will only apply to the current session options-context-triggers-page-refresh = * Ancaq bu sessiyada, səhifəni yenidən yükləyir diff -Nru firefox-esr-140.5.0esr/l10n-az/toolkit/toolkit/global/browser-utils.ftl firefox-esr-140.6.0esr/l10n-az/toolkit/toolkit/global/browser-utils.ftl --- firefox-esr-140.5.0esr/l10n-az/toolkit/toolkit/global/browser-utils.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-az/toolkit/toolkit/global/browser-utils.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -2,3 +2,9 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. +# Variables: +# $scheme (string) - URI scheme like jar: about: +browser-utils-url-scheme = { $scheme } qaynağı +# Special case of done-scheme for file: +# This is used as an eTLD replacement for local files, so make it lower case +browser-utils-file-scheme = lokal fayl diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/addonNotifications.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/addonNotifications.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/addonNotifications.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/addonNotifications.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -144,6 +144,7 @@ # $appVersion (String): the application version. addon-install-error-incompatible = { $addonName } не можа быць усталяваны, бо ён несумяшчальны з { -brand-short-name }{ $appVersion }. addon-install-error-hard-blocked = { $addonName } парушае палітыку Mozilla і не можа быць усталяваны ў { -brand-short-name }. +addon-install-error-soft-blocked2 = { $addonName } мае абмежаванні і не можа быць усталяваны ў { -brand-short-name }. addon-install-error-blocklisted = { $addonName } не можа быць усталяваны, бо ёсць вялікая рызыка, што ён выкліча праблемы ўстойлівасці або бяспекі. addon-install-error-soft-blocked = { $addonName } парушае палітыку Mozilla і не можа быць усталяваны ў { -brand-short-name }. # Enterprise policies is a feature aimed at system administrators who want to deploy custom settings for Firefox. diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/appmenu.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/appmenu.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/appmenu.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/appmenu.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -294,6 +294,10 @@ appmenuitem-vpn-title = { -mozilla-vpn-brand-name } appmenuitem-vpn-description = Абараніце сваю актыўнасць у інтэрнэце appmenu-services-header = Мае сэрвісы +# "Mozilla" is intentionally hardcoded to prevent forks from replacing it +# with their own vendor name, since these tools are created and maintained by +# Mozilla. +appmenu-other-protection-header2 = Паспрабуйце іншыя ахоўныя сродкі ад Mozilla: appmenu-other-protection-header = Паспрабуйце іншыя ахоўныя сродкі ад { -vendor-short-name }: ## Profiles panel @@ -301,6 +305,8 @@ appmenu-other-profiles = Іншыя профілі appmenu-manage-profiles = .label = Кіраванне профілямі +appmenu-copy-profile = + .label = Скапіяваць гэты профіль appmenu-create-profile = .label = Новы профіль appmenu-edit-profile = diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/backupSettings.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/backupSettings.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/backupSettings.ftl 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/backupSettings.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -0,0 +1,252 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# This string is used to name the folder that users will save backups to. +# "Restore" is an action and intended for prompting users to select this folder +# when following backup restoration steps. Please only include characters that +# can be used for folders. Invalid characters will be automatically stripped out +# or replaced with underscores. +backup-folder-name = Аднавіць { -brand-product-name } +# This string is used for the generated file that will be stored within the +# backup-folder-name folder. It will have the profile name and an encoding of +# the backup date appended to it, followed by `.html`. Please only include +# characters that can be used for filenames. Invalid characters will be +# automatically stripped out or replaced with underscores. +# +# This is an example of what the final filename might look like after the +# profile name and backup date are appended to it: +# +# FirefoxBackup_default_20240606-1830.html +backup-file-name = Рэзервовае капіяванне { -brand-product-name } +settings-data-backup-header = Рэзервовая капіяванне +settings-data-backup-toggle = Кіраванне рэзервовым капіяваннем +settings-data-backup-toggle-on = Уключыць рэзервовае капіяванне +settings-data-backup-toggle-off = Выключыць рэзервовае капіяванне +settings-data-backup-trigger-button = Зрабіць рэзервовую копію зараз +settings-data-backup-in-progress-button = Ідзе рэзервовае капіяванне… +settings-data-backup-in-progress-message = + .message = Ідзе рэзервовае капіяванне… +settings-data-backup-scheduled-backups-on = Рэзервовае капіяванне: УКЛ. +settings-data-backup-scheduled-backups-off = Рэзервовае капіяванне: ВЫКЛ. +settings-data-backup-scheduled-backups-description = Аўтаматычна абараніце свае закладкі, гісторыю і іншыя дадзеныя. Падрабязней +settings-data-backup-last-backup-date = Апошняя рэзервовая копія: { DATETIME($date, timeStyle: "short") }, { DATETIME($date, dateStyle: "short") } +# "Location" refers to the folder where backups are being written to. +settings-data-backup-last-backup-location = Месцазнаходжанне +settings-data-backup-last-backup-location-show-in-folder = Паказаць у папцы +settings-data-backup-last-backup-location-edit = Рэдагаваць… +settings-data-create-backup-error = Здарылася памылка пры стварэнні рэзервовай копіі ў { DATETIME($date, timeStyle: "short") }, { DATETIME($date, dateStyle: "short") } +settings-sensitive-data-encryption-description = Зрабіце рэзервовую копію пароляў і спосабаў аплаты, а таксама абараніце ўсе свае дадзеныя з дапамогай шыфравання. +# Variables: +# $fileName (String) - The file name of the last backup that was created. +settings-data-backup-last-backup-filename = Назва файла: { $fileName } +settings-data-backup-restore-header = Аднаўленне дадзеных + +## These strings are shown under the header if scheduled backups are disabled. + +settings-data-backup-scheduled-backups-off-restore-description = Выкарыстайце рэзервовую копію { -brand-product-name } з іншай прылады, каб аднавіць свае дадзеныя. +settings-data-backup-scheduled-backups-off-restore-choose = Выбраць файл рэзервовай копіі… + +## These strings are shown under the header if scheduled backups are enabled. + +settings-data-backup-scheduled-backups-on-restore-description = Аднавіце свае дадзеныя { -brand-product-name } з моманту іх апошняга рэзервовага капіявання. +settings-data-backup-scheduled-backups-on-restore-choose = Аднавіць… +settings-data-toggle-encryption-label = Зрабіць рэзервовую копію канфідэнцыяльных дадзеных +settings-data-toggle-encryption-support-link = Падрабязней +settings-data-change-password = Змяніць пароль… + +## These strings are displayed in a modal when users want to turn on scheduled backups. + +turn-on-scheduled-backups-header = Уключыць рэзервовае капіяванне +turn-on-scheduled-backups-description = { -brand-short-name } будзе ствараць здымак вашых дадзеных кожныя 24 гадзіны. Вы можаце аднавіць іх, калі ўзнікне праблема або вы атрымаеце новую прыладу. +turn-on-scheduled-backups-support-link = Што знойдзецца ў рэзервовай копіі? +# "Location" refers to the save location or a folder where users want backups stored. +turn-on-scheduled-backups-location-label = Месцазнаходжанне +# Variables: +# $recommendedFolder (String) - Name of the recommended folder for saving backups +turn-on-scheduled-backups-location-default-folder = + .value = { $recommendedFolder } (рэкамендуецца) +turn-on-scheduled-backups-location-choose-button = + { PLATFORM() -> + [macos] Выбраць… + *[other] Праглядзець… + } +turn-on-scheduled-backups-encryption-label = Зрабіць рэзервовую копію канфідэнцыяльных дадзеных +turn-on-scheduled-backups-encryption-create-password-label = Пароль +# Users will be prompted to re-type a password, to ensure that the password is entered correctly. +turn-on-scheduled-backups-encryption-repeat-password-label = Паўтарыце пароль +turn-on-scheduled-backups-cancel-button = Скасаваць +turn-on-scheduled-backups-confirm-button = Уключыць рэзервовае капіяванне +# Tell the user there was an error accessing the user's selected backup +# folder. The folder may be invalid or inaccessible. +turn-on-scheduled-backups-error-file-system = Узнікла праблема з выбранай вамі папкай рэзервовай копіі. Выберыце іншую папку і паспрабуйце зноў. +backup-error-file-system = У часе рэзервовага капіявання { -brand-short-name } узнікла праблема з выбранай вамі папкай рэзервовай копіі. + +## These strings are displayed in a modal when users want to turn off scheduled backups. + +turn-off-scheduled-backups-header = Выключыць рэзервовае капіяванне? +turn-off-scheduled-backups-description = Гэта таксама выдаліць усе вашы рэзервовыя копіі дадзеных. Гэта нельга адмяніць. +turn-off-scheduled-backups-support-link = Падрабязней +turn-off-scheduled-backups-cancel-button = Скасаваць +turn-off-scheduled-backups-confirm-button = Выключыць і выдаліць рэзервовую копію + +## These strings are displayed in a modal when users want restore from a backup. + +restore-from-backup-header = Аднаўленне дадзеных +# Variables: +# $date (string) - Date to be formatted based on locale +restore-from-backup-description-with-metadata = + .message = Гэта заменіць усе вашы цяперашнія дадзеныя { -brand-short-name } рэзервовай копіяй з { DATETIME($date, timeStyle: "short", dateStyle: "short") }. +restore-from-backup-support-link = + .message = Што будзе адноўлена? +restore-from-backup-no-backup-file-link = Праблемы з пошукам рэзервовай копіі? +restore-from-backup-filepicker-label = Файл рэзервовай копіі +restore-from-backup-filepicker-title = Выберыце файл рэзервовай копіі: +restore-from-backup-file-choose-button = + { PLATFORM() -> + [macos] Выбраць… + *[other] Агляд… + } +restore-from-backup-password-label = Пароль +restore-from-backup-password-description = Гэта разблакуе вашу зашыфраваную рэзервовую копію. +restore-from-backup-cancel-button = Скасаваць +restore-from-backup-confirm-button = Аднавіць і перазапусціць +restore-from-backup-restoring-button = Аднаўленне… + +## These strings are displayed in a small error message bar in the settings +## menu if there was an error when trying to restore a backed up profile + +# User is not authorized to restore a particular backup file, usually because +# the backup file is encrypted and the user provided a recovery password that +# was different than the password the user configured for their backup file +backup-service-error-incorrect-password = Няправільны пароль. Усё яшчэ праблемы? +# The backup file (or specific data files within the backup file) could not be +# loaded and parsed correctly, most likely due to data corruption of the +# backup file itself +backup-service-error-corrupt-file = + .heading = З гэтым файлам нешта не так + .message = Узнікла праблема з вашым файлам рэзервовай копіі. Выберыце іншы файл і паспрабуйце зноў. +# The backup file cannot be restored. The currently running application may +# be too old and may not support features in the backed up profile. +# Alternatively, the backup file may be too old and some of the feature in +# the backed up profile may no longer be supported. +backup-service-error-unsupported-version = + .heading = З гэтым файлам нешта не так + .message = Файл, які вы выбралі, не сумяшчальны з гэтай версіяй { -brand-short-name }. Выберыце іншы файл і паспрабуйце зноў. +# The backup file cannot be restored. The currently running application is not +# the same application that created the backup file (e.g. Firefox cannot +# restore a Thunderbird profile backup). +backup-service-error-unsupported-application = + .heading = З гэтым файлам нешта не так + .message = Файл, які вы выбралі, не быў створаны { -brand-short-name }. Выберыце іншы файл і паспрабуйце зноў. +# Recovery from backup did not succeed. Potential causes could be file system +# errors, internal code errors, decryption errors, etc. +backup-service-error-recovery-failed = + .heading = { -brand-short-name } не ўдалося аднавіць + .message = Перазапусціце { -brand-short-name } і паспрабуйце зноў аднавіцца з рэзервовай копіі. +# There was some error in the backup service but we don't have a more specific +# idea of what went wrong +backup-service-error-went-wrong2 = + .heading = Гм, узнікла праблема з рэзервовым капіяваннем. + .message = Паспрабуйце зноў праз некалькі хвілін. +# There was some error in the backup service but we don't have a more specific +# idea of what went wrong +backup-service-error-went-wrong = + .heading = Нешта пайшло не так + .message = Узнікла праблема з працэсам стварэння рэзервовай копіі { -brand-short-name }. Калі ласка, паспрабуйце зноў або перазапусціце { -brand-short-name }. + +## These strings are displayed in a modal when users want to enable encryption or change the password for an existing backup. + +enable-backup-encryption-header = Зрабіць рэзервовую копію канфідэнцыяльных дадзеных +enable-backup-encryption-support-link = Падрабязней +enable-backup-encryption-create-password-label = Пароль +# Users will be prompted to re-type a password, to ensure that the password is entered correctly. +enable-backup-encryption-repeat-password-label = Паўтарыце пароль +enable-backup-encryption-cancel-button = Скасаваць +enable-backup-encryption-confirm-button = Захаваць +change-backup-encryption-header = Змяніць пароль рэзервовага капіявання + +## These strings are displayed in a tooltip showing what requirements are met while creating a password. + +password-rules-header = Патрабаванні да пароля +password-rules-length-description = Мінімум 8 знакаў +password-rules-email-description = Не ваш адрас электроннай пошты +password-rules-disclaimer = Заставайцеся ў бяспецы — не выкарыстоўвайце паролі паўторна. Даведайцеся больш пра стварэнне надзейных пароляў. +password-validity-has-email = Не можа быць адрасам электроннай пошты +password-validity-do-not-match = Паролі не супадаюць + +## These strings are only used for assistive technologies, like screen readers, in the password requirements tooltip. + +password-rules-a11y-success = + .alt = Поспех +password-rules-a11y-warning = + .alt = Папярэджанне + +## These strings are displayed in a modal when users want to disable encryption for an existing backup. + +disable-backup-encryption-header = Зняць абарону паролем +disable-backup-encryption-description2 = Рэзервовыя копіі вашых захаваных пароляў і спосабаў аплаты таксама больш не будуць стварацца. +disable-backup-encryption-support-link = Што знойдзецца ў рэзервовай копіі? +disable-backup-encryption-cancel-button = Адмена +disable-backup-encryption-confirm-button = Выдаліць пароль + +## These strings are used to tell users when errors occur when using +## the backup system + +backup-error-password-requirements = Ваш пароль не адпавядае патрабаванням. Паспрабуйце іншы пароль. +# This error message will be shown to the user when something went wrong with +# the backup system but we do not have any more specific idea of what went +# wrong. This message invites the user to try an action again because there +# is a chance that the action will succeed if retried. +backup-error-retry = Нешта пайшло не так. Калі ласка, паспрабуйце зноў. + +## These strings are inserted into the generated single-file backup archive. +## The single-file backup archive is a specially-crafted, static HTML file +## that is placed within a user specified directory (the Documents folder by +## default) within a folder labelled with the "backup-folder-name" string. + +backup-file-header = { -brand-short-name } гатовы да аднаўлення +backup-file-title = Аднавіць { -brand-short-name } +backup-file-intro = Вярніцеся да аглядання і аднавіце ўсе свае закладкі, гісторыю і іншыя дадзеныя. Падрабязней +backup-file-path-label = Файл рэзервовай копіі: +backup-file-encryption-state-label = Зашыфраваны: +backup-file-encryption-state-value-encrypted = Так +backup-file-encryption-state-value-not-encrypted = Не +backup-file-creation-device-label = Прылада: +backup-file-creation-date-label = Створаны: +# Variables: +# $date (Datetime) - The date the backup was created +backup-file-creation-date-value = { DATETIME($date, timeStyle: "short") }, { DATETIME($date, dateStyle: "short") } +backup-file-how-to-restore-header = Як аднавіць: +# The ☰ character is intended as a visual icon representing the Firefox +# application menu. +backup-file-moz-browser-restore-step-1 = Адкрыйце меню праграмы ☰ і перайдзіце ў Налады > Сінхранізацыя +backup-file-moz-browser-restore-step-2 = Націсніце «Выбраць файл рэзервовай копіі» і абярыце гэты файл +backup-file-moz-browser-restore-step-3 = Перазапусціце { -brand-short-name } пры запыце +backup-file-other-browser-restore-step-1 = Сцягнуць і ўсталяваць { -brand-short-name } +backup-file-download-moz-browser-button = Сцягнуць +# The ☰ character is intended as a visual icon representing the Firefox +# application menu. +backup-file-other-browser-restore-step-2 = Запусціць { -brand-short-name }, адкрыць меню праграмы ☰ і перайсці ў Налады > Сінхранізацыя +backup-file-other-browser-restore-step-3 = Націснуць «Выбраць файл рэзервовай копіі» і абраць гэты файл +backup-file-other-browser-restore-step-4 = Перазапусціць { -brand-short-name } пры запыце + +## These strings are used in the about:restore and about:welcome pages +## These pages guide the user on browser startup to help them restore a backup +## if they have one on their file system. + +# Variables: +# $numberOfOtherBackupsFound (number) - The number of backups found other than the displayed default backup +other-backup-files-founds = + { $numberOfOtherBackupsFound -> + [one] Заўвага: Знойдзен { $numberOfOtherBackupsFound } іншы файл рэзервовай копіі + [few] Заўвага: Знойдзены { $numberOfOtherBackupsFound } іншыя файлы рэзервовай копіі + *[many] Заўвага: Знойдзена { $numberOfOtherBackupsFound } іншых файлаў рэзервовых копій + } +# Variables: +# $date (Datetime) - The date the backup was created +# $machineName (String) - Name of the machine that the backup was created on. +backup-file-creation-date-and-device = Створана { DATETIME($date, year: "numeric", month: "numeric", day: "numeric") } на { $machineName } +backup-file-restore-file-validation-error = З гэтым файлам нешта не так. Паспрабуйце выбраць іншы файл. Усё яшчэ ёсць праблемы? +restore-from-backup-filepicker-input = + .placeholder = Файл не выбраны diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/browser.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/browser.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/browser.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/browser.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -120,6 +120,12 @@ # This is only used on macOS; on other OSes we use the full private window # title (so including the brand name) as a suffix browser-main-private-suffix-for-content = Прыватнае агляданне +popups-infobar-dont-show-message2 = + .label = Не паказваць гэтае паведамленне, калі блакуюцца выплыўныя вокны або староннія перанакіраванні + .accesskey = в +edit-popup-settings2 = + .label = Кіраваць наладамі выплыўных акон і перанакіравання на староннія сайты + .accesskey = ь ## @@ -266,6 +272,8 @@ .tooltiptext = Вы заблакавалі гэтаму сайту магчымасць бачыць ваш экран. urlbar-persistent-storage-blocked = .tooltiptext = Вы заблакавалі захоўванне звестак для гэтага сайта. +urlbar-popup-blocked2 = + .tooltiptext = Вы заблакавалі выплыўныя вокны і староннія перанакіраванні для гэтага сайта. urlbar-popup-blocked = .tooltiptext = Вы заблакавалі выплыўныя вокны для гэтага сайта. urlbar-autoplay-media-blocked = @@ -1180,6 +1188,9 @@ popups-infobar-block = .label = Блакаваць выплыўныя вокны з { $uriHost } .accesskey = Д +popups-infobar-allow2 = + .label = Дазволіць выплыўныя вокны і перанакіраванні на староннія сайты для { $uriHost } + .accesskey = з ## @@ -1344,6 +1355,7 @@ # $useremail (String): user email that will receive messages firefox-relay-offer-what-relay-provides = Усе электронныя лісты, адпраўленыя на вашы электронныя маскі, будуць перанакіраваны на { $useremail } (калі вы не вырашыце іх заблакаваць). firefox-relay-offer-legal-notice = Націскаючы «Выкарыстоўваць маску электроннай пошты», вы згаджаецеся з і . +firefox-relay-offer-legal-notice-1 = Рэгіструючыся і ствараючы маску электроннай пошты, вы згаджаецеся з  і . ## Add-on Pop-up Notifications @@ -1371,6 +1383,16 @@ [few] { -brand-short-name } прадухіліў адкрыццё { $popupCount } выплыўных вокнаў з гэтага сайта. *[many] { -brand-short-name } прадухіліў адкрыццё { $popupCount } выплыўных вокнаў з гэтага сайта. } +# Variables: +# $popupCount (Number): the number of pop-ups blocked. +redirect-warning-with-popup-message = + { $popupCount -> + [0] { -brand-short-name } перашкодзіў гэтаму сайту перанакіроўваць карыстальнікаў. + [1] { -brand-short-name } перашкодзіў гэтаму сайту адкрыць выплыўные акно і перанакіроўваць карыстальнікаў. + [one] { -brand-short-name } перашкодзіў гэтаму сайту адкрыць { $popupCount } выплыўнае акно і перанакіроўваць карыстальнікаў. + [few] { -brand-short-name } перашкодзіў гэтаму сайту адкрыць { $popupCount } выплыўныя акна і перанакіроўваць карыстальнікаў. + *[many] { -brand-short-name } перашкодзіў гэтаму сайту адкрыць { $popupCount } выплыўных акон і перанакіроўваць карыстальнікаў. + } # The singular form is left out for English, since the number of blocked pop-ups is always greater than 1. # Variables: # $popupCount (Number): the number of pop-ups blocked. @@ -1380,6 +1402,14 @@ [few] { -brand-short-name } прадухіліў больш за { $popupCount } выплыўныя акны з гэтага сайта. *[many] { -brand-short-name } прадухіліў больш за { $popupCount } выплыўных акон з гэтага сайта. } +# Variables: +# $popupCount (Number): the number of pop-ups blocked. +popup-warning-exceeded-with-redirect-message = + { $popupCount -> + [one] { -brand-short-name } перашкодзіў гэтаму сайту адкрыць больш за { $popupCount } выплыўные акно і перанакіроўваць карыстальнікаў. + [few] { -brand-short-name } перашкодзіў гэтаму сайту адкрыць больш за { $popupCount } выплыўныя акна і перанакіроўваць карыстальнікаў. + *[many] { -brand-short-name } перашкодзіў гэтаму сайту адкрыць больш за { $popupCount } выплыўных акон і перанакіроўваць карыстальнікаў. + } popup-warning-button = .label = { PLATFORM() -> @@ -1395,6 +1425,10 @@ # $popupURI (String): the URI for the pop-up window popup-show-popup-menuitem = .label = Паказаць '{ $popupURI }' +# Variables: +# $redirectURI (String): the URI for the redirect +popup-trigger-redirect-menuitem = + .label = Паказаць “{ $redirectURI }” ## File-picker crash notification ("FilePickerCrashed.sys.mjs") @@ -1424,7 +1458,7 @@ .label = Скончыць наладку .tooltiptext = Завяршыць наладжванне { -brand-short-name } -## The urlbar trust panel +## The urlbar trust icon & panel trustpanel-etp-label-enabled = Узмоцненая ахова ад сачэння ўключана trustpanel-etp-label-disabled = Узмоцненая ахова ад сачэння выключана @@ -1441,7 +1475,9 @@ trustpanel-connection-label-secure = Бяспечнае злучэнне trustpanel-connection-label-insecure = Злучэнне не бяспечнае trustpanel-header-enabled = { -brand-product-name } напагатове -trustpanel-description-enabled = Вы абаронены. Калі мы што-небудзь заўважым, паведамім вам. +trustpanel-description-enabled2 = Вы абаронены. Калі мы што-небудзь заўважым, паведамім вам. +trustpanel-header-enabled-insecure = Будзьце асцярожныя на гэтым сайце +trustpanel-description-enabled-insecure = { -brand-product-name } заўважыў нешта падазронае. trustpanel-header-disabled = Вы адключылі ахову trustpanel-description-disabled = { -brand-product-name } не на варце. Прапануем зноў уключыць ахову. trustpanel-clear-cookies-button = Выдаліць кукі і дадзеныя сайтаў @@ -1457,8 +1493,6 @@ # $host (String): the hostname of the site that is being displayed. trustpanel-site-information-header = .title = Ахова злучэння з { $host } -trustpanel-connection-secure = Вы бяспечна злучаны з гэтым сайтам. -trustpanel-connection-not-secure = Вы не злучаны бяспечна з гэтым сайтам. trustpanel-siteinformation-morelink = Больш інфармацыі пра сайт trustpanel-blocker-see-all = Глядзець усё # Variables @@ -1466,6 +1500,13 @@ trustpanel-blocker-header = .title = Ахова ад сачэння для { $host } +## The urlbar trust icon & panel + +# LOCALIZATION NOTE (trustpanel-urlbar-notsecure-label): +# Keep this string as short as possible, this is displayed in the URL bar +# use a synonym for "safe" or "private" if "secure" is too long. +urlbar-trust-icon-notsecure-label = Не абаронена + ## Variables ## $count (String): the number of trackers blocked. @@ -1518,7 +1559,6 @@ [few] { -brand-product-name } дазволіў { $count } трэкеры сацыяльных сетак *[many] { -brand-product-name } дазволіў { $count } трэкераў сацыяльных сетак } -trustpanel-social-tracking-tab-list-header = Гэтыя сайты спрабуюць вас асачыць: trustpanel-tracking-cookies-blocking-tab-header = { $count -> [one] { -brand-product-name } заблакаваў { $count } міжсайтавы кукі сачэння @@ -1531,7 +1571,6 @@ [few] { -brand-product-name } дазволіў { $count } міжсайтавыя кукі сачэння *[many] { -brand-product-name } дазволіў { $count } міжсайтавых кукі сачэння } -trustpanel-tracking-cookies-tab-list-header = Гэтыя сайты спрабуюць вас асачыць: trustpanel-tracking-content-blocking-tab-header = { $count -> [one] { -brand-product-name } заблакаваў { $count } трэкер diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/browserContext.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/browserContext.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/browserContext.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/browserContext.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -272,8 +272,9 @@ .accesskey = а # Variables # $engine (String) - Name of the search engine that will perform the search. -main-context-menu-visual-search = +main-context-menu-visual-search-2 = .label = Пошук выявы з дапамогай { $engine } + .accesskey = у main-context-menu-video-save-as = .label = Захаваць відэа як… .accesskey = в diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/contextual-manager.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/contextual-manager.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/contextual-manager.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/contextual-manager.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -170,10 +170,6 @@ contextual-manager-passwords-update-password-success-button = Гатова contextual-manager-passwords-update-username-success-heading-3 = .heading = Імя карыстальніка захавана -contextual-manager-passwords-update-username-success-heading-2 = - .heading = Імя карыстальніка дададзена -contextual-manager-passwords-update-username-success-heading = - .heading = Імя карыстальніка захавана # Message to confirm successful removal of a password/passwords. # $total (number) - Total number of passwords contextual-manager-passwords-delete-password-success-heading = diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/customkeys.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/customkeys.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/customkeys.ftl 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/customkeys.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -0,0 +1,37 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +customkeys-title = Спалучэнні клавіш +customkeys-search = Пошук: +customkeys-change = Змяніць +customkeys-reset = Скінуць +customkeys-clear = Ачысціць +customkeys-new-key = Націсніце новую клавішу: +customkeys-reset-all = Скінуць усе спалучэнні клавіш да прадвызначаных значэнняў +# Variables +# $conflict (string) - The title of the conflicting shortcut. +customkeys-conflict-confirm = Гэта клавіша ўжо прызначана для { $conflict }. Хочаце замяніць? +customkeys-reset-all-confirm = Вы ўпэўненыя, што хочаце скінуць усе спалучэнні клавіш да прадвызначаных значэнняў? +customkeys-history-reopen-tab = Паўторна адкрыць апошнюю закрытую картку +customkeys-history-reopen-window = Паўторна адкрыць апошняе закрытае акно +customkeys-dev-tools = Прылады вэб-распрацоўшчыка +customkeys-dev-inspector = Інспектар DOM і стыляў +customkeys-dev-webconsole = Кансоль Сеціва +customkeys-dev-debugger = Адладчык JavaScript +customkeys-dev-network = Манітор сеткі +customkeys-dev-style = Рэдактар стыляў +customkeys-dev-performance = Прадукцыйнасць +customkeys-dev-storage = Інспектар сховішча +customkeys-dev-dom = DOM +customkeys-dev-accessibility = Даступнасць +customkeys-dev-profiler-toggle = Запусціць/спыніць прафіляванне прадукцыйнасці +customkeys-dev-profiler-capture = Захапіць профіль прадукцыйнасці +customkeys-category-navigation = Навігацыя +customkeys-nav-back = Назад +customkeys-nav-forward = Наперад +customkeys-nav-home = Дадому +customkeys-nav-reload = Перазагрузіць +customkeys-nav-reload-skip-cache = Перазагрузіць (перавызначыць кэш) +customkeys-nav-stop = Спыніць +customkeys-caution-message = Гэтая функцыя эксперыментальная і можа не працаваць належным чынам. diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/featureCallout.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/featureCallout.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/featureCallout.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/featureCallout.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -112,6 +112,19 @@ # Opens Mozilla accounts sign-up page fxa-adoption-passwords-primary-button-label = Зарэгістравацца +## Taskbar Tabs callout strings + +taskbar-tabs-social-callout-title = Трымайце свае любімыя стужкі на панэлі задач +taskbar-tabs-social-callout-subtitle = Запускайце свае сацыяльныя сеткі як праграму ў аптымізаваным акне, абароненым { -brand-short-name }. +taskbar-tabs-chat-callout-title = Чат з панэлі задач +taskbar-tabs-chat-callout-subtitle = Запускайце свае сайты чатаў як праграму ў аптымізаваным акне, абароненым { -brand-short-name }. +taskbar-tabs-email-callout-title = Трымайце сваю электронную пошту ў панэлі задач +taskbar-tabs-email-callout-subtitle = Запускайце вэб-пошту як звычайную праграму ў аптымізаваным акне, абароненым { -brand-short-name }. +taskbar-tabs-media-callout-title = Вяртайцеся да струменевай трансляцыі з панэлі задач +taskbar-tabs-media-callout-subtitle = Запускайце свае стрымінгавыя сайты як праграму ў аптымізаваным акне, абароненым { -brand-short-name }. +taskbar-tabs-value-prop-callout-title = Дадаць гэты сайт на панэль задач +taskbar-tabs-value-prop-callout-subtitle = Запускайце яго ў асобным акне і спрошчаным інтэрфейсе адным націскам мышы. + ## Windows 10 EoS Sync messages group 1 callouts windows-10-eos-sync-urgency-title-1 = Не страцьце ўсё, што вы захавалі, пры пераходзе на Windows 11. @@ -131,6 +144,15 @@ windows-10-eos-sync-tour-subtitle-1 = Перацягніце адну картку на іншую, каб стварыць групу і падтрымаць парадак. windows-10-eos-sync-tour-title-2 = Будзьце арганізаванымі для Windows 11. windows-10-eos-sync-tour-subtitle-2 = Сінхранізуйце свае закладкі, паролі і налады, каб стварыць іх рэзервовую копію перад пераключэннем. +windows-10-eos-sync-split-dismiss-button-show-fewer-option = + .label = Паказваць менш рэкамендацый +windows-10-eos-sync-dismiss-button-label = Адхіліць +windows-10-eos-sync-callout-primary-advance-button-label = Далей + +## Link Preview Onboarding message callout strings + +link-preview-onboarding-callout-title = Новае: Націсніце і ўтрымлівайце для папярэдняга прагляду спасылак +link-preview-onboarding-callout-description = Каб вырашыць, ці варта націскаць на спасылку, паглядзіце кароткае апісанне, час чытання і іншыя звесткі. Таксама даступна па націсканні правай кнопкай мышы. ## Sidebar Strings diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/firefoxRelay.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/firefoxRelay.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/firefoxRelay.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/firefoxRelay.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -20,10 +20,12 @@ .accesskey = К # This is followed, on a new line, by firefox-relay-opt-in-subtitle-1 firefox-relay-opt-in-title-1 = Абараніце свой адрас электроннай пошты: +firefox-relay-opt-in-title-2 = Атрымайце бясплатную маску электроннай пошты # This is preceded by firefox-relay-opt-in-title-1 (on a different line), which # ends with a colon. You might need to adapt the capitalization of this string. firefox-relay-opt-in-subtitle-1 = Выкарыстоўвайце маску электроннай пошты { -relay-brand-name } firefox-relay-use-mask-title-1 = Выкарыстаць маску электроннай пошты +firefox-relay-opt-in-subtitle-2 = Абараніце сваю паштовую скрыню ад спаму firefox-relay-use-mask-title = Выкарыстоўвайце маску электроннай пошты { -relay-brand-name } # This is followed, on a new line, by firefox-relay-opt-in-subtitle-a firefox-relay-opt-in-title-a = Прадухіліце спам з дапамогай бясплатнай маскі электроннай пошты @@ -74,6 +76,7 @@ firefox-relay-and-fxa-popup-notification-header-with-domain = Атрымайце бясплатную маску электроннай пошты firefox-relay-and-fxa-popup-notification-first-sentence-with-domain = Абараніце сваю паштовую скрыню ад спаму, выкарыстоўваючы бясплатную , каб схаваць свой сапраўдны адрас. Электронныя лісты з па-ранейшаму будуць прыходзіць у вашу паштовую скрыню, але ваша электронная пошта будзе схаванай. firefox-relay-and-fxa-popup-notification-first-sentence = Абараніце сваю паштовую скрыню ад спаму, выкарыстоўваючы бясплатную , каб схаваць свой сапраўдны адрас. Электронныя лісты з па-ранейшаму будуць прыходзіць у вашу паштовую скрыню, але ваша электронная пошта будзе схаванай. +firefox-relay-offer-why-to-use-relay-1 = Абараніце сваю паштовую скрыню ад спаму, выкарыстоўваючы бясплатную , каб схаваць свой сапраўдны адрас. Электронныя лісты з па-ранейшаму будуць прыходзіць у вашу паштовую скрыню, але ваша электронная пошта будзе схаванай. firefox-relay-and-fxa-popup-notification-second-sentence-with-domain = Спачатку зарэгіструйцеся або ўвайдзіце ў свой уліковы запіс, каб выкарыстоўваць маску электроннай пошты firefox-relay-and-fxa-opt-in-confirmation-enable-button-with-domain = .label = Зарэгістравацца diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/genai.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/genai.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/genai.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/genai.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -63,7 +63,7 @@ .label = Выдаліць { $provider } genai-menu-remove-sidebar = .label = Выдаліць з бакавой панэлі -genai-menu-new-badge = Стварыць +genai-menu-new-badge = Новае genai-menu-summarize-page = Падсумаваць змест старонкі genai-input-ask-generic = .placeholder = Спытаць чат-бота ШІ… @@ -268,3 +268,7 @@ link-preview-onboarding-button = Глядзець папярэдні прагляд # Onboarding card Close button link-preview-onboarding-close = Закрыць +# Title for the first-time setup modal +link-preview-first-time-setup-title = Першая ўстаноўка +# Message for the first-time setup modal +link-preview-first-time-setup-message = Гэта можа заняць некаторы час. Наступным разам вы ўбачыце ключавыя моманты хутчэй. diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/linuxDesktopEntry.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/linuxDesktopEntry.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/linuxDesktopEntry.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/linuxDesktopEntry.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -9,9 +9,13 @@ # The entry name is the label on the desktop icon, among other things. desktop-entry-name = { -brand-shortcut-name } # The comment usually appears as a tooltip when hovering over application menu entry. +desktop-entry-comment-1 = Хуткі і прыватны браўзер +# The comment usually appears as a tooltip when hovering over application menu entry. desktop-entry-comment = Аглядайце Сеціва desktop-entry-generic-name = Вэб-браўзер # Combine Name and GenericName. This string is specific to GNOME. +desktop-entry-x-gnome-full-name-1 = { -brand-full-name } +# Combine Name and GenericName. This string is specific to GNOME. desktop-entry-x-gnome-full-name = Вэб-браўзер { -brand-shortcut-name } # Keywords are search terms used to find this application. # The string is a list of keywords separated by semicolons: diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/menubar.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/menubar.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/menubar.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/menubar.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -254,6 +254,9 @@ # $profileName (String): the name of the users profile menu-profiles-current = .label = { $profileName } (цяперашні) +menu-profiles-menu = + .label = Профілі + .accesskey = о ## Tools Menu diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/newtab/asrouter.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/newtab/asrouter.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/newtab/asrouter.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/newtab/asrouter.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -74,6 +74,8 @@ fxa-adoption-addresses-backup-subtitle = Абараніце свае захаваныя адрасы, сінхранізуючы іх паміж прыладамі з дапамогай шыфравання. fxa-adoption-credit-cards-backup-title = Давайце зробім рэзервовую копію вашых спосабаў аплаты fxa-adoption-credit-cards-backup-subtitle = Абараніце свае спосабы аплаты, сінхранізуючы іх паміж прыладамі з дапамогай шыфравання. +fxa-adoption-bookmarks-treatment-backup-title = Давайце зробім рэзервовую копію вашых закладак +fxa-adoption-bookmarks-treatment-backup-subtitle = Абараніце свае закладкі, сінхранізуючы іх паміж прыладамі з дапамогай шыфравання. fxa-adoption-primary-button-label = Зарэгістравацца ## Protections panel @@ -234,6 +236,22 @@ set-default-pdf-handler-headline = Вашы PDF-файлы цяпер адкрываюцца ў { -brand-short-name }. Рэдагуйце або падпісвайце формы прама ў браўзеры. Каб змяніць, шукайце «PDF» у наладах. set-default-pdf-handler-primary = Зразумела +## PDF Annotations strings + +# “Sign on the dotted line” is an idiomatic English expression about +# where to place your signature. +# If this expression doesn’t have a direct translation, please +# translate this alternative string: "Add your signature anywhere!" +annotations-default-pdf-handler-headline = Дадайце свой подпіс у адпаведным полі — або дзе хочаце! +# “Go-to” is an idiomatic English expression referring to something that is used often. +annotations-default-pdf-handler-body = Намалюйце, напішыце або зацягніце свой подпіс, а затым размясціце яго дакладна там, дзе вам трэба. Захоўвайце свае любімыя подпісы для наступнага разу. +annotations-make-default-pdf-handler-title = Зрабіць { -brand-short-name } вашым прадвызначаным рэдактарам PDF? +annotations-make-default-pdf-handler-subtitle = Вы будзеце мець доступ да нашых прылад кожны раз, калі адкрываеце PDF-файл. +annotations-make-default-pdf-primary-cta = + .label = Зрабіць прадвызначаным +annotations-make-default-pdf-next = + .label = Далей + ## FxA sync CFR fxa-sync-cfr-header = Новая прылада ў вашай будучыні? @@ -407,3 +425,5 @@ etp-strict-exceptions-infobar-learn-more = Даведацца больш etp-strict-exceptions-infobar-button = Ужыць выпраўленні .accesskey = У +etp-strict-exceptions-infobar-not-now = Не зараз + .accesskey = Н diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/newtab/newtab.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/newtab/newtab.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/newtab/newtab.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/newtab/newtab.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -408,7 +408,7 @@ newtab-wallpaper-abstract-blue-purple-waves = Сінія і фіялетавыя хвалістыя формы newtab-wallpaper-abstract-black-waves = Чорныя хвалістыя формы -## Celestial +## Firefox newtab-wallpaper-category-title-photographs = Фатаграфіі newtab-wallpaper-beach-at-sunrise = Пляж на ўсходзе сонца @@ -438,6 +438,10 @@ .title = { -newtab-wallpaper-feature-highlight-header } .aria-label = { -newtab-wallpaper-feature-highlight-content } +## Firefox + +newtab-wallpaper-category-title-firefox = { -brand-product-name } + ## Celestial # “Celestial” referring to astronomy; positioned in or relating to the sky, @@ -479,8 +483,16 @@ newtab-weather-menu-change-temperature-units-celsius = Пераключыць на градусы Цэльсія newtab-weather-menu-hide-weather = Схаваць надвор'е на новай картцы newtab-weather-menu-learn-more = Даведацца больш +newtab-weather-menu-detect-my-location = Вызначыць маё месцазнаходжанне # This message is shown if user is working offline newtab-weather-error-not-available = Звесткі пра надвор'е зараз недаступныя. +newtab-weather-opt-in-see-weather = Хочаце бачыць надвор'е для вашага месцазнаходжання? +newtab-weather-opt-in-not-now = + .label = Не зараз +newtab-weather-opt-in-yes = + .label = Так +# We'll be showing static (fake) weather data if the user has not opted in to using their location +newtab-weather-static-city = Нью-Ёрк ## Topic Labels @@ -647,6 +659,9 @@ newtab-widget-lists-input-menu-move-down = Рухаць уніз newtab-widget-lists-input-menu-delete = Выдаліць newtab-widget-lists-input-menu-edit = Змяніць +# the + symbol emphasises the functionality of adding a new list +newtab-widget-lists-dropdown-create = + .label = + Стварыць новы спіс newtab-widget-lists-name-label-default = .label = Спіс задач newtab-widget-lists-name-placeholder-default = @@ -666,10 +681,10 @@ .label = Фокус newtab-widget-timer-mode-break = .label = Перапынак -newtab-widget-timer-play = - .title = Прайграць -newtab-widget-timer-pause = - .title = Прыпыніць +newtab-widget-timer-label-play = + .label = Прайграць +newtab-widget-timer-label-pause = + .label = Прыпыніць newtab-widget-timer-reset = .title = Скінуць newtab-widget-timer-menu-notifications = Выключыць апавяшчэнні diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/newtab/onboarding.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/newtab/onboarding.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/newtab/onboarding.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/newtab/onboarding.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -476,3 +476,96 @@ sync-to-mobile-button-label = Сінхранізаваць з мабільным desktop-to-mobile-qr-code-alt = .aria-label = QR-код для сцягвання { -brand-product-name } для мабільных прылад + +## Fx Backup onboarding: Create Backup spotlight + +create-backup-screen-1-title = + Абнаўляецеся да Windows 11? + Давайце зробім рэзервовую копію вашых дадзеных { -brand-product-name }. +create-backup-screen-1-subtitle = Аўтаматычна абараніце свае паролі, закладкі і іншае за 1-2 хвіліны. +create-backup-screen-1-flair = Рэкамендаваныя +create-backup-learn-more-link = Даведацца больш +create-backup-screen-1-sync-label = Сінхранізаваць з { -brand-product-name } +create-backup-screen-1-sync-body = Стварае рэзервовыя копіі з усіх прылад, дзе зроблены ўваход +create-backup-screen-1-backup-label = Рэзервовая копія на ПК +create-backup-screen-1-backup-body = Захоўвае на вашай прыладзе або ў OneDrive +create-backup-select-tile-button-label = Выбраць +create-backup-back-button-label = Назад +create-backup-show-fewer = + .label = Паказваць менш падобных +create-backup-screen-2-title = Выберыце дадзеныя { -brand-product-name } для рэзервовага капіявання +create-backup-screen-2-subtitle = Гэта зойме ўсяго хвіліну. Рэзервовыя копіі вашых дадзеных ствараюцца адзін раз у дзень. +# Label for the "Easy setup" backup option +create-backup-screen-2-easy-label = Простая ўстаноўка +# Preceded by a green check mark indicating that these are included in "Easy setup" backup +create-backup-screen-2-easy-list-1 = Закладкі, гісторыя, налады і іншае +# Preceded by a red X indicating that these are not included in the "Easy setup" backup +create-backup-screen-2-easy-list-2 = Не ўключае паролі і плацяжы +# Preceded by a red X indicating that "Easy setup" backups are not encrypted +create-backup-screen-2-easy-list-3 = Не зашыфравана +# Label for the "All data" backup option +create-backup-screen-2-all-label = Усе дадзеныя +# Preceded by a green check mark indicating that these are included in the "All data" backup +create-backup-screen-2-all-list-2 = Уключае паролі і плацяжы +# Preceded by a green check mark and shield indicating "All data" backups are encrypted +create-backup-screen-2-all-list-3 = Зашыфравана паролем +# Title for a screen asking users to choose a file location +create-backup-screen-3-location = Куды вы хочаце захаваць рэзервовую копію? +# Title for a screen asking users to create a password that will encrypt the backup +create-backup-screen-3-title = Стварыць пароль для файла рэзервовай копіі +create-backup-screen-3-subtitle = Патрабуецца для шыфравання вашых дадзеных. Захоўвайце іх у месцы, якое вы запомніце. +fx-backup-opt-in-header = Выбраць месцазнаходжанне файла +fx-backup-opt-in-filepath-label = Выберыце месца, куды вы плануеце перанесці дадзеныя на новую прыладу, напрыклад, OneDrive. +fx-backup-opt-in-create-password-label = Увядзіце пароль +fx-backup-opt-in-confirm-btn-label = Працягнуць +fx-backup-opt-in-cancel-btn-label = Назад + +## Fx Backup confirmation screen strings + +fx-backup-confirmation-screen-title = Ваша рэзервовая копія запланавана +fx-backup-confirmation-screen-close-button = Закрыць + +## These strings appear as a confirmation of which items will or won't be included as part of the selected backup method. + +fx-backup-confirmation-screen-all-data-item-text-1 = Усе дадзеныя аглядання ўключаны +fx-backup-confirmation-screen-all-data-item-text-2 = Захавана на вашай прыладзе +fx-backup-confirmation-screen-all-data-item-text-3 = Зашыфравана і абаронена паролем +fx-backup-confirmation-screen-easy-setup-item-text-1 = Закладкі, гісторыя, налады і іншыя дадзеныя ўключаны +fx-backup-confirmation-screen-easy-setup-item-text-2 = Захавана на вашай прыладзе +fx-backup-confirmation-screen-easy-setup-item-text-3 = Паролі і плацяжы не ўключаны +fx-backup-confirmation-screen-easy-setup-item-subtext-3 = Каб дадаць канфідэнцыяльныя дадзеныя, перайдзіце ў Налады. +fx-backup-confirmation-screen-item-subtext-1 = Рэзервовае капіяванне пачнецца праз некалькі хвілін і будзе выконвацца адзін раз у дзень. Вы можаце праверыць прагрэс у Наладах. +fx-backup-confirmation-screen-item-subtext-2 = { -brand-short-name } будзе шукаць рэзервовую копію, калі вам спатрэбіцца пераўсталяванне. + +## Restore from Backup Flow about:welcome screens + +restore-from-backup-secondary-top-button = Аднавіць з рэзервовай копіі +restore-from-backup-title = Давайце вернем { -brand-short-name } так, як вам падабаецца +restore-from-backup-subtitle = Аднавіце ўсе свае закладкі, гісторыю і іншыя дадзеныя, каб вярнуцца да аглядання. +restore-from-backup-secondary-button = Не аднаўляць + +## Restored from Backup spotlight + +restored-from-backup-success-title = Мы вярнуліся! Вашы дадзеныя { -brand-short-name } адноўлены. +restored-from-backup-success-with-checklist-subtitle = Хочаце мець свой любімы браўзер, арыентаваны на прыватнасць, на адлегласці ўсяго ў адзін націск? +restored-from-backup-success-no-checklist-subtitle = Вы можаце ўключыць рэзервовае капіраванне для гэтай прылады ў Наладах. +restored-from-backup-success-with-checklist-primary-button = Захаваць і працягнуць +restored-from-backup-success-with-checklist-secondary-button = Прапусціць гэты крок +restored-from-backup-success-no-checklist-primary-button = Працягнуць +restored-from-backup-error-title = Гм, узнікла праблема з вашым рэзервовым файлам. +restored-from-backup-error-subtitle = Калі ў вас ёсць іншы файл рэзервовай копіі { -brand-short-name }, паспрабуйце аднавіць з яго. Усё яшчэ ёсць праблемы? +restored-from-backup-error-primary-button = Закрыць + +## Onboarding Personalization Screen +## A screen shown to users during the onboarding process that asks them two qualifying questions about their use of the browser + +onboarding-personalization-title = Уладкуйце свой досвед { -brand-short-name } +onboarding-personalization-subtitle = Адкажыце на некалькі пытанняў, і мы парэкамендуем функцыі і пашырэнні, каб палепшыць ваша выкарыстанне { -brand-short-name }. +onboarding-personalization-use-case-title = Для чаго вы будзеце выкарыстоўваць { -brand-short-name }? +onboarding-personalization-use-case-personal-option = Асабістае выкарыстанне +onboarding-personalization-use-case-school-option = Школа +onboarding-personalization-use-case-work-option = Праца +onboarding-personalization-motivation-title = Якія асаблівасці { -brand-short-name } найбольш важныя для вас? +onboarding-personalization-motivation-privacy-option = Прыватнасць і бяспека +onboarding-personalization-motivation-productivity-option = Прадукцыйнасць +onboarding-personalization-motivation-other-option = Іншае diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/permissions.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/permissions.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/permissions.ftl 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/permissions.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -0,0 +1,5 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. + +perm-persistent-storage-remember = Памятаць гэтае рашэнне diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/policies/policies-descriptions.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/policies/policies-descriptions.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/policies/policies-descriptions.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/policies/policies-descriptions.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -21,6 +21,7 @@ policy-AutofillCreditCardEnabled = Уключыць аўтазапаўненне для спосабаў аплаты. policy-AutoLaunchProtocolsFromOrigins = Вызначыць спіс знешніх пратаколаў, якія можна выкарыстоўваць з пералічаных крыніц, не запытваючы карыстальніка. policy-BackgroundAppUpdate2 = Уключыць або выключыць фонавае абнаўленне. +policy-Backup = Адключыць рэзервовае капіяванне або аднаўленне дадзеных профілю. policy-BlockAboutAddons = Заблакаваць доступ да менеджара дадаткаў (about:addons). policy-BlockAboutConfig = Заблакаваць доступ да старонкі about:config. policy-BlockAboutProfiles = Заблакаваць доступ да старонкі about:profiles. @@ -79,6 +80,7 @@ policy-ExtensionUpdate = Уключае або выключае аўтаматычнае абнаўленне пашырэнняў. policy-FirefoxHome2 = Налады { -firefox-home-brand-name }. policy-FirefoxSuggest = Наладзіць { -firefox-suggest-brand-name }. +policy-GenerativeAI = Наладзьце функцыі генератыўнага штучнага інтэлекту. policy-GoToIntranetSiteForSingleWordEntryInAddressBar = Прымусовы прамы пераход па ўнутранай сетцы замест пошуку пры ўводзе аднаго слова ў адрасным радку. policy-Handlers = Наладзіць прадвызначаныя апрацоўшчыкі праграм. policy-HardwareAcceleration = Калі false, адключыць апаратнае паскарэнне. @@ -97,6 +99,7 @@ ## policy-LocalFileLinks = Дазволіць пэўным вэб-сайтам спасылацца на лакальныя файлы. +policy-LocalNetworkAccess = Уключыць або адключыць праверку доступу да лакальнай сеткі. policy-ManagedBookmarks = Наладжвае спіс закладак, якімі кіруе адміністратар, і якія карыстальнік не можа змяніць. policy-ManualAppUpdateOnly = Дазволіць абнаўленне толькі ўручную і не паведамляць карыстальніку аб абнаўленнях. policy-PrimaryPassword = Патрабаваць або забараняць выкарыстанне галоўнага пароля. @@ -117,6 +120,7 @@ policy-PDFjs = Адключыць або наладзіць PDF.js, убудаваны ў { -brand-short-name } праглядальнік PDF. policy-Permissions2 = Наладзіць дазволы для камеры, мікрафона, месцазнаходжання, абвестак і аўтапрайгравання. policy-PictureInPicture = Уключыць або выключыць выяву ў выяве. +policy-PopupBlocking2 = Дазволіць пэўным сайтам паказваць выплыўныя вокны і перанакіроўвацца праз староннія рамкі. policy-PopupBlocking = Дазволіць пэўным вэб-сайтам тыпова паказваць усплыўныя вокны. policy-Preferences = Устанавіць і зафіксаваць значэнне для падмноства пераваг. policy-PrivateBrowsingModeAvailability = Наладзіць доступ да рэжыму прыватнага аглядання. @@ -139,6 +143,7 @@ policy-TranslateEnabled = Уключыць або выключыць пераклад вэб-старонак. policy-UserMessaging = Не паказваць карыстальніку пэўныя паведамленні. policy-UseSystemPrintDialog = Друкаваць з дапамогай сістэмнага дыялога друку. +policy-VisualSearchEnabled = Уключыць або адключыць візуальны пошук. # “format” refers to the format used for the value of this policy. policy-WebsiteFilter = Забараніць наведванне вэб-сайтаў. За падрабязнасцямі фармату гл. дакументацыю. policy-Windows10SSO = Дазволіць адзіны ўваход Windows для ўліковых запісаў Microsoft, працоўных і школьных уліковых запісаў. diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/preferences/colors.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/preferences/colors.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/preferences/colors.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/preferences/colors.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -16,6 +16,12 @@ colors-page-override-option-never = .label = Ніколі colors-text-and-background = Тэкст і фон +colors-text = + .label = Тэкст + .accesskey = Т +colors-text-background = + .label = Фон + .accesskey = Ф colors-text-header = Тэкст .accesskey = Т colors-background = Фон @@ -27,6 +33,12 @@ .label = Падкрэсліваць спасылкі .accesskey = П colors-links-header = Колеры спасылак +colors-links-unvisited = + .label = Ненаведаныя спасылкі + .accesskey = с +colors-links-visited = + .label = Наведаныя спасылкі + .accesskey = Н colors-unvisited-links = Ненаведаныя спасылкі .accesskey = с colors-visited-links = Наведаныя спасылкі diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/preferences/formAutofill.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/preferences/formAutofill.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/preferences/formAutofill.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/preferences/formAutofill.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -17,7 +17,9 @@ autofill-manage-add-button = Дадаць… autofill-manage-edit-button = Змяніць… -## The address capture doorhanger +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding address-capture-save-doorhanger-header = Захаваць адрас? address-capture-save-doorhanger-description = Захавайце інфармацыю ў { -brand-short-name }, каб можна было хутка запаўняць формы. @@ -55,53 +57,64 @@ autofill-address-street-address = Вуліца autofill-address-street = Вуліца -## address-level-3 (Sublocality) names +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding -# Used in IR, MX +# Used in Iran (IR), Mexico (MX) as sublocality (civil entity below a locality, e.g. within a city). autofill-address-neighborhood = Мікрараён -# Used in MY +# Used in Malaysia (MY) as sublocality (civil entity below a locality, e.g. within a city). autofill-address-village-township = Вёска ці гарадок autofill-address-island = Востраў -# Used in IE +# Used in Ireland (IE) as sublocality (civil entity below a locality, e.g. within a city). autofill-address-townland = Гарадская зямля -## address-level-2 names +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding autofill-address-city = Горад -# Used in HK, SD, SY, TR as Address Level-2 and used in KR as Sublocality. +# Used in Hong Kong (HK), Sudan (SD), Syria (SY), Türkiye (TR) as as secondary address information (2 levels below the country level). +# Used in Korea as sublocality (civil entity below a locality, e.g. within a city). autofill-address-district = Раён -# Used in GB, NO, SE +# Used in United Kingdom (GB), Norway (NO), Sweden (SE) as as secondary address information (2 levels below the country level). autofill-address-post-town = Паштовае месца -# Used in AU as Address Level-2 and used in ZZ as Sublocality. +# Used in Australia (AU) as as secondary address information (below the country level). +# Used for international addresses as sublocality (civil entity below a locality, e.g. within a city). autofill-address-suburb = Прадмесце -## address-level-1 names +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding autofill-address-province = Вобласць autofill-address-state = Штат autofill-address-county = Графства -# Used in BB, JM +# Used in Barbados (BB), Jamaica (JM) as primary address information (1 level below the country level). autofill-address-parish = Парафія -# Used in JP +# Used in Japan (JP) as primary address information (1 level below the country level). autofill-address-prefecture = Прэфектура -# Used in HK +# Used in Honk Kong (HK) as primary address information (1 level below the country level). autofill-address-area = Вобласць -# Used in KR +# Used in Korea (KO) as primary address information (1 level below the country level). autofill-address-do-si = Do/Si -# Used in NI, CO +# Used in Nicaragua (NI), Colombia (CO) as primary address information (1 level below the country level). autofill-address-department = Аддзел -# Used in AE +# Used in United Arab Emirates (AE) as primary address information (1 level below the country level). autofill-address-emirate = Эмірат -# Used in RU and UA +# Used in Russia (RU), Ukraine (UA) as primary address information (1 level below the country level). autofill-address-oblast = Вобласць -## Postal code name types +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding -# Used in IN +# Postal code field used in India (IN). autofill-address-pin = Pin autofill-address-postal-code = Паштовы індэкс +# Postal code field. autofill-address-zip = Паштовы індэкс -# Used in IE +# Postal code field used in Ireland (IE). autofill-address-eircode = Eircode ## diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/preferences/fxaPairDevice.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/preferences/fxaPairDevice.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/preferences/fxaPairDevice.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/preferences/fxaPairDevice.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -6,6 +6,7 @@ .style = min-width: 32em; fxa-qrcode-pair-title = Сінхранізуйце { -brand-product-name } на сваім тэлефоне або планшэце fxa-qrcode-pair-step1 = 1. Адкрыйце { -brand-product-name } на сваёй мабільнай прыладзе. +fxa-qrcode-pair-step2-device-steps = 2. Перайдзіце ў меню і націсніце Увайсці fxa-qrcode-pair-step2-signin = 2. Адкрыйце меню ( на iOS або на Android) і націсніце Сінхранізаваць і захаваць дадзеныя fxa-qrcode-pair-step3 = 3. Націсніце Гатова да сканавання і ўтрымлівайце тэлефон над гэтым кодам fxa-qrcode-error-title = Спараванне не ўдалося. diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/preferences/moreFromMozilla.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/preferences/moreFromMozilla.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/preferences/moreFromMozilla.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/preferences/moreFromMozilla.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -39,6 +39,7 @@ more-from-moz-solo-title = ШІ { -solo-ai-brand-name } more-from-moz-solo-description = Імгненна стварыце свой вэб-сайт і падключыце ўласны карыстальніцкі дамен бясплатна. more-from-moz-solo-button = Паспрабаваць { -solo-ai-brand-name } +more-from-moz-solo-title-2 = Штучны інтэлект для стварэння сайтаў { -solo-ai-brand-name } ## These strings are for the MDN card in about:preferences moreFromMozilla page diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/preferences/permissions.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/preferences/permissions.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/preferences/permissions.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/preferences/permissions.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -93,10 +93,17 @@ permissions-exceptions-https-only-desc = Вы можаце выключыць рэжым толькі HTTPS для пэўных вэб-сайтаў. { -brand-short-name } не будзе спрабаваць пераключыць злучэнне на бяспечны HTTPS для гэтых сайтаў. Выключэнні не распаўсюджваюцца на прыватныя вокны. permissions-exceptions-https-only-desc2 = Вы можаце выключыць рэжым толькі HTTPS для пэўных вэб-сайтаў. { -brand-short-name } не будзе спрабаваць пераключыць злучэнне на бяспечны HTTPS для гэтых сайтаў. +## Exceptions - Pop-ups And Third-Party Redirects + +permissions-exceptions-popup-window3 = + .title = Дазволеныя сайты - Выплыўныя вокны і староннія перанакіраванні + .style = { permissions-window2.style } +permissions-exceptions-popup-desc2 = Вы можаце ўказаць, якім сайтам дазволена адкрываць выплыўныя вокны і перанакіроўвацца староннімі рамкамі. + ## Exceptions - Pop-ups permissions-exceptions-popup-window2 = - .title = Дазволеныя вэб-сайты - Выплыўныя вокны + .title = Дазволеныя сайты - Выплыўныя вокны .style = { permissions-window2.style } permissions-exceptions-popup-desc = Вы можаце вызначыць, якім вэб-сайтам дазволена адкрываць выплыўныя вокны. Набярыце дакладны адрас сайта, якому вы хочаце дазволіць гэта, і пстрыкніце Дазволіць. @@ -110,14 +117,14 @@ ## Exceptions - Saved Passwords permissions-exceptions-saved-passwords-window = - .title = Выключэнні – захаваныя паролі + .title = Выключэнні – Захаваныя паролі .style = { permissions-window2.style } permissions-exceptions-saved-passwords-desc = { -brand-short-name } не будзе захоўваць паролі для сайтаў, пералічаных тут. ## Exceptions - Add-ons permissions-exceptions-addons-window2 = - .title = Дазволеныя вэб-сайты - Усталяванне дадаткаў + .title = Дазволеныя сайты - Усталяванне дадаткаў .style = { permissions-window2.style } permissions-exceptions-addons-desc = Вы можаце вызначыць, якім вэб-сайтам дазволена ўсталёўваць дадаткі. Набярыце дакладны адрас сайта, якому вы хочаце гэта дазволіць, і націсніце Дазволіць. diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/preferences/preferences.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/preferences/preferences.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/preferences/preferences.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/preferences/preferences.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -113,6 +113,10 @@ # will be replaced with Add-ons icon # will be replaced with Menu icon extension-controlled-enable = Каб уключыць пашырэнне, зайдзіце ў Дадаткаў ў меню . +extension-controlled-enable-2 = Каб зноў уключыць гэтае пашырэнне, наведайце раздзел Пашырэнні і тэмы. +# This string is shown to notify the user that their home page or new tab preferences +# are being controlled by an extension. +extension-controlling-homepage = { $name } кіруе некаторымі наладамі вашай хатняй старонкі. ## Preferences UI Search Results @@ -127,6 +131,10 @@ always-check-default = .label = Заўжды правяраць, ці з'яўляецца { -brand-short-name } прадвызначаным браўзерам .accesskey = н +is-default-browser = + .message = { -brand-short-name } зараз ваш прадвызначаны браўзер +is-not-default-browser = + .message = { -brand-short-name } не прадвызначаны браўзер is-default = { -brand-short-name } зараз ваш прадвызначаны браўзер is-not-default = { -brand-short-name } не прадвызначаны браўзер set-as-my-default-browser = @@ -135,6 +143,8 @@ startup-restore-windows-and-tabs = .label = Адкрываць папярэднія вокны і карткі .accesskey = ы +startup-windows-launch-on-login-profile-disabled = + .message = Уключыце гэты параметр, адзначыўшы «{ profile-manager-use-selected.label }» у акне «Выбар профілю карыстальніка». windows-launch-on-login = .label = Адкрываць { -brand-short-name } аўтаматычна пры запуску камп'ютара .accesskey = ў @@ -161,6 +171,8 @@ open-new-link-as-tabs = .label = Адкрываць спасылкі ў картках замест новых акон .accesskey = ы +open-external-link-next-to-active-tab = + .label = Адкрываць спасылкі з праграм побач з актыўнай карткай ask-on-close-multiple-tabs = .label = Пытаць перад закрыццём некалькіх картак .accesskey = ь @@ -250,6 +262,17 @@ language-and-appearance-header = Мова і выгляд preferences-web-appearance-header = Выгляд вэб-сайтаў preferences-web-appearance-description = Некаторыя вэб-сайты адаптуюць сваю колеравую схему ў залежнасці ад вашых пераваг. Выберыце, якую колеравую схему вы хочаце выкарыстоўваць для гэтых сайтаў. +preferences-web-appearance-choice-auto2 = + .label = Аўтаматычная + .title = Аўтаматычна змяняць фон і змесціва вэб-сайтаў у залежнасці ад налад сістэмы і тэмы { -brand-short-name }. +preferences-web-appearance-choice-light2 = + .label = Светлая + .title = Выкарыстоўваць светлы выгляд для фону і змесціва сайтаў. +preferences-web-appearance-choice-dark2 = + .label = Цёмная + .title = Выкарыстоўваць цёмны выгляд для фону і змесціва сайтаў. +web-appearance-group = + .aria-label = Выгляд вэб-сайтаў preferences-web-appearance-choice-auto = Аўтаматычная preferences-web-appearance-choice-light = Светлая preferences-web-appearance-choice-dark = Цёмная @@ -269,6 +292,8 @@ # system colors. preferences-web-appearance-override-warning3 = .message = Вашы налады кантраснасці перавызначаюць знешні выгляд сайта. +preferences-web-appearance-link = + .label = Кіруйце тэмамі { -brand-short-name } у пашырэннях і тэмах # This can appear when using windows HCM or "Override colors: always" without # system colors. preferences-web-appearance-override-warning = Ваш выбар колераў мае перавагу над знешнім выглядам вэб-сайта. Кіраваць колерамі @@ -344,6 +369,11 @@ ## General Section - Files and Applications files-and-applications-title = Файлы і праграмы +downloads-header-2 = + .label = Сцягванні +download-save-where-2 = + .label = Захоўваць файлы ў + .accesskey = З download-header = Сцягванні download-save-where = Захоўваць файлы ў .accesskey = З @@ -574,9 +604,10 @@ home-new-windows-tabs-header = Новыя вокны і карткі home-new-windows-tabs-description2 = Выберыце, што бачыць, калі вы адкрываеце хатнюю старонку, новае акно ці картку. -## Home Section - Home Page Customization +## Custom Homepage subpage home-homepage-mode-label = Хатняя старонка і новыя вокны +home-homepage-mode-label2 = Новыя вокны home-newtabs-mode-label = Новыя карткі home-restore-defaults = .label = Аднавіць прадвызначэнні @@ -589,6 +620,11 @@ .label = Пустая старонка home-homepage-custom-url = .placeholder = Устаўце URL… +# This button is shown when the homepage is managed by an extension and is placed below extension-controlling-homepage. +home-homepage-manage-extension-button = + .label = Кіраваць пашырэннем +# This option leads to the "Custom Homepage" subpage +home-homepage-custom-homepage-url = Выберыце канкрэтны сайт # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$tabCount} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should @@ -603,18 +639,45 @@ choose-bookmark = .label = Ужыць закладку… .accesskey = з +home-homepage-header = Хатняя старонка + +## Custom Homepage subpage + +home-custom-homepage-header = Уласная хатняя старонка +# Subheader on the Custom Homepage subpage. Followed by a form to enter URLs and a list of URLs already saved, if any. +home-custom-homepage-subheader = Адрас(ы) сайта(ў) +home-custom-homepage-address = + .placeholder = Увядзіце адрас +home-custom-homepage-address-button = + .label = Дадаць адрас +# Shown when no custom websites/URLs to use as a homepage have been added yet +home-custom-homepage-no-websites-yet = Пакуль не дададзены ніводны сайт. +# Further options to use when setting the home page. Two action buttons are placed in line with this prompt +# to replace the current home page with a currently open page or bookmark. +home-custom-homepage-replace-with = Замяніць на +# Button that appears in-line after text "Replace with" (home-custom-homepage-replace-with) +home-custom-homepage-current-pages-button = + .label = Зараз адкрытыя старонкі +# Button that appears in-line after text "Replace with" (home-custom-homepage-replace-with) +home-custom-homepage-bookmarks-button = + .label = Закладкі… ## Home Section - Firefox Home Content Customization home-prefs-content-header2 = Змесціва { -firefox-home-brand-name } +home-prefs-content-header3 = { -firefox-home-brand-name } home-prefs-content-description2 = Выберыце пажаданае змесціва для свайго экрана { -firefox-home-brand-name }. home-prefs-search-header = .label = Пошук у сеціве +home-prefs-search-header2 = + .label = Пошук home-prefs-shortcuts-header = .label = Цэтлікі home-prefs-shortcuts-description = Сайты, якія вы захоўваеце або наведваеце home-prefs-shortcuts-by-option-sponsored = .label = Спонсарскія цэтлікі +home-prefs-content-header = + .label = { -firefox-home-brand-name } ## Home Section - Firefox Home Content Customization @@ -624,6 +687,12 @@ home-prefs-recommended-by-header-generic = .label = Рэкамендаваныя гісторыі home-prefs-recommended-by-description-generic = Выключнае змесціва, курыраванае сям'ёй { -brand-product-name } +home-prefs-stories-header = + .label = Гісторыі +home-prefs-stories-description = Персаналізаваныя гісторыі на аснове вашай актыўнасці +home-prefs-stories-header2 = + .label = Гісторыі + .description = Выключнае змесціва, курыраванае сям'ёй { -brand-product-name } ## @@ -657,11 +726,19 @@ home-prefs-trending-search-header = .label = Папулярныя пошукавыя запыты home-prefs-trending-search-description = Папулярныя і часта запытаныя тэмы +# Lists is a widget on New Tab, similar to a to-do widget +home-prefs-lists-header = + .label = Спісы +# Timer is a widget on New Tab, similar to the Pomodoro timer. +home-prefs-timer-header = + .label = Таймер # "Support" here means to help sustain or contribute to something, especially through funding or sponsorship. home-prefs-support-firefox-header = .label = Падтрымаць { -brand-product-name } home-prefs-mission-message = Нашы спонсары падтрымліваюць нашу місію па стварэнні лепшага Інтэрнэту home-prefs-mission-message-learn-more-link = Даведацца, як +home-prefs-manage-topics-link = Кіраванне тэмамі +home-prefs-choose-wallpaper-link = Выберыце шпалеры # Variables: # $num (number) - Number of rows displayed home-prefs-sections-rows-option = @@ -755,6 +832,8 @@ containers-back-button2 = .aria-label = Вярнуцца да наладаў containers-header = Кантэйнеры картак +containers-section-header = + .heading = Кантэйнеры картак containers-add-button = .label = Дадаць новы кантэйнер .accesskey = Д @@ -919,6 +998,14 @@ ## The device name controls. sync-device-name-header = Назва прылады +# Variables: +# $placeholder (string) - The placeholder text of the input +sync-device-name-input = + .aria-label = Назва прылады + .placeholder = { $placeholder } +sync-device-name-change-2 = + .label = Змяніць назву прылады + .accesskey = м sync-device-name-change = .label = Змяніць назву прылады… .accesskey = м @@ -1059,6 +1146,28 @@ # This operation requires the user to authenticate with the operating system (device sign-in) autofill-reauth-payment-methods-checkbox = Патрабаваць уваход на прыладзе для запаўнення спосабаў аплаты і кіравання імі .accesskey = ў +autofill-payment-methods-title = Спосабы аплаты +autofill-payment-methods-header = + .aria-label = Спосабы аплаты +autofill-payment-methods-checkbox-message-2 = + .label = Захоўваць і запаўняць спосабы аплаты + .accesskey = З +autofill-payment-methods-manage-payments-button = + .label = Кіраваць спосабамі аплаты + .accesskey = ь +# This operation requires the user to authenticate with the operating system (device sign-in) +autofill-reauth-payment-methods-checkbox-2 = + .label = Патрабаваць уваход на прыладзе для аўтазапаўнення спосабаў аплаты і кіравання імі + .accesskey = ў +autofill-addresses-title = Адрасы і іншае +autofill-addresses-header = + .aria-label = Адрасы і іншае +autofill-addresses-checkbox-message = + .label = Захоўваць і аўтаматычна запаўняць адрасы + .accesskey = ы +autofill-addresses-manage-addresses-button = + .label = Кіраванне адрасамі і іншае + .accesskey = р ## Privacy Section - History @@ -1080,6 +1189,12 @@ .label = ніколі не памятаць гісторыю history-remember-option-custom = .label = ужываць налады для гісторыі +history-remember-description2 = + .description = { -brand-short-name } будзе помніць гісторыю аглядання, сцягвання, запаўнення форм і пошуку. +history-dontremember-description2 = + .description = { -brand-short-name } будзе ўжываць тыя ж налады, што і ў прыватным рэжыме, і не будзе памятаць гісторыю вашага аглядання Сеціва. +history-custom-description = + .description = { -brand-short-name } будзе выкарыстоўваць карыстальніцкія налады для вашай гісторыі аглядання, сцягванняў, формаў і пошуку. history-remember-description = { -brand-short-name } будзе помніць гісторыю аглядання, сцягвання, запаўнення форм і пошуку. history-dontremember-description = { -brand-short-name } будзе ўжываць тыя ж налады, што і ў прыватным рэжыме, і не будзе памятаць гісторыю вашага аглядання Сеціва. history-private-browsing-permanent = @@ -1104,15 +1219,23 @@ ## Privacy Section - Site Data sitedata-header = Кукі і дадзеныя сайтаў +sitedata-label = + .aria-label = { sitedata-header } sitedata-total-size-calculating = Падлік памеру дадзеных сайтаў і кэша… # Variables: # $value (number) - Value of the unit (for example: 4.6, 500) # $unit (string) - Name of the unit (for example: "bytes", "KB") +sitedata-total-size2 = Вашы захаваныя кукі, гісторыя, дадзеныя сайтаў і кэш зараз займаюць { $value } { $unit } на дыску. +# Variables: +# $value (number) - Value of the unit (for example: 4.6, 500) +# $unit (string) - Name of the unit (for example: "bytes", "KB") sitedata-total-size = Вашы захаваныя кукі, дадзеныя сайтаў і кэш зараз займаюць { $value } { $unit } на дыску. sitedata-learn-more = Даведацца больш sitedata-delete-on-close = .label = Выдаляць кукі і звесткі сайтаў па закрыцці { -brand-short-name } .accesskey = с +sitedata-delete-on-close-private-browsing3 = + .message = На падставе вашых налад гісторыі { -brand-short-name } выдаляе кукі і звесткі сайтаў з вашага сеансу, калі вы закрываеце браўзер. sitedata-delete-on-close-private-browsing = У рэжыме сталага прыватнага аглядання кукі і звесткі сайтаў будуць заўсёды выдаляцца па закрыцці { -brand-short-name }. sitedata-delete-on-close-private-browsing2 = На падставе вашых налад гісторыі { -brand-short-name } выдаляе кукі і звесткі сайтаў з вашага сеансу, калі вы закрываеце браўзер. sitedata-allow-cookies-option = @@ -1129,6 +1252,8 @@ .label = Міжсайтавыя трэкеры sitedata-option-block-cross-site-tracking-cookies = .label = Кукі сачэння між сайтамі +sitedata-option-block-cross-site-cookies2 = + .label = Ізаляваць міжсайтавыя кукі sitedata-option-block-cross-site-cookies = .label = Кукі сачэння між сайтамі, ізаляваць іншыя міжсайтавыя кукі sitedata-option-block-unvisited = @@ -1137,6 +1262,12 @@ .label = Усе міжсайтавыя кукі (можа парушыць працу сайтаў) sitedata-option-block-all = .label = Усе кукі (будзе перашкаджаць працы сайтаў) +sitedata-clear2 = + .label = Ачысціць звесткі аглядання + .accesskey = д +sitedata-settings2 = + .label = Кіраваць звесткамі аглядання + .accesskey = ь sitedata-clear = .label = Выдаліць дадзеныя… .accesskey = ы @@ -1146,6 +1277,10 @@ sitedata-cookies-exceptions = .label = Кіраваць выключэннямі… .accesskey = ч +sitedata-cookies-exceptions2 = + .label = Кіраваць выключэннямі + .accesskey = ч + .description = Вы можаце ўказаць, якім сайтам заўсёды можна або ніколі нельга выкарыстоўваць кукі і дадзеныя сайтаў ## Privacy Section - Cookie Banner Handling @@ -1165,6 +1300,11 @@ ## Privacy Section - Address Bar addressbar-header = Адрасны радок +addressbar-suggest-1 = Выберыце, якія прапановы будуць паказвацца ў адрасным радку +# When Firefox Suggest is enabled, this replaces `addressbar-header`. +addressbar-header-firefox-suggest-1 = { -firefox-suggest-brand-name } +# When Firefox Suggest is enabled, this replaces `addressbar-suggest`. +addressbar-suggest-firefox-suggest-1 = Прапановы ад { -brand-short-name } і нашых партнёраў у вашым адрасным радку. addressbar-suggest = Пры выкарыстанні адраснага радка, прапаноўваць # When Firefox Suggest is enabled, this replaces `addressbar-header`. addressbar-header-firefox-suggest = Адрасны радок — { -firefox-suggest-brand-name } @@ -1192,6 +1332,9 @@ addressbar-locbar-topsites-option = .label = Папулярныя сайты .accesskey = П +addressbar-locbar-engines-option-1 = + .label = Рэкамендаваць выкарыстанне пошукавых сістэм + .accesskey = ц addressbar-locbar-engines-option = .label = Пошукавыя сістэмы .accesskey = П @@ -1205,6 +1348,10 @@ addressbar-locbar-showtrendingsuggestions-option = .label = Паказваць папулярныя пошукавыя прапановы .accesskey = п +# Toggles whether suggestions are obtained from Firefox Suggest or not (local or online). +addressbar-locbar-suggest-all-option = + .label = Прапановы ад { -brand-short-name } +addressbar-locbar-suggest-all-option-desc = Атрымлівайце прапановы з інтэрнэту, звязаныя з вашым пошукам. # Nonsponsored suggestions refers to Firefox Suggest suggestions like Wikipedia. addressbar-locbar-suggest-nonsponsored-option = .label = Прапановы ад { -brand-short-name } @@ -1212,6 +1359,14 @@ addressbar-locbar-suggest-sponsored-option = .label = Прапановы ад спонсараў addressbar-locbar-suggest-sponsored-desc = Падтрымлівайце { -brand-short-name } выпадковымі спонсарскімі прапановамі. +# This string is used for a checkbox in the settings UI that opts the +# user into "online" Firefox Suggest, allowing them to receive suggestions from +# Mozilla's Merino server. +# "Mozilla" is intentionally hardcoded to prevent forks from replacing it +# with their own vendor name, since the online suggest is created and maintained +# by Mozilla. +addressbar-firefox-suggest-online = + .label = Атрымліваць прапановы ад Mozilla ў часе ўводу тэксту addressbar-quickactions-learn-more = Падрабязней addressbar-dismissed-suggestions-label = Адхіленыя прапановы addressbar-restore-dismissed-suggestions-description = Аднавіць адхіленыя прапановы ад спонсараў і { -brand-short-name }. @@ -1253,6 +1408,7 @@ content-blocking-cross-site-cookies-in-all-windows2 = Міжсайтавыя кукі ва ўсіх вокнах content-blocking-cross-site-tracking-cookies = Кукі сачэння між сайтамі content-blocking-all-cross-site-cookies-private-windows = Міжсайтавыя кукі ў прыватных вокнах +content-blocking-isolate-cross-site-cookies = Ізаляваць міжсайтавыя кукі content-blocking-cross-site-tracking-cookies-plus-isolate = Міжсайтавыя кукі сачэння, ізаляваць астатнія кукі content-blocking-social-media-trackers = Трэкеры сацыяльных сетак content-blocking-all-cookies = Усе кукі @@ -1273,24 +1429,19 @@ content-blocking-etp-standard-tcp-rollout-learn-more = Падрабязней content-blocking-etp-standard-tcp-title = Уключае поўную ахову ад кукаў, нашу наймагутнейшую функцыю прыватнасці content-blocking-warning-title = Увага! -content-blocking-and-isolating-etp-warning-description-3 = Гэта налада можа прывесці да таго, што некаторыя сайты не будуць паказваць змесціва або працаваць няправільна. Мы прапануем неабавязковыя выключэнні для сайтаў, на якія, як мы ведаем, можа паўплываць ваша канфігурацыя. Каб паменшыць імавернасць пашкоджання сайтаў, дазвольце гэтыя выключэнні для трэкераў. Калі сайт выглядае зламаным, вы можаце адключыць ахову ад сачэння для гэтага сайта, каб загрузіць усё змесціва, і паведаміць аб праблеме, каб мы маглі дапамагчы выправіць яе для ўсіх. content-blocking-warning-title-2 = Некаторыя сайты могуць перастаць працаваць са строгай аховай ад сачэння +content-blocking-warning-title-custom = Некаторыя сайты могуць перастаць працаваць з адмысловай аховай ад сачэння # “Fix site issues” references the string content-blocking-exceptions-subheader content-blocking-and-isolating-etp-warning-description-4 = { -brand-short-name } рэкамендуе выкарыстоўваць налады «Выпраўленне праблем з сайтамі», каб паменшыць колькасць няспраўных функцый і змесціва сайтаў. Калі сайт здаецца няспраўным, паспрабуйце адключыць ахову ад сачэння для гэтага сайта, каб загрузіць усё змесціва. content-blocking-and-isolating-etp-warning-description-2 = Гэта налада можа прывесці да таго, што некаторыя вэб-сайты не будуць паказваць змесціва ці працаваць карэктна. Калі сайт здаецца няспраўным, вы можаце адключыць ахову ад сачэння на гэтым сайце, каб чытаць увесь змест. content-blocking-warning-learn-how = Даведацца, як -content-blocking-baseline-exceptions = - .label = Дазволіць { -brand-short-name } аўтаматычна ўжываць выключэнні, неабходныя для прадухілення сур'ёзных паломак вэб-сайтаў. -content-blocking-baseline-exceptions-2 = - .label = Дапамагае загружаць сайты і функцыі, разблакоўваючы толькі неабходныя элементы, якія могуць утрымліваць трэкеры. Ахоплівае найбольш распаўсюджаныя праблемы. -content-blocking-convenience-exceptions = - .label = Таксама аўтаматычна ўжываць выключэнні, якія патрабуюцца толькі для выпраўлення нязначных праблем і даступнасці зручных функцый. -# This option to fix minor site issues must be used with the option to fix major site issues (string content-blocking-baseline-exceptions-2) -content-blocking-convenience-exceptions-2 = - .label = Аднаўляе такія рэчы, як відэа ў артыкуле або раздзелах каментарыяў, разблакоўваючы элементы, якія могуць утрымліваць трэкеры. Гэта можа паменшыць праблемы з сайтам, але забяспечвае меншую ахову. Неабходна выкарыстоўваць разам з выпраўленнямі сур'ёзных праблем. -content-blocking-baseline-label = Выпраўляць сур'ёзныя праблемы з сайтамі (рэкамендуецца) -content-blocking-convenience-label = Выпраўленне нязначных праблем з сайтамі -content-blocking-exceptions-subheader = Выпраўленне праблем з сайтамі +content-blocking-baseline-exceptions-3 = + .label = Выпраўляць сур'ёзныя праблемы з сайтамі (рэкамендуецца) + .description = Дапамагае загружаць сайты і функцыі, разблакоўваючы толькі неабходныя элементы, якія могуць утрымліваць трэкеры. Ахоплівае найбольш распаўсюджаныя праблемы. +# This option to fix minor site issues must be used with the option to fix major site issues (string content-blocking-baseline-exceptions-3) +content-blocking-convenience-exceptions-3 = + .label = Выпраўленне нязначных праблем з сайтамі + .description = Аднаўляе такія рэчы, як відэа ў артыкуле або раздзелах каментарыяў, разблакоўваючы элементы, якія могуць утрымліваць трэкеры. Гэта можа паменшыць праблемы з сайтам, але забяспечвае меншую ахову. Неабходна выкарыстоўваць разам з выпраўленнямі сур'ёзных праблем. content-blocking-baseline-uncheck-warning-dialog-title = Вы ўпэўнены, што хочаце адключыць выпраўленні? content-blocking-baseline-uncheck-warning-dialog-body = Гэты параметр дапамагае выправіць найбольш распаўсюджаныя праблемы з сайтамі. Калі вы яго адключыце, некаторыя сайты могуць не працаваць, а { -brand-short-name } не зможа дапамагчы ў вырашэнні гэтых праблем. content-blocking-baseline-uncheck-warning-dialog-ok-button = Выключыць выпраўленні @@ -1382,10 +1533,15 @@ permissions-notification-pause = .label = Прыпыніць абвесткі да перазапуску { -brand-short-name } .accesskey = а +permissions-autoplay2 = + .label = Аўтапрайграванне permissions-autoplay = Аўтапрайграванне permissions-autoplay-settings = .label = Налады… .accesskey = Н +permissions-block-popups2 = + .label = Блакаваць выплыўныя вокны і перанакіраванне на староннія сайты + .accesskey = Б permissions-block-popups = .label = Блакаваць выплыўныя вокны .accesskey = Б @@ -1401,6 +1557,20 @@ permissions-addon-exceptions = .label = Выключэнні… .accesskey = В +permissions-location2 = + .label = Месцазнаходжанне +permissions-localhost2 = + .label = Праграмы і службы прылад +permissions-local-network2 = + .label = Прылады лакальнай сеткі +permissions-xr2 = + .label = Віртуальная рэчаіснасць +permissions-camera2 = + .label = Камера +permissions-microphone2 = + .label = Мікрафон +permissions-notification2 = + .label = Абвесткі ## Privacy Section - Data Collection @@ -1499,15 +1669,22 @@ certs-thirdparty-toggle = .label = Дазволіць { -brand-short-name } аўтаматычна давяраць усталяваным вамі каранёвым сертыфікатам трэцяга боку .accesskey = е +certs-devices-enable-fips = Дазволіць FIPS space-alert-over-5gb-settings-button = .label = Адкрыць налады .accesskey = А space-alert-over-5gb-message2 = У { -brand-short-name } сканчаецца месца на дыску. Змесціва вэб-сайтаў можа адлюстроўвацца няправільна. Вы можаце выдаліць захаваныя дадзеныя ў Налады > Прыватнасць і бяспека > Кукі і дадзеныя сайтаў. space-alert-under-5gb-message2 = У { -brand-short-name } сканчаецца месца на дыску. Змесціва вэб-сайтаў можа адлюстроўвацца няправільна. Клікніце “Падрабязней”, каб аптымізаваць выкарыстанне вашага дыска для паляпшэння вэб-сёрфінгу. +certs-description2 = + .label = Сертыфікаты + .description = Наладзьце сертыфікаты, якія { -brand-short-name } выкарыстоўвае для аўтэнтыфікацыі. ## Privacy Section - HTTPS-Only httpsonly-header = Рэжым толькі HTTPS +httpsonly-label = + .aria-label = { httpsonly-header } + .description = Дазваляе толькі бяспечнае злучэнне з вэб-сайтамі. { -brand-short-name } спытае перад небяспечным злучэннем. httpsonly-description3 = Дазваляе толькі бяспечнае злучэнне з вэб-сайтамі. { -brand-short-name } спытае перад небяспечным злучэннем. httpsonly-learn-more2 = Як працуе «Толькі HTTPS» httpsonly-description = HTTPS забяспечвае бяспечнае зашыфраванае злучэнне паміж { -brand-short-name } і вэб-сайтамі, якія вы наведваеце. Большасць сайтаў падтрымліваюць HTTPS, і калі ўключаны рэжым толькі HTTPS, { -brand-short-name } пераключа ўсе злучэнні на HTTPS. diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/profiles.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/profiles.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/profiles.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/profiles.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -26,12 +26,16 @@ default-profile-name = Профіль { $number } # The word 'original' is used in the sense that it is the initial or starting profile when you install Firefox. original-profile-name = Зыходны профіль +default-desktop-shortcut-name = { -brand-short-name } edit-profile-page-title = Рэдагаваць профіль edit-profile-page-header = Рэдагаваць ваш профіль edit-profile-page-profile-name-label = Назва профілю edit-profile-page-theme-header-2 = .label = Тэма edit-profile-page-explore-themes = Знайсці іншыя тэмы +edit-profile-page-desktop-shortcut-header = Стварыць ярлык на працоўным стале +edit-profile-page-desktop-shortcut-toggle = + .aria-label = Стварыць ярлык на працоўным стале edit-profile-page-avatar-header-2 = .label = Аватар edit-profile-page-delete-button = @@ -58,6 +62,10 @@ .placeholder = Выберыце назву, напрыклад, «Праца» або «Асабісты» new-profile-page-done-button = .label = Скончыць рэдагаванне +# Variables +# $profilename (String) - The name of the copied profile. +copied-profile-page-header = Ваша копія { $profilename } гатовая да персаналізацыі +copied-profile-page-header-description = Мы скапіравалі вашы дадзеныя і налады ў новы профіль. Цяпер дайце яму назву, выберыце выгляд і зрабіце яго сваім. profile-window-title-2 = { -brand-short-name } - Выбар профілю profile-window-logo = .alt = Лагатып { -brand-short-name } @@ -144,15 +152,23 @@ profiles-custom-theme-title = .title = Ужыць уласную тэму +## Data collection settings changed (multi-profile) + +# Full infobar message with inline bold title followed by body text +multiprofile-data-collection-message = Налады збору дадзеных зменены. Змены, зробленыя ў іншым профілі, прымяняюцца да ўсіх профіляў на гэтай прыладзе. +# Primary button label to open the Data collection section in Settings +multiprofile-data-collection-view-settings = Паглядзець налады +# Secondary button label to dismiss the infobar without action +multiprofile-data-collection-dismiss = Адхіліць + ## Alternative text for default profile icons book-avatar-alt = .alt = Кніга briefcase-avatar-alt = .alt = Партфель -# Canvas refers to an artist's painting canvas, not the general material -canvas-avatar-alt = - .alt = Палатно +picture-avatar-alt = + .alt = Выява # Craft refers to hobby arts and crafts, represented by a button/fastener commonly found on clothing like shirts craft-avatar-alt = .alt = Рамяство @@ -166,8 +182,8 @@ .alt = Сэрца heart-rate-avatar-alt = .alt = Частата пульсу -history-avatar-alt = - .alt = Гісторыя +clock-avatar-alt = + .alt = Гадзіннік leaf-avatar-alt = .alt = Ліст lightbulb-avatar-alt = @@ -190,8 +206,8 @@ .alt = Падарунак shopping-avatar-alt = .alt = Кошык -soccer-avatar-alt = - .alt = Футбол +soccer-ball-avatar-alt = + .alt = Футбольны мяч sparkle-single-avatar-alt = .alt = Бліскавіца star-avatar-alt = @@ -200,9 +216,9 @@ .alt = Кантролер для відэагульняў custom-avatar-alt = .alt = Уласны аватар -# Default favicon refers to the generic globe/world icon that appears in browser tabs when a website doesn't have its own favicon. -default-favicon-avatar-alt = - .alt = Тыповы значок сайта +# Globe refers to the generic globe/world icon that appears in browser tabs when a website doesn't have its own favicon. +globe-avatar-alt = + .alt = Глобус # Diamond refers to the precious stone, not the geometric shape diamond-avatar-alt = .alt = Алмаз @@ -211,25 +227,23 @@ bike-avatar-alt = .alt = Веласіпед -## Labels for default avatar icons +## Tooltips for default avatar icons book-avatar = Кніга briefcase-avatar = Партфель -# Canvas refers to an artist's painting canvas, not the general material -canvas-avatar = Палатно +clock-avatar = Гадзіннік # Craft refers to hobby arts and crafts, represented by a button/fastener commonly found on clothing like shirts craft-avatar = Рамяство custom-avatar = Уласны аватар -# Default favicon refers to the generic globe/world icon that appears in browser tabs when a website doesn't have its own favicon. -default-favicon-avatar = Тыповы значок сайта # Diamond refers to the precious stone, not the geometric shape diamond-avatar = Алмаз flower-avatar = Кветка folder-avatar = Папка +# Globe refers to the generic globe/world icon that appears in browser tabs when a website doesn't have its own favicon. +globe-avatar = Глобус hammer-avatar = Малаток heart-avatar = Сэрца heart-rate-avatar = Частата пульсу -history-avatar = Гісторыя leaf-avatar = Ліст lightbulb-avatar = Лямпачка makeup-avatar = Макіяж @@ -238,11 +252,12 @@ musical-note-avatar = Музычная нота palette-avatar = Палітра paw-print-avatar = Адбітак лапы +picture-avatar = Малюнак plane-avatar = Самалёт # Present refers to a gift box, not the current time period present-avatar = Падарунак shopping-avatar = Кошык -soccer-avatar = Футбол +soccer-ball-avatar = Футбольны мяч sparkle-single-avatar = Бліскавіца star-avatar = Зорка video-game-controller-avatar = Кантролер для відэагульняў @@ -254,5 +269,72 @@ .aria-label = Змяніць вобласць абрэзкі custom-avatar-drag-handle = .aria-label = Змяніць памер вобласці абрэзкі +profiles-appmenu-callout-tour-title = Ваш новы профіль гатовы да выкарыстання +# "Spin up another" means creating another profile, “Hop between your digital lives" is referring to switching between different profiles such as work, personal, etc. +profiles-appmenu-callout-tour-subtitle = У меню ☰ націсніце на назву вашага профілю, каб стварыць новы, адрэдагаваць гэты або пераключыцца паміж лічбавымі жыццямі. +profiles-appmenu-callout-tour-primary-button = Паказаць мне, як barbell-avatar = Штанга bike-avatar = Веласіпед + +## Tooltips for default avatar icons + +barbell-avatar-tooltip = + .tooltiptext = Ужыць аватар са штангай +bike-avatar-tooltip = + .tooltiptext = Ужыць аватар з байкам +book-avatar-tooltip = + .tooltiptext = Ужыць аватар з кнігай +briefcase-avatar-tooltip = + .tooltiptext = Ужыць аватар з партфелем +picture-avatar-tooltip = + .tooltiptext = Ужыць аватар з выявай +# Craft refers to hobby arts and crafts, represented by a button/fastener commonly found on clothing like shirts +craft-avatar-tooltip = + .tooltiptext = Ужыць аватар з апаратам +# Globe refers to the generic globe/world icon that appears in browser tabs when a website doesn't have its own favicon. +globe-avatar-tooltip = + .tooltiptext = Ужыць аватар з глобусам +diamond-avatar-tooltip = + .tooltiptext = Ужыць аватар з дыяментам +flower-avatar-tooltip = + .tooltiptext = Ужыць аватар з кветкай +folder-avatar-tooltip = + .tooltiptext = Ужыць аватар з папкай +hammer-avatar-tooltip = + .tooltiptext = Ужыць аватар з малатком +heart-avatar-tooltip = + .tooltiptext = Ужыць аватар з сэрцам +heart-rate-avatar-tooltip = + .tooltiptext = Ужыць аватар з пульсам +clock-avatar-tooltip = + .tooltiptext = Ужыць аватар з гадзіннікам +leaf-avatar-tooltip = + .tooltiptext = Ужыць аватар з лістом +lightbulb-avatar-tooltip = + .tooltiptext = Ужыць аватар з лямпай +makeup-avatar-tooltip = + .tooltiptext = Ужыць аватар з макіяжам +# Message refers to a text message, not a traditional letter/envelope message +message-avatar-tooltip = + .tooltiptext = Ужыць аватар з паведамленнем +musical-note-avatar-tooltip = + .tooltiptext = Ужыць аватар з музычнай нотай +palette-avatar-tooltip = + .tooltiptext = Ужыць аватар з палітрай +paw-print-avatar-tooltip = + .tooltiptext = Ужыць аватар з адбіткам лапы +plane-avatar-tooltip = + .tooltiptext = Ужыць аватар з самалётам +# Present refers to a gift box, not the current time period +present-avatar-tooltip = + .tooltiptext = Ужыць аватар з падарункам +shopping-avatar-tooltip = + .tooltiptext = Ужыць аватар з кошыкам для пакупак +soccer-ball-avatar-tooltip = + .tooltiptext = Ужыць аватар з футбольным мячом +sparkle-single-avatar-tooltip = + .tooltiptext = Ужыць аватар з бліскаўкай +star-avatar-tooltip = + .tooltiptext = Ужыць аватар з зоркай +video-game-controller-avatar-tooltip = + .tooltiptext = Ужыць аватар з кантролерам для відэагульняў diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/reportBrokenSite.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/reportBrokenSite.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/reportBrokenSite.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/reportBrokenSite.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -6,6 +6,8 @@ report-broken-site-panel-header = .label = Паведаміць пра пашкоджаны сайт .title = Паведаміць аб зламаным сайце +report-broken-site-panel-intro-text = Ваша справаздача дапамагае нам зразумець і выправіць праблемы ў { -brand-product-name }, каб зрабіць яго лепшым для ўсіх. +report-broken-site-panel-learn-more-link = Падрабязней report-broken-site-panel-intro = Дапамажыце зрабіць { -brand-product-name } лепшым для ўсіх. { -vendor-short-name } выкарыстоўвае інфармацыю, якую вы дасылаеце, для выпраўлення праблем з сайтамі. report-broken-site-panel-url = URL report-broken-site-panel-reason-label = Што пашкоджана? @@ -32,6 +34,8 @@ report-broken-site-panel-reason-other = .label = Нешта іншае report-broken-site-panel-description-label = Апішыце праблему +report-broken-site-panel-description = + .placeholder = Што здарылася? Што павінна было здарыцца? Ці дапамагло адключэнне аховы ад сачэння? report-broken-site-panel-description-optional-label = Апішыце праблему (неабавязкова) report-broken-site-panel-send-more-info-link = Адправіць больш інфармацыі report-broken-site-panel-button-cancel = @@ -47,3 +51,6 @@ report-broken-site-panel-report-sent-text = Дзякуем, што дапамагаеце { -brand-product-name } зрабіць Інтэрнэт больш адкрытым, даступным і лепшым для ўсіх. report-broken-site-panel-invalid-url-label = Калі ласка, увядзіце сапраўдны URL report-broken-site-panel-missing-reason-label = Калі ласка, выберыце прычыну +report-broken-site-panel-blocked-trackers-label = + .label = Адпраўляць URL-адрасы, заблакаваныя аховай ад сачэння +report-broken-site-panel-blocked-trackers-description = Узмоцненая ахова ад сачэння можа блакаваць трэкеры і скрыпты, неабходныя для правільнай працы некаторых сайтаў. diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/sitePermissions.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/sitePermissions.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/sitePermissions.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/sitePermissions.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -11,3 +11,5 @@ [few] Адкрыць { $count } заблакаваныя выплыўныя акны… *[many] Адкрыць { $count } заблакаваных выплыўных акон… } +# This string is used to display the option to unblock a third-party redirect. +site-permissions-unblock-redirect = Разблакаваць старонняе перанакіраванне… diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/tabContextMenu.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/tabContextMenu.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/tabContextMenu.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/tabContextMenu.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -79,6 +79,10 @@ move-to-new-window = .label = Перанесці ў новае акно .accesskey = а +# Variables +# $profileName (string): The name of the profile to move tab to +move-to-new-profile = + .label = Перанесці ў { $profileName } tab-context-close-multiple-tabs = .label = Закрыць некалькі картак .accesskey = ь diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/tabbrowser.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/tabbrowser.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/tabbrowser.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/tabbrowser.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -244,9 +244,7 @@ .label = { $tabGroupName } .tooltiptext = { $tabGroupName } — Актыўнае акно -## Variables: -## $tabGroupName (String): The name of the tab group. Defaults to the value -## of tab-group-name-default. +## tab-group-editor-title-create = Стварыць групу картак tab-group-editor-title-edit = Кіраваць групай картак @@ -279,10 +277,18 @@ tab-group-description = { $tabGroupName } — Група картак tab-group-label-tooltip-collapsed = { $tabGroupName } — Згорнута tab-group-label-tooltip-expanded = { $tabGroupName } — Разгорнута +tab-group-preview-name = + .aria-label = Карткі ў згорнутай групе tab-context-unnamed-group = .label = Група без назвы tab-group-name-default = Група без назвы +## When collapsed, the tab group label's aria-description will indicate +## whether the hover menu is open or closed. + +tab-group-preview-open-description = Спіс картак адкрыты +tab-group-preview-closed-description = Спіс картак закрыты + ## tab-context-move-tab-to-new-group = @@ -367,3 +373,22 @@ # open the tab group in that window. tab-group-context-open-saved-group-in-new-window = .label = Адкрыць групу ў новым акне + +## Split View + +# Split view tabs display their respective contents side by side +# Displayed within the tooltip on tabs inside of a tab split view +tabbrowser-tab-label-tab-split-view = Падзелены выгляд +# Open a new tab next to the current tab and display their contents side by side +tab-context-add-split-view = + .label = Дадаць падзелены выгляд + .accesskey = е +# Display the two selected tabs' contents side by side +tab-context-open-in-split-view = + .label = Адкрыць у падзеленым выглядзе + .accesskey = е +# Separate the two split view tabs and display the tabs and their contents as normal +tab-context-separate-split-view = + .label = Асобны падзелены выгляд + .accesskey = е +tab-context-badge-new = Новы diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/taskbartabs.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/taskbartabs.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/taskbartabs.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/taskbartabs.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -34,3 +34,17 @@ .tooltiptext = Сцішыць картку taskbar-tab-audio-unmute = .tooltiptext = Разцішыць картку + +## These are used as part of the window title, possibly after the content's +## title. +## +## Variables: +## $name (String): The name of the installed web app. +## $container (String): The name of the user's container (e.g. 'Work', +## 'Personal'). +## $profile (String): The name of the user's current profile. + +taskbar-tab-title-default = { $name } у { -brand-full-name } +taskbar-tab-title-container = { $name } ({ $container }) у { -brand-full-name } +taskbar-tab-title-profile = { $name } у { $profile } — { -brand-full-name } +taskbar-tab-title-container-profile = { $name } ({ $container }) у { $profile } — { -brand-full-name } diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/termsofuse.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/termsofuse.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/termsofuse.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/termsofuse.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -7,6 +7,8 @@ # Full infobar message, with inline links to the Terms of Use and Privacy Notice that will be added at runtime. existing-user-tou-message = Абнаўленне Мы ўвялі Умовы карыстання { -brand-short-name } і абнавілі наша Паведамленне аб прыватнасці. Калі ласка, азнаёмцеся з імі і прыміце іх. +# Infobar message for when the Privacy Notice is updated. +existing-user-privacy-notice-update-message = Мы абнавілі наша паведамленне аб прыватнасці, каб адлюстраваць найноўшыя функцыі ў { -brand-short-name }. # Text for secondary button linking to FAQ page existing-user-tou-learn-more = Падрабязней # Text for primary button diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/unifiedExtensions.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/unifiedExtensions.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/unifiedExtensions.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/unifiedExtensions.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -11,6 +11,15 @@ unified-extensions-header-title = Пашырэнні unified-extensions-manage-extensions = .label = Кіраваць пашырэннямі +unified-extensions-discover-extensions = + .label = Адкрыйце для сябе пашырэнні +unified-extensions-empty-reason-private-browsing-not-allowed = У вас усталяваныя пашырэнні, але яны не ўключаны ў прыватным рэжыме +unified-extensions-empty-reason-extension-not-enabled = У вас усталяваныя пашырэнні, але яны не ўключаны +# In this headline, “Level up” means to enhance your browsing experience. +unified-extensions-empty-reason-zero-extensions-onboarding = Палепшыце сваё агляданне з дапамогай пашырэнняў +unified-extensions-empty-content-explain-enable2 = Выберыце «{ unified-extensions-manage-extensions.label }», каб уключыць іх у наладах. +unified-extensions-empty-content-explain-manage2 = Выберыце «{ unified-extensions-manage-extensions.label }», каб кіраваць імі ў наладах. +unified-extensions-empty-content-explain-extensions-onboarding = Персаналізуйце { -brand-short-name }, змяніўшы яго выгляд і прадукцыйнасць або павысіўшы прыватнасць і бяспеку. ## An extension in the main list @@ -23,6 +32,9 @@ unified-extensions-item-message-manage = Кіраваць пашырэннем # Variables: # $extensionName (String) - Name of the user-enabled soft-blocked extension. +unified-extensions-item-messagebar-softblocked2 = { $extensionName } абмежаванае. Яго выкарыстанне можа быць рызыкоўным. +# Variables: +# $extensionName (String) - Name of the user-enabled soft-blocked extension. unified-extensions-item-messagebar-softblocked = { $extensionName } парушае палітыку Mozilla. Яго выкарыстанне можа быць рызыкоўным. ## Extension's context menu @@ -53,6 +65,13 @@ unified-extensions-mb-about-addons-link = Перайсці ў налады пашырэння # Variables: # $extensionName (String) - Name of the extension disabled through a soft-block. +unified-extensions-mb-blocklist-warning-single2 = + .heading = { $extensionName } адключана + .message = + Гэта пашырэнне абмежаванае і было адключана. + Вы можаце ўключыць яго ў наладах, але гэта можа быць рызыкоўна. +# Variables: +# $extensionName (String) - Name of the extension disabled through a soft-block. unified-extensions-mb-blocklist-warning-single = .heading = { $extensionName } адключана .message = @@ -65,6 +84,18 @@ .message = Гэта пашырэнне парушае палітыку Mozilla і было адключана. # Variables: # $extensionsCount (Number) - Number of extensions disabled through both soft and hard-blocks (always going to be greater than 1) +unified-extensions-mb-blocklist-warning-multiple2 = + .heading = + { $extensionsCount -> + [one] { $extensionsCount } пашырэнне адключана + [few] { $extensionsCount } пашырэнні адключана + *[many] { $extensionsCount } пашырэнняў адключана + } + .message = + Некаторыя з вашых пашырэнняў абмежаваныя і былі адключаны. + Вы можаце ўключыць іх у наладах, але гэта можа быць рызыкоўна. +# Variables: +# $extensionsCount (Number) - Number of extensions disabled through both soft and hard-blocks (always going to be greater than 1) unified-extensions-mb-blocklist-warning-multiple = .heading = { $extensionsCount -> @@ -85,3 +116,5 @@ *[many] { $extensionsCount } пашырэнняў адключана } .message = Некаторыя з вашых пашырэнняў былі адключаны за парушэнне палітык Mozilla. +unified-extensions-notice-safe-mode = + .message = Усе пашырэнні былі адключаны ў рэжыме вырашэння праблем. diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/browser/webauthnDialog.ftl firefox-esr-140.6.0esr/l10n-be/browser/browser/webauthnDialog.ftl --- firefox-esr-140.5.0esr/l10n-be/browser/browser/webauthnDialog.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/browser/webauthnDialog.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -27,3 +27,46 @@ *[many] Не ўдалося праверыць карыстальніка. У вас засталося { $retriesLeft } спроб. Паспрабуйце яшчэ. } webauthn-uv-invalid-short-prompt = Не ўдалося праверыць карыстальніка. Паспрабуйце яшчэ. + +## WebAuthn prompts + +# Variables: +# $hostname (String): the origin (website) asking for the security key. +webauthn-user-presence-prompt = Дакраніцеся да ключа бяспекі, каб працягнуць з { $hostname }. +# The website is asking for extended information about your +# hardware authenticator that shouldn't be generally necessary. Permitting +# this is safe if you only use one account at this website. If you have +# multiple accounts at this website, and you use the same hardware +# authenticator, then the website could link those accounts together. +# And this is true even if you use a different profile / browser (or even Tor +# Browser). To avoid this, you should use different hardware authenticators +# for different accounts on this website. +# Variables: +# $hostname (String): the origin (website) asking for the extended information. +webauthn-register-direct-prompt = { $hostname } запытвае пашыраную інфармацыю аб вашым ключы бяспекі, што можа адбіцца на вашай прыватнасці. +webauthn-register-direct-prompt-hint = { -brand-short-name } можа ананімізаваць гэта для вас, але вэб-сайт можа адхіліць гэты ключ. У выпадку адмовы вы можаце паспрабаваць яшчэ раз. +# Variables: +# $hostname (String): the origin (website) for which an account needs to be selected. +webauthn-select-sign-result-prompt = Для { $hostname } знойдзена некалькі ўліковых запісаў. Выберыце, які выкарыстоўваць або адмяніце. +# Variables: +# $hostname (String): the origin (website) for which a device needs to be selected. +webauthn-select-device-prompt = Для { $hostname } знойдзена некалькі прылад. Выберыце патрэбную. +# Variables: +# $hostname (String): the origin (website) for which user verification failed. +webauthn-device-blocked-prompt = Не ўдалося праверыць карыстальніка { $hostname }. Спроб не засталося і ваша прылада была заблакавана, таму што занадта шмат разоў быў уведзены няправільны PIN-код. Прылада патрабуе скіду. +# Variables: +# $hostname (String): the origin (website) for which user verification failed. +webauthn-pin-auth-blocked-prompt = Не ўдалося праверыць карыстальніка { $hostname }. Было занадта шмат няўдалых спроб запар і аўтэнтыфікацыя з дапамогай PIN-кода была часова заблакавана. Вашу прыладу трэба перападключыць (адключыце і зноў падключыце). +# Variables: +# $hostname (String): the origin (website) for which user verification failed. +webauthn-pin-not-set-prompt = Праверка карыстальніка на { $hostname } не ўдалася. Магчыма, вам трэба ўсталяваць PIN-код на сваёй прыладзе. +# Variables: +# $hostname (String): the origin (website) for which user verification failed. +webauthn-uv-blocked-prompt = Не ўдалося праверыць карыстальніка { $hostname }. Было занадта шмат няўдалых спроб, і ўбудаваны метад праверкі карыстальніка быў заблакаваны. +webauthn-already-registered-prompt = Гэта прылада ўжо зарэгістравана. Паспрабуйце іншую прыладу. +webauthn-cancel = Скасаваць + .accesskey = с +webauthn-allow = Дазволіць + .accesskey = Д +webauthn-block = Блакаваць + .accesskey = Б diff -Nru firefox-esr-140.5.0esr/l10n-be/browser/chrome/browser/browser.properties firefox-esr-140.6.0esr/l10n-be/browser/chrome/browser/browser.properties --- firefox-esr-140.5.0esr/l10n-be/browser/chrome/browser/browser.properties 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/browser/chrome/browser/browser.properties 2025-11-21 02:32:14.000000000 +0000 @@ -322,18 +322,22 @@ webNotifications.receiveFromSite3 = Дазволіць %S адпраўляць вам абвесткі? # localhost and localnetwork permission UI # %S is replaced by the origin of the website +localhost.allowWithSite2 = %S хоча атрымаць доступ да іншых праграм і службаў на гэтай прыладзе. +# localhost and localnetwork permission UI +# %S is replaced by the origin of the website localhost.allowWithSite = Дазволіць %S доступ да іншых праграм і службаў на гэтай прыладзе? localhost.remember2 = Запомніць мой выбар для гэтага сайта -localhost.remember = Не пытаць зноў для гэтага сайта localhost.allowlabel = Дазволіць localhost.blocklabel = Блакаваць localhost.allow.accesskey = Д localhost.block.accesskey = Б # local-network permission UI # %S is replaced by the origin of the website +localNetwork.allowWithSite2 = %S хоча атрымаць доступ да праграм і службаў на прыладах, падлучаных да вашай лакальнай сеткі. +# local-network permission UI +# %S is replaced by the origin of the website localNetwork.allowWithSite = Дазволіць %S доступ да праграм і службаў на прыладах, падлучаных да вашай лакальнай сеткі? localNetwork.remember2 = Запомніць мой выбар для гэтага сайта -localNetwork.remember = Не пытаць зноў для гэтага сайта localNetwork.allowLabel = Дазволіць localNetwork.allow.accesskey = Д localNetwork.blockLabel = Блакаваць diff -Nru firefox-esr-140.5.0esr/l10n-be/devtools/client/debugger.properties firefox-esr-140.6.0esr/l10n-be/devtools/client/debugger.properties --- firefox-esr-140.5.0esr/l10n-be/devtools/client/debugger.properties 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/devtools/client/debugger.properties 2025-11-21 02:32:14.000000000 +0000 @@ -498,6 +498,12 @@ # LOCALIZATION NOTE (settings.showPausedOverlay.tooltip): Context menu item # tooltip for showing the paused overlay when enabled. settings.showPausedOverlay.tooltip = Паказваць напаўпразрыстае накладанне на старонцы, калі адладчык прыпынены. +# LOCALIZATION NOTE (settings.autoPrettyPrint.label): Context menu item +# label for enabling automatic pretty printing of all opened sources. +settings.autoPrettyPrint.label = Аўтаматычны прыгожы друк +# LOCALIZATION NOTE (settings.autoPrettyPrint.tooltip): Context menu item +# tooltip for enabling automatic pretty printing of all opened sources. +settings.autoPrettyPrint.tooltip = Усе зыходныя коды ў адладчыку будуць аўтаматычна надрукаваны ў прыгожым выглядзе # LOCALIZATION NOTE (sources-settings.button.label): Label for Settings button displayed in the Source Tree sources-settings.button.label = Налады крыніцы # LOCALIZATION NOTE (sources-settings.showContentScripts.label): Context menu item diff -Nru firefox-esr-140.5.0esr/l10n-be/devtools/client/storage.ftl firefox-esr-140.6.0esr/l10n-be/devtools/client/storage.ftl --- firefox-esr-140.5.0esr/l10n-be/devtools/client/storage.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/devtools/client/storage.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -71,6 +71,7 @@ storage-table-headers-cookies-size = Памер storage-table-headers-cookies-last-accessed = Апошні доступ storage-table-headers-cookies-creation-time = Створана +storage-table-headers-cookies-update-time = Абноўлена storage-table-headers-cache-status = Статус storage-table-headers-extension-storage-area = Абсяг сховішча diff -Nru firefox-esr-140.5.0esr/l10n-be/devtools/client/toolbox-options.ftl firefox-esr-140.6.0esr/l10n-be/devtools/client/toolbox-options.ftl --- firefox-esr-140.5.0esr/l10n-be/devtools/client/toolbox-options.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/devtools/client/toolbox-options.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -30,6 +30,10 @@ options-show-user-agent-styles-label = Паказаць стылі браўзера options-show-user-agent-styles-tooltip = .title = Калі ўключана, будзе паказваць прадвызначаныя стылі, загружаныя браўзерам. +# The label for the checkbox option to show all anonymous content +options-show-user-agent-shadow-dom-label = Паказаць DOM ценявога аб'екта браўзера +options-show-user-agent-shadow-dom-tooltip = + .title = Уключэнне гэтай опцыі дазволіць паказваць элементы ценявога DOM, якія апрацоўваюцца браўзерам. # The label for the checkbox option to enable collapse attributes options-collapse-attrs-label = Абсякаць атрыбуты DOM options-collapse-attrs-tooltip = @@ -116,6 +120,8 @@ options-disable-http-cache-tooltip = .title = Калі ўключана, забараняе кэш HTTP для ўсіх картак, на якіх адкрыта панэль прылад. Гэты параметр не дзейнічае на воркеры сэрвісу. # The label for checkbox that toggles JavaScript on or off +options-disable-javascript-label-2 = Адключыць JavaScript +# The label for checkbox that toggles JavaScript on or off options-disable-javascript-label = Забараніць JavaScript * options-disable-javascript-tooltip = .title = Уключэнне гэтага параметра адключыць JavaScript у дзейнай картцы. Параметр забудзецца пасля закрыцця карткі або прылад распрацоўкі. @@ -143,5 +149,11 @@ options-source-maps-label = Уключыць мапы зыходнага коду options-source-maps-tooltip = .title = Калі ўключана, зыходныя коды будуць супастаўлены ў інструментах. -# The message shown for settings that trigger page reload +# The message shown for settings that trigger page reload and will only apply to the current session +# This appears underneath the applicable options (e.g. options-disable-javascript-label-2). +options-context-triggers-page-refresh-temporary = (толькі бягучы сеанс, перазагрузка старонкі) +# The message shown for settings that trigger page reload and will only apply to the current session options-context-triggers-page-refresh = * Толькі для бягучага сеанса, перазагружае старонку +# The message shown for settings that trigger page reload +# This appears underneath the applicable options (e.g. options-show-user-agent-shadow-dom-label). +options-context-triggers-page-refresh-persists = (перазагружае старонку) diff -Nru firefox-esr-140.5.0esr/l10n-be/devtools/client/tooltips.ftl firefox-esr-140.6.0esr/l10n-be/devtools/client/tooltips.ftl --- firefox-esr-140.5.0esr/l10n-be/devtools/client/tooltips.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/devtools/client/tooltips.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -35,6 +35,7 @@ inactive-css-only-non-grid-or-flex-item = { $property } не мае ніякага эфекту, таму што яе нельга выкарыстоўваць для grid- або flex-элементаў. inactive-css-not-block = { $property } не ўплывае на гэты элемент, таму што яна прымяняецца толькі да элементаў блочных элементаў. inactive-css-not-block-container = { $property } не ўплывае на гэты элемент, бо яна прымяняецца толькі да блочных кантэйнерных элементаў. +inactive-css-not-block-flex-grid-container = { $property } не ўплывае на гэты элемент, бо яна прымяняецца толькі да кантэйнерных элементаў block, flex і grid. inactive-css-not-floated = { $property } не мае ніякага эфекту, таму што прымяняецца толькі да элементаў, якія плаваюць. inactive-css-property-is-impossible-to-override-in-visited = Немагчыма перавызначыць { $property } з-за абмежавання :visited. inactive-css-position-property-on-unpositioned-box = { $property } не ўплывае на гэты элемент, паколькі ён не пазіцыянаваны элемент. @@ -96,6 +97,7 @@ inactive-css-only-non-grid-or-flex-item-fix = Паспрабуйце змяніць значэнне display кантэйнера элемента на нешта іншае, чым flex, grid, inline-flex або inline-grid, ці выдаліць float. { learn-more } inactive-css-not-block-fix = Паспрабуйце дадаць уласцівасці, такія як display:block ці float:left. { learn-more } inactive-css-not-block-container-fix = Паспрабуйце дадаць display:block, display:inline-block або display:flow-root. { learn-more } +inactive-css-not-block-flex-grid-container-fix = Паспрабуйце дадаць display:block, display:inline-block, display:flex, display:inline-flex, display:grid, display:inline-grid або display:flow-root. { learn-more } inactive-css-not-floated-fix = Паспрабуйце дадаць уласцівасць float са значэннем, адрозным ад none. { learn-more } inactive-css-position-property-on-unpositioned-box-fix = Паспрабуйце ўсталяваць яго ўласцівасць position на што-небудзь іншае, ніж static. { learn-more } inactive-css-only-replaced-elements-fix = Пераканайцеся, што дадаяце ўласцівасць да замененага элемента. { learn-more } diff -Nru firefox-esr-140.5.0esr/l10n-be/devtools/client/webconsole.properties firefox-esr-140.6.0esr/l10n-be/devtools/client/webconsole.properties --- firefox-esr-140.5.0esr/l10n-be/devtools/client/webconsole.properties 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/devtools/client/webconsole.properties 2025-11-21 02:32:14.000000000 +0000 @@ -205,6 +205,10 @@ # the output of the console. webconsole.menu.saveAllMessagesFile.label = Запісаць усе паведамленні ў файл webconsole.menu.saveAllMessagesFile.accesskey = а +# LOCALIZATION NOTE (webconsole.clearButton.tooltipWithHotkeyHint) +# Label used for the tooltip on the clear logs button in the console top toolbar bar. +# Clicking on it will clear the content of the console. +webconsole.clearButton.tooltipWithHotkeyHint = Ачысціць вывад у Кансолі Сеціва (%S) # LOCALIZATION NOTE (webconsole.clearButton.tooltip) # Label used for the tooltip on the clear logs button in the console top toolbar bar. # Clicking on it will clear the content of the console. diff -Nru firefox-esr-140.5.0esr/l10n-be/devtools/shared/styleinspector.properties firefox-esr-140.6.0esr/l10n-be/devtools/shared/styleinspector.properties --- firefox-esr-140.5.0esr/l10n-be/devtools/shared/styleinspector.properties 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/devtools/shared/styleinspector.properties 2025-11-21 02:32:14.000000000 +0000 @@ -67,6 +67,13 @@ # of the ↱ button that is shown next to a CSS variable used in a declaration value in the # rule view. rule.variableJumpDefinition.title = Перайсці да азначэння зменнай +# LOCALIZATION NOTE (rule.showUnusedCssVariable): Text for the button displayed in the rules +# view when some of the CSS variables of the rule are hidden. +# This is a semi-colon list of plural forms. +# See: http://developer.mozilla.org/en/docs/Localization_and_Plurals +##1 is the number of hidden unused variables +# example: Show 345 unused custom CSS properties. +rule.showUnusedCssVariable = Паказаць #1 нявыкарыстаную карыстальніцкую ўласцівасць CSS;Паказаць #1 нявыкарыстаныя карыстальніцкія ўласцівасці CSS;Паказаць #1 нявыкарыстаных карыстальніцкіх уласцівасцяў CSS # LOCALIZATION NOTE (rule.empty): Text displayed when the highlighter is # first opened and there's no node selected in the rule view. rule.empty = Элемент не вылучаны. diff -Nru firefox-esr-140.5.0esr/l10n-be/dom/chrome/dom/dom.properties firefox-esr-140.6.0esr/l10n-be/dom/chrome/dom/dom.properties --- firefox-esr-140.5.0esr/l10n-be/dom/chrome/dom/dom.properties 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/dom/chrome/dom/dom.properties 2025-11-21 02:32:14.000000000 +0000 @@ -433,6 +433,12 @@ MathML_DeprecatedMathSpaceValue2Warning = Значэнне даўжыні MathML «%S» састарэла і будзе выдалена ў будучыні. # LOCALIZATION NOTE: Do not translate mathvariant or MathML. %S is the deprecated value of the mathvariant attribute. MathML_DeprecatedMathVariantWarning = “mathvariant='%S'” для элементаў MathML састарэў і будзе выдалены ў будучыні. +# LOCALIZATION NOTE: Do not translate accent and mo (it's the name of a MathML element). %1$S is either accent or accentunder. %2$S is the name of the parent frame. +MathML_DeprecatedMoExplicitAccentWarning = Усталёўка атрыбута accent для элементаў mo з'яўляецца састарэлым рашэннем. Замест гэтага выкарыстоўвайце атрыбут «%1$S» для «%2$S». +# LOCALIZATION NOTE: Do not translate accent. %S is either mover or munderover. +MathML_DeprecatedMoverNonExplicitAccentWarning = Вывядзенне ўласцівасці accent з асноўнага аператара састарэла. Разгледзьце магчымасць дадаць яўны атрыбут accent да “%S”. +# LOCALIZATION NOTE: Do not translate accentunder. %S is either munder or munderover. +MathML_DeprecatedMunderNonExplicitAccentunderWarning = Вывядзенне ўласцівасці accentunder з асноўнага аператара састарэла. Разгледзьце магчымасць дадаць яўны атрыбут accentunder да “%S”. # LOCALIZATION NOTE: Do not translate MathML and STIXGeneral. %S is a documentation URL. MathML_DeprecatedStixgeneralOperatorStretchingWarning = Падтрымка адлюстравання аператараў MathML у расцягнутым выглядзе са шрыфтамі STIXGeneral састарэла і можа быць выдалена ў будучыні. Даведайцеся пра больш новыя шрыфты, якія і надалей будуць падтрымлівацца, тут: %S # LOCALIZATION NOTE: Do not translate MathML and scriptminsize. @@ -507,3 +513,8 @@ BeforeScriptExecuteEventNotSupportedWarning = Даданне слухача для падзей beforescriptexecute больш не падтрымліваецца. # LOCALIZATION NOTE: Do not translate "intercept()". %1$S is the overridden option, %2$S is the new value and %3$S is the old value. PreviousInterceptCallOptionOverriddenWarning = Параметр ’%1$S’ для папярэдняга выкліку intercept() быў перавызначаны ’%2$S’, а папярэдняе значэнне ’%3$S’ будзе праігнаравана. +# LOCALIZATION NOTE: Do not translate "Window.fullScreen". +FullscreenAttributeWarning = Атрыбут Window.fullScreen з'яўляецца састарэлым і будзе выдалены ў будучыні. +# LOCALIZATION NOTE: Wake lock related strings for system notifications +WakeLockVideoPlaying = Прайграванне відэа +WakeLockAudioPlaying = Прайграванне гуку diff -Nru firefox-esr-140.5.0esr/l10n-be/dom/chrome/security/security.properties firefox-esr-140.6.0esr/l10n-be/dom/chrome/security/security.properties --- firefox-esr-140.5.0esr/l10n-be/dom/chrome/security/security.properties 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/dom/chrome/security/security.properties 2025-11-21 02:32:14.000000000 +0000 @@ -144,6 +144,9 @@ # LOCALIZATION NOTE: %S is the URL of the blocked request; SandboxBlockedCustomProtocols = Навiгацыя да адмысловага пратакола “%S” з кантэксту пясочнiцы заблакавана. # Sanitizer API +# LOCALIZATION NOTE: %S is the URL of the blocked request; +SanitizerAllowElementIgnored = Выклік allowElement() з “attributes” або непустым “removeAttributes” быў праігнараваны з-за глабальнага спісу “removeElements”. +# Sanitizer API # LOCALIZATION NOTE: Please do not localize "DocumentFragment". It's the name of an API. SanitizerRcvdNoInput = Увод пусты альбо не быў атрыманы. Вяртанне пустога DocumentFragment. # LOCALIZATION NOTE: %S is the URI of the blocked script. diff -Nru firefox-esr-140.5.0esr/l10n-be/netwerk/necko.properties firefox-esr-140.6.0esr/l10n-be/netwerk/necko.properties --- firefox-esr-140.5.0esr/l10n-be/netwerk/necko.properties 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/netwerk/necko.properties 2025-11-21 02:32:14.000000000 +0000 @@ -113,3 +113,7 @@ # example: The resource at was blocked by OpaqueResponseBlocking. Reason: “nosniff with either blocklisted or text/plain”. ResourceBlockedORB = Рэсурс на «%1$S» быў заблакаваны OpaqueResponseBlocking. Прычына: «%2$S». InvalidHTTPResponseStatusLine = Радок стану адказу HTTP несапраўдны +# LOCALIZATION NOTE (LocalNetworkAccessDetected): %1$S is top-level site, %2$S is initiator, %3$S is target URL, %4$S is target IP, %5$S is port, %6$S is mechanism (e.g., fetch, xhr, websocket), %7$S is secure context (true or false), %8$S is prompt action (values: "Allow", "Deny", or "(empty)" if no prompt shown) +LocalNetworkAccessDetected = Выяўлены доступ да лакальнай сеткі: сайт верхняга ўзроўню «%1$S», ініцыятар «%2$S», доступ да мэты «%3$S» (%4$S:%5$S) праз %6$S. Бяспечны кантэкст: %7$S, аператыўнае дзеянне: %8$S +# LOCALIZATION NOTE (LocalNetworkAccessPermissionRequired): %1$S is top-level site, %2$S is initiator, %3$S is target URL, %4$S is target IP, %5$S is port, %6$S is mechanism (e.g., fetch, xhr, websocket), %7$S is secure context (true or false) +LocalNetworkAccessPermissionRequired = Патрабуецца дазвол на доступ да лакальнай сеткі: сайт верхняга ўзроўню «%1$S», ініцыятар «%2$S», спроба доступу да мэты «%3$S» (%4$S:%5$S) праз %6$S. Бяспечны кантэкст: %7$S diff -Nru firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/about/aboutAddons.ftl firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/about/aboutAddons.ftl --- firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/about/aboutAddons.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/about/aboutAddons.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -170,6 +170,8 @@ extensions-warning-imported-addons2 = .message = Калі ласка, завяршыце ўсталяванне пашырэнняў, якія былі імпартаваны ў { -brand-short-name }. extensions-warning-imported-addons-button = Усталяваць пашырэнні +extensions-warning-safe-mode3 = + .message = Усе дадаткі адключаны ў рэжыме вырашэння праблем. ## Strings connected to add-on updates @@ -292,6 +294,10 @@ новыя версіі на сайце дадаткаў. colorway-removal-notice-learn-more = Падрабязней colorway-removal-notice-button = Атрымаць абноўленыя тэмы расфарбовак +# Notice to make user aware that themes are not applied in forced colors mode. +# This notice is only visible on Windows. +forced-colors-theme-notice = + .message = Вашы налады кантраснасці Windows перавызначаюць тэмы { -brand-short-name }. Выключыце гэтыя налады, каб выкарыстоўваць тэмы ў { -brand-short-name }. privacy-policy = Палітыка прыватнасці # Refers to the author of an add-on, shown below the name of the add-on. # Variables: @@ -540,6 +546,14 @@ details-notification-unsigned-link = Больш звестак details-notification-blocked = { $name } забаронены, бо маюцца праблемы сумяшчальнасці або ўстойлівасці. details-notification-blocked-link2 = Паказаць падрабязнасці +details-notification-soft-blocked-extension-disabled2 = + .message = Гэта пашырэнне абмежавана і было адключана. Вы можаце яго ўключыць, але гэта можа быць рызыкоўна. +details-notification-soft-blocked-extension-enabled2 = + .message = Гэта пашырэнне абмежаванае. Яго выкарыстанне можа быць рызыкоўным. +details-notification-soft-blocked-other-disabled2 = + .message = Гэты дадатак абмежаваны і быў адключаны. Вы можаце яго ўключыць, але гэта можа быць рызыкоўна. +details-notification-soft-blocked-other-enabled2 = + .message = Гэты дадатак абмежаваны. Яго выкарыстанне можа быць рызыкоўным. details-notification-soft-blocked-extension-disabled = .message = Гэта пашырэнне абмежавана з-за парушэння палітык Mozilla і было адключана. Вы можаце ўключыць яго, але гэта можа быць рызыкоўна. details-notification-soft-blocked-extension-enabled = diff -Nru firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/about/aboutGlean.ftl firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/about/aboutGlean.ftl --- firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/about/aboutGlean.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/about/aboutGlean.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -155,6 +155,31 @@ about-glean-metrics-table-header-value = Значэнне # This message refers to the UI action buttons for a given metric. about-glean-metrics-table-header-actions = Дзеянні +about-glean-metrics-table-settings-button = Налады +# Settings for the metrics table and its visualizations in about:glean +about-glean-metrics-table-settings-title = Налады табліцы паказчыкаў +about-glean-metrics-table-settings-category-general = Агульныя +about-glean-metrics-table-settings-hide-empty-value-rows = Схаваць пустыя радкі значэнняў +about-glean-metrics-table-settings-category-visualizations = Візуалізацыі +# This is a heading that is immediately followed by an example data visualization +about-glean-metrics-table-settings-visualization-example = Прыклад +about-glean-metrics-table-settings-category-visualizations-histogram = Гістаграма +about-glean-metrics-table-settings-histograms-chart-max = Максімальная вышыня дыяграмы +# The maximum height after to which the y-values on the chart will be scaled +about-glean-metrics-table-settings-histograms-scaled-max = Максімальная вышыня па маштабе +about-glean-metrics-table-settings-histograms-box-padding = Водступы поля +about-glean-metrics-table-settings-histograms-chart-padding = Водступы дыяграмы +about-glean-metrics-table-settings-histograms-left-padding = Дадатковы водступ злева +about-glean-metrics-table-settings-category-visualizations-timeline = Шкала часу +about-glean-metrics-table-settings-timelines-height = Вышыня +about-glean-metrics-table-settings-timelines-width = Шырыня +about-glean-metrics-table-settings-timelines-chart-padding = Водступы дыяграмы +# The radius of each circle denoting individual events recorded for an event metric +about-glean-metrics-table-settings-timelines-circle-radius = Радыус акружнасці +# The offset on the x-axis from the end of the horizontal line for the y-axis line +about-glean-metrics-table-settings-timelines-vertical-line-x-offset = Зрушэнне восі Y па восі X +# The offset on the y-axis from the x-axis for the y-axis line +about-glean-metrics-table-settings-timelines-vertical-line-y-offset = Зрушэнне па восі Y па восі Y # Label displayed near an input field that can be used to filter metrics about-glean-label-for-filter-metrics = Фільтр # This message sits alongside an input field, further describing its purpose. @@ -171,9 +196,22 @@ about-glean-button-watch = Назіраць # Meaning "to stop watching" about-glean-button-unwatch = Не назіраць +about-glean-no-data-to-display = Няма дадзеных для адлюстравання. # Do not translate strings between tags. about-glean-labeled-metric-warning = Паказчыкі з пазнакамі пакуль не падтрымліваюцца ў праглядзе about:glean. about-glean-unknown-metric-type-warning = Невядомы тып паказчыка. +about-glean-enable-new-features-promo = + .message = Мы працуем над даданнем новых функцый! Яны ўсё яшчэ знаходзяцца ў актыўнай распрацоўцы, але націсніце кнопку дзеяння тут, калі хочаце іх уключыць. + .heading = Новыя функцыі на падыходзе! +about-glean-enable-new-features-button = Уключыць новыя функцыі +about-glean-disable-new-features-button = Адключыць новыя функцыі about-glean-about-data-explanation = Каб прагледзець спіс сабраных звестак, звярніцеся да Слоўніка { -glean-brand-name }. + +## These labels are displayed to organize the different ping types within the dropdown. + +about-glean-ping-list-optgroup-built-in = + .label = Убудаваныя пінгі +about-glean-ping-list-optgroup-custom = + .label = Карыстальніцкія пінгі diff -Nru firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/about/aboutLogging.ftl firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/about/aboutLogging.ftl --- firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/about/aboutLogging.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/about/aboutLogging.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -101,4 +101,27 @@ about-logging-upload-error = Пры зацягванні профілю здарылася памылка: { $errorText } # Variables: # $errorText (string) - The received error message, inserted as is. +about-logging-profile-storage-error = Пры захаванні зацягнутага профілю здарылася памылка: { $errorText } +# Variables: +# $errorText (string) - The received error message, inserted as is. about-logging-save-error = Пры захаванні файла здарылася памылка: { $errorText } + +## Uploaded Profiles section + +# This string is used as the default name for performance profiles when they are +# uploaded from about:logging and saved to the local database. The generated +# name will appear in the "Uploaded Profiles" section list, allowing users to +# identify when each profile was captured. +# Variables: +# $date (date) - The date and time when the profile was uploaded +about-logging-uploaded-profile-name = Профіль { DATETIME($date, dateStyle: "short", timeStyle: "medium") } +about-logging-uploaded-profiles-title = Зацягнутыя профілі +about-logging-no-uploaded-profiles = Ніводнага профілю яшчэ не зацягнута. +about-logging-delete-uploaded-profile = Выдаліць +about-logging-view-uploaded-profile = Паглядзець профіль +about-logging-delete-profile-confirm-title = Выдаліць профіль +# Confirmation message shown when deleting an uploaded profile. +# Variables: +# $profileName (string) - The name of the profile being deleted. +about-logging-delete-profile-confirm = Вы ўпэўнены, што хочаце выдаліць профіль «{ $profileName }»? Гэта дзеянне нельга адмяніць. +about-logging-deleting-profile = Выдаленне… diff -Nru firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/about/certviewer.ftl firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/about/certviewer.ftl --- firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/about/certviewer.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/about/certviewer.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -36,6 +36,9 @@ certificate-viewer-inc-locality = Месцазнаходжанне certificate-viewer-locality = Месцазнаходжанне certificate-viewer-location = Размяшчэнне +# Log is a noun meaning a record of events. +certificate-viewer-log-name = Назва журнала +# Log is a noun meaning a record of events. certificate-viewer-logid = Ідэнтыфікатар журнала certificate-viewer-method = Метад certificate-viewer-modulus = Модуль @@ -110,6 +113,8 @@ # Label for a tab where we haven't found a better label: certificate-viewer-unknown-group-label = (невядома) +# Name for a file where we haven't found a better name: +certificate-viewer-unknown-file-name = сертыфікат ## Labels for tabs displayed in stand-alone about:certificate page diff -Nru firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/about/url-classifier.ftl firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/about/url-classifier.ftl --- firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/about/url-classifier.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/about/url-classifier.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -14,6 +14,7 @@ url-classifier-search-input = URL url-classifier-search-error-invalid-url = Несапраўдны URL url-classifier-search-error-no-features = Функцыі не выбраны +url-classifier-search-error-no-results = Запісаў для URL не знойдзена url-classifier-search-btn = Пачаць пошук url-classifier-search-features = Функцыі url-classifier-search-listType = Тып спіса diff -Nru firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/firefoxlabs/features.ftl firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/firefoxlabs/features.ftl --- firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/firefoxlabs/features.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/firefoxlabs/features.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -73,3 +73,7 @@ experimental-features-newtab-widget-lists-and-timer = .label = Спісы і таймер у { -firefox-home-brand-name } experimental-features-newtab-widget-lists-and-timer-description = Трымайце свой спіс спраў як напамін, калі адкрываеце новую картку. Ад спісаў рэчаў да спісаў пакупак — складайце свае планы ў { -brand-product-name }. Пастаўце таймер, каб трымаць канцэнтрацыю, падштурхоўваць вас не збіцца з шляху, ці нагадаць пра падзарадку. Падзяліцца водгукам +# Semantic History Search +experimental-features-semantic-history-search = + .label = Семантычны пошук у гісторыі +experimental-features-semantic-history-search-description = Выкарыстоўвайце лакальную мадэль машыннага навучання, каб прапаноўваць запісы з гісторыі, звязаныя з вашымі пошукамі, на аснове разумення натуральнай мовы ў адрасным радку { -brand-product-name }. Падзяліцца водгукам diff -Nru firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/global/browser-utils.ftl firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/global/browser-utils.ftl --- firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/global/browser-utils.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/global/browser-utils.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -4,6 +4,12 @@ # Used for data: URLs where we don't have any useful origin information browser-utils-url-data = (дадзеныя) +# Variables: +# $scheme (string) - URI scheme like jar: about: +browser-utils-url-scheme = здатак { $scheme } +# Special case of done-scheme for file: +# This is used as an eTLD replacement for local files, so make it lower case +browser-utils-file-scheme = мясцовы файл # Used for extension URLs # Variables: # $extension (string) - Name of the extension that generated the URL diff -Nru firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/global/datetimepicker.ftl firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/global/datetimepicker.ftl --- firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/global/datetimepicker.ftl 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/global/datetimepicker.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -0,0 +1,94 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + + +### Datetimepicker - Dialog for default HTML's + + +## These labels are used by screenreaders and other assistive technology +## to indicate the purpose of this picker as both a calendar with a month-year +## and a time selection dialog for HTML's + +datetime-picker-label = + .aria-label = Выбраць дату і час + +## These labels are used by screenreaders and other assistive technology +## to indicate the purpose of a date picker calendar and a month-year selection +## spinner dialogs for HTML's default + +date-picker-label = + .aria-label = Выберыце дату +date-spinner-label = + .aria-label = Выберыце месяц і год + +## Text of the clear button + +date-picker-clear-button = Ачысціць + +## These labels are used by screenreaders and other assistive technology +## to indicate the purpose of buttons that leaf through months of a calendar + +date-picker-previous = + .aria-label = Папярэдні месяц +date-picker-next = + .aria-label = Наступны месяц + +## These labels are used by screenreaders and other assistive technology +## to indicate the type of a value/unit that is being selected within a +## Month/Year date spinner dialogs on a datepicker calendar dialog + +date-spinner-month = + .aria-label = Месяц +date-spinner-year = + .aria-label = Год + +## These labels are used by screenreaders and other assistive technology +## to indicate the purpose of buttons that leaf through either months +## or years of a Month/Year date spinner on a datepicker calendar dialog + +date-spinner-month-previous = + .aria-label = Папярэдні месяц +date-spinner-month-next = + .aria-label = Наступны месяц +date-spinner-year-previous = + .aria-label = Папярэдні год +date-spinner-year-next = + .aria-label = Наступны год + +## This label is used by screenreaders and other assistive technology +## to indicate the purpose of a time picker dialog +## for HTML's default + +time-picker-label = + .aria-label = Выбраць час + +## These labels are used by screenreaders and other assistive technology +## to indicate the type of a value/unit that is being selected within a +## time spinners on a timepicker dialog + +time-spinner-hour-label = + .aria-label = Гадзіна +time-spinner-minute-label = + .aria-label = Хвіліна +# For example, in English, when the 24 hours of the day are divided into two +# periods of 12 hours, the time of the day, or the period of the day is either +# AM (for 00:00-11:59) or PM (for 12:00-23:59), i.e. noon is 12 PM, midnight - 12 AM +time-spinner-day-period-label = + .aria-label = Перыяд сутак + +## These labels are used by screenreaders and other assistive technology +## to indicate the purpose of buttons that leaf through time units of a spinner on a timepicker dialog + +time-spinner-hour-previous = + .aria-label = Папярэдняя гадзіна +time-spinner-hour-next = + .aria-label = Наступная гадзіна +time-spinner-minute-previous = + .aria-label = Папярэдняя хвіліна +time-spinner-minute-next = + .aria-label = Наступная хвіліна +time-spinner-day-period-previous = + .aria-label = Папярэдні перыяд сутак +time-spinner-day-period-next = + .aria-label = Наступны перыяд сутак diff -Nru firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/global/handlerDialog.ftl firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/global/handlerDialog.ftl --- firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/global/handlerDialog.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/global/handlerDialog.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -20,6 +20,17 @@ permission-dialog-description-extension-app = Дазволіць пашырэнню { $extension } адкрыць спасылку { $scheme } з дапамогай { $appName }? permission-dialog-description-system-app = Адкрыць спасылку { $scheme } у { $appName }? permission-dialog-description-system-noapp = Адкрыць спасылку { $scheme }? +# Header on a permission prompt, asking the user if they should allow the website to continue. +wallet-custom-scheme-warning-heading = + .heading = Дазволіць гэтаму сайту адкрыць ваш лічбавы кашалёк? +# Warning given to the user that the current page is trying to open their digital wallet app +wallet-custom-scheme-warning-host-app = Адкрыццё спасылкі { $scheme } дазваляе { $host } запытаць вашу сапраўдную асобу з дапамогай { $appName }. Працягвайце, толькі калі давяраеце гэтаму сайту. +# Warning given to the user that the current page is trying to open their digital wallet app +wallet-custom-scheme-warning-app = Адкрыццё спасылкі { $scheme } дазваляе гэтаму сайту запытаць вашу сапраўдную асобу з дапамогай { $appName }. Працягвайце, толькі калі давяраеце гэтаму сайту. +# Warning given to the user that the current page is trying to open their digital wallet app +wallet-custom-scheme-warning-host = Адкрыццё спасылкі { $scheme } дазваляе { $host } запытаць вашу сапраўдную асобу з вашага лічбавага кашалька. Працягвайце, толькі калі давяраеце гэтаму сайту. +# Warning given to the user that the current page is trying to open their digital wallet app +wallet-custom-scheme-warning = Адкрыццё спасылкі { $scheme } дазваляе гэтаму сайту запытаць вашу сапраўдную асобу з вашага лічбавага кашалька. Працягвайце, толькі калі давяраеце гэтаму сайту. ## Please keep the emphasis around the hostname and scheme (ie the ## `` HTML tags). Please also keep the hostname as close to the start diff -Nru firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/global/mozButton.ftl firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/global/mozButton.ftl --- firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/global/mozButton.ftl 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/global/mozButton.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -0,0 +1,7 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +moz-button-more-options = + .title = Дадатковыя налады + .aria-label = Дадатковыя параметры diff -Nru firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/global/mozPageHeader.ftl firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/global/mozPageHeader.ftl --- firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/global/mozPageHeader.ftl 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/global/mozPageHeader.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -0,0 +1,6 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +back-nav-button-title = + .title = Вярнуцца назад diff -Nru firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/global/textActions.ftl firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/global/textActions.ftl --- firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/global/textActions.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/global/textActions.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -68,9 +68,9 @@ .title = Ачысціць text-action-highlight-selection = .label = Падфарбаваць вылучэнне -# Comment is a verb. This adds a comment to selected text within the PDF viewer. -text-action-comment-selection = - .label = Каментаваць вылучанае +# This adds a comment to selected text within the PDF viewer. +text-action-comment-selection-1 = + .label = Дадаць каментарый да вылучэння # "Copy Link to Highlight" creates a permanent 'Text Fragment' link # to the current selection, and copies it into the user's clipboard. text-action-copy-link-to-highlight = diff -Nru firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/neterror/certError.ftl firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/neterror/certError.ftl --- firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/neterror/certError.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/neterror/certError.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -107,6 +107,12 @@ # Variables: # $datetime (Date) - Current datetime. fp-datetime = { DATETIME($datetime, month: "short", year: "numeric", day: "numeric") } { DATETIME($datetime, timeStyle: "long") } +# This string appears after the following string: "What makes the site look dangerous?" (fp-certerror-why-site-dangerous) +# Variables: +# $hostname (String) - Hostname of the website to which the user was trying to connect. +fp-certerror-transparency-why-dangerous-body = { -brand-short-name } не давярае { $hostname }, бо ён не змог даказаць, што адпавядае патрабаванням празрыстасці публічных сертыфікатаў. +# This string appears after the following string: "What can you do about it?" (fp-certerror-what-can-you-do) +fp-certerror-transparency-what-can-you-do-body = Хутчэй за ўсё, нічога, таму што, выглядае на тое, праблема з самім сайтам. fp-learn-more-about-secure-connection-failures = Падрабязней пра памылкі бяспечнага злучэння fp-learn-more-about-cert-issues = Падрабязней пра падобныя праблемы з сертыфікатамі fp-learn-more-about-time-related-errors = Падрабязней пра вырашэнне праблем, звязаных з часам @@ -191,3 +197,4 @@ fp-certerror-override-exception-button = Перайсці на { $hostname } (рызыкоўна) fp-certerror-intro = { -brand-short-name } выявіў патэнцыйна сур'ёзную праблему з бяспекай { $hostname }. Нехта, хто выдае сябе за гэты сайт, можа паспрабаваць скрасці такія рэчы, як дадзеныя крэдытнай карты, паролі або электронную пошту. fp-certerror-expired-into = { -brand-short-name } выявіў праблему бяспекі на { $hostname }. Або сайт настроены няправільна, або на гадзінніку вашай прылады ўстаноўлена няправільна дата/час. +fp-certerror-transparency-intro = Нехта, выдаючы сябе за { $hostname }, можа паспрабаваць скрасці такія рэчы, як інфармацыю крэдытных карт, паролі або электронную пошту. diff -Nru firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/neterror/netError.ftl firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/neterror/netError.ftl --- firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/neterror/netError.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/neterror/netError.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -167,3 +167,13 @@ # $responsestatus (string) - HTTP response status code (e.g., 500). # $responsestatustext (string) - HTTP response status text (e.g., "Internal Server Error"). neterror-response-status-code = Код памылкі: { $responsestatus } { $responsestatustext } + +## Felt Privacy V1 Strings +## Variables: +## $hostname (String) - Hostname of the website to which the user was trying to connect. + +fp-neterror-connection-intro = { -brand-short-name } не можа стварыць бяспечнае злучэнне з серверам па адрасе { $hostname }. +# This string appears after the following string: "What makes the site look dangerous?" (fp-neterror-why-site-dangerous) +fp-neterror-cypher-overlap-why-dangerous-body = Здаецца, гэты сайт выкарыстоўвае старое праграмнае забеспячэнне з вядомымі праблемамі бяспекі. +# This string appears after the following string: "What can you do about it?" (fp-neterror-what-can-you-do) +fp-neterror-cypher-overlap-what-can-you-do-body = Пераканайцеся, што вы карыстаецеся апошняй версіяй { -brand-short-name }. Перайдзіце ў меню Даведка > Пра { -brand-short-name }. Калі вы карыстаецеся апошняй версіяй { -brand-short-name }, праблема, хутчэй за ўсё, звязана з самім сайтам. diff -Nru firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/pdfviewer/viewer.ftl firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/pdfviewer/viewer.ftl --- firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/pdfviewer/viewer.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/pdfviewer/viewer.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -310,6 +310,10 @@ .title = Каментаваць .aria-label = Каментаваць pdfjs-comment-floating-button-label = Каментаваць +pdfjs-editor-comment-button = + .title = Каментарый + .aria-label = Каментарый +pdfjs-editor-comment-button-label = Каментарый pdfjs-editor-signature-button = .title = Дадаць подпіс pdfjs-editor-signature-button-label = Дадаць подпіс @@ -372,6 +376,22 @@ pdfjs-free-text2 = .aria-label = Тэкставы рэдактар .default-content = Пачніце ўводзіць… +# Used to show how many comments are present in the pdf file. +# Variables: +# $count (Number) - the number of comments. +pdfjs-editor-comments-sidebar-title = + { $count -> + [one] Каментарый + [few] Каментарыі + *[many] Каментарыі + } +pdfjs-editor-comments-sidebar-close-button = + .title = Закрыць бакавую панэль + .aria-label = Закрыць бакавую панэль +pdfjs-editor-comments-sidebar-close-button-label = Закрыць бакавую панэль +# Instructional copy to add a comment by selecting text or an annotations. +pdfjs-editor-comments-sidebar-no-comments1 = Бачыце штосьці вартае ўвагі? Вылучыце і пакіньце каментарый. +pdfjs-editor-comments-sidebar-no-comments-link = Падрабязней ## Alt-text dialog @@ -589,25 +609,35 @@ pdfjs-editor-add-signature-add-button = Дадаць pdfjs-editor-edit-signature-update-button = Абнавіць +## Comment popup + +pdfjs-editor-edit-comment-popup-button-label = Змяніць каментарый +pdfjs-editor-edit-comment-popup-button = + .title = Змяніць каментарый +pdfjs-editor-delete-comment-popup-button-label = Выдаліць каментарый +pdfjs-editor-delete-comment-popup-button = + .title = Выдаліць каментарый +pdfjs-show-comment-button = + .title = Паказаць каментарый + ## Edit a comment dialog -pdfjs-editor-edit-comment-actions-button-label = Дзеянні -pdfjs-editor-edit-comment-actions-button = - .title = Дзеянні -pdfjs-editor-edit-comment-close-button-label = Закрыць -pdfjs-editor-edit-comment-close-button = - .title = Закрыць -pdfjs-editor-edit-comment-actions-edit-button-label = Праўка -pdfjs-editor-edit-comment-actions-delete-button-label = Выдаліць -pdfjs-editor-edit-comment-manager-text-input = - .placeholder = Увядзіце свой каментарый -pdfjs-editor-edit-comment-manager-cancel-button = Скасаваць -pdfjs-editor-edit-comment-manager-save-button = Захаваць +# An existing comment is edited +pdfjs-editor-edit-comment-dialog-title-when-editing = Змяніць каментарый +pdfjs-editor-edit-comment-dialog-save-button-when-editing = Абнавіць +# No existing comment +pdfjs-editor-edit-comment-dialog-title-when-adding = Дадаць каментарый +pdfjs-editor-edit-comment-dialog-save-button-when-adding = Дадаць +pdfjs-editor-edit-comment-dialog-text-input = + .placeholder = Пачніце набор тэксту… +pdfjs-editor-edit-comment-dialog-cancel-button = Скасаваць ## Edit a comment button in the editor toolbar pdfjs-editor-edit-comment-button = .title = Змяніць каментарый +pdfjs-editor-add-comment-button = + .title = Дадаць каментарый ## Main menu for adding/removing signatures diff -Nru firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/updates/elevation.ftl firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/updates/elevation.ftl --- firefox-esr-140.5.0esr/l10n-be/toolkit/toolkit/updates/elevation.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-be/toolkit/toolkit/updates/elevation.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -21,3 +21,4 @@ .label = Больш не паказваць .accesskey = в sandbox-unprivileged-namespaces-howtofix = Як выправіць гэтую праблему +sandbox-content-disabled-warning = Пясочніца бяспекі адключана. Ваша канфігурацыя не падтрымліваецца і менш бяспечная. diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/addonNotifications.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/addonNotifications.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/addonNotifications.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/addonNotifications.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -136,6 +136,7 @@ # $appVersion (String): the application version. addon-install-error-incompatible = Добавката { $addonName } не може да бъде инсталирана, защото е несъвместима с { -brand-short-name } { $appVersion }. addon-install-error-hard-blocked = Добавката { $addonName } нарушава правилата на Mozilla и не може да бъде инсталирана на { -brand-short-name }. +addon-install-error-soft-blocked2 = Добавката { $addonName } е ограничена и не може да бъде инсталирана на { -brand-short-name }. addon-install-error-blocklisted = Добавката { $addonName } не може да бъде инсталирана, защото носи висок риск от причиняване на проблеми със стабилността или сигурността. addon-install-error-soft-blocked = Добавката { $addonName } нарушава правилата на Mozilla и не може да бъде инсталирана на { -brand-short-name }. # Enterprise policies is a feature aimed at system administrators who want to deploy custom settings for Firefox. diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/appmenu.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/appmenu.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/appmenu.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/appmenu.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -294,6 +294,10 @@ appmenuitem-vpn-title = { -mozilla-vpn-brand-name } appmenuitem-vpn-description = Защита на действията ви онлайн appmenu-services-header = Моите услуги +# "Mozilla" is intentionally hardcoded to prevent forks from replacing it +# with their own vendor name, since these tools are created and maintained by +# Mozilla. +appmenu-other-protection-header2 = Опитайте други защитни инструменти от Mozilla: appmenu-other-protection-header = Опитайте други инструменти за защита от { -vendor-short-name }: ## Profiles panel @@ -301,6 +305,8 @@ appmenu-other-profiles = Други профили appmenu-manage-profiles = .label = Управление на профили +appmenu-copy-profile = + .label = Копиране на този профил appmenu-create-profile = .label = Нов профил appmenu-edit-profile = diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/backupSettings.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/backupSettings.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/backupSettings.ftl 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/backupSettings.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -0,0 +1,68 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# This string is used to name the folder that users will save backups to. +# "Restore" is an action and intended for prompting users to select this folder +# when following backup restoration steps. Please only include characters that +# can be used for folders. Invalid characters will be automatically stripped out +# or replaced with underscores. +backup-folder-name = Възстановяване на { -brand-product-name } +# This string is used for the generated file that will be stored within the +# backup-folder-name folder. It will have the profile name and an encoding of +# the backup date appended to it, followed by `.html`. Please only include +# characters that can be used for filenames. Invalid characters will be +# automatically stripped out or replaced with underscores. +# +# This is an example of what the final filename might look like after the +# profile name and backup date are appended to it: +# +# FirefoxBackup_default_20240606-1830.html +backup-file-name = { -brand-product-name } Резервни копия +settings-data-backup-header = Резервни копия +settings-data-backup-toggle = Управление на резервните копия +settings-data-backup-toggle-on = Включване на резервните копия +settings-data-backup-trigger-button = Архивиране +settings-data-backup-in-progress-button = Архивирането е в процес на изпълнение… +settings-data-backup-scheduled-backups-on = Архивиране: ВКЛЮЧЕНО +settings-data-backup-scheduled-backups-off = Архивиране: ИЗКЛЮЧЕНО +# "Location" refers to the folder where backups are being written to. +settings-data-backup-last-backup-location = Местоположение +settings-data-backup-last-backup-location-show-in-folder = Показване в папката +settings-data-backup-last-backup-location-edit = Редактиране… +settings-data-create-backup-error = Възникна грешка при създаване на резервно копие на { DATETIME($date, timeStyle: "short") }, { DATETIME($date, dateStyle: "short") } +# Variables: +# $fileName (String) - The file name of the last backup that was created. +settings-data-backup-last-backup-filename = Име на файл: { $fileName } +settings-data-backup-restore-header = Възстановяване на вашите данни + +## These strings are shown under the header if scheduled backups are enabled. + +settings-data-backup-scheduled-backups-on-restore-choose = Възстановяване… +settings-data-toggle-encryption-label = Архивирaне на вашите чувствителни данни + +## These strings are displayed in a modal when users want to turn on scheduled backups. + +# "Location" refers to the save location or a folder where users want backups stored. +turn-on-scheduled-backups-location-label = Местоположение +turn-on-scheduled-backups-location-choose-button = + { PLATFORM() -> + [macos] Избор… + *[other] Разглеждане… + } +turn-on-scheduled-backups-encryption-label = Архивирaне на вашите чувствителни данни +turn-on-scheduled-backups-cancel-button = Отказ + +## These strings are displayed in a modal when users want to turn off scheduled backups. + +turn-off-scheduled-backups-description = Това също изтрива всички ваши архивни данни. Не може да бъде отменено. +turn-off-scheduled-backups-cancel-button = Отказ +turn-off-scheduled-backups-confirm-button = Изключване и изтриване на архивно копие + +## These strings are displayed in a modal when users want to enable encryption or change the password for an existing backup. + +enable-backup-encryption-create-password-label = Парола +# Users will be prompted to re-type a password, to ensure that the password is entered correctly. +enable-backup-encryption-repeat-password-label = Повторете паролата +enable-backup-encryption-cancel-button = Отказ +enable-backup-encryption-confirm-button = Запазване diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/browser.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/browser.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/browser.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/browser.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -117,6 +117,15 @@ [macos] { -brand-full-name } — Поверително сърфиране *[other] { -brand-full-name } Поверително сърфиране } +# This is only used on macOS; on other OSes we use the full private window +# title (so including the brand name) as a suffix +browser-main-private-suffix-for-content = Поверително сърфиране +popups-infobar-dont-show-message2 = + .label = Да не се показва това съобщение, когато са блокирани изскачащи прозорци или пренасочвания към трети страни + .accesskey = з +edit-popup-settings2 = + .label = Управление на изскачащи прозорци и пренасочвания от трети страни… + .accesskey = и ## @@ -263,6 +272,8 @@ .tooltiptext = Забранили сте на страницата споделянето на вашия екран. urlbar-persistent-storage-blocked = .tooltiptext = Забранили сте на страницата достъп до хранилището за постоянни данни. +urlbar-popup-blocked2 = + .tooltiptext = Забранили сте на този сайт да показва изскачащи прозорци и пренасочвания към трети страни. urlbar-popup-blocked = .tooltiptext = Забранили сте на страницата да отваря изскачащи прозорци. urlbar-autoplay-media-blocked = @@ -807,11 +818,66 @@ # This string is shown as title when Market suggestion are disabled. urlbar-result-market-opt-in-title = Вземете данни от борсата директно в лентата за търсене +# This string is shown as description when Market suggestion are disabled. +urlbar-result-market-opt-in-description = Показва пазарни новини и допълнителна информация от нашите партньори, когато споделяте данни за заявките за търсене { -vendor-short-name }. Научете повече +# This string is shown as button to activate online when realtime suggestion are disabled. +urlbar-result-realtime-opt-in-allow = Показване на подсказки # This string is shown in split button to dismiss activation the Realtime suggestion. urlbar-result-realtime-opt-in-not-now = Не сега urlbar-result-realtime-opt-in-dismiss = Прекратяване urlbar-result-realtime-opt-in-dismiss-all = .label = Без показване на тези предложения +# This string is shown in the result menu. +urlbar-result-menu-dont-show-market = + .label = Без показване на пазарни предложения +# A message that replaces a result when the user dismisses Market suggestions. +urlbar-result-dismissal-acknowledgment-market = Благодарим за обратната връзка. Вече няма да виждате пазарни предложения. +# A message that replaces a result when the user dismisses all suggestions of a +# particular type. +urlbar-result-dismissal-acknowledgment-all = Благодарим за обратната връзка. Вече няма да виждате тези предложения. + +## These strings are used for suggestions of important dates in the urlbar. + +# The name of an event and the number of days until it starts separated by a +# middot. +# Variables: +# $name (string) - The name of the event. +# $daysUntilStart (integer) - The number of days until the event starts. +urlbar-result-dates-countdown = + { $daysUntilStart -> + [one] { $name } · След { $daysUntilStart } ден + *[other] { $name } · След { $daysUntilStart } дни + } +# The name of a multiple day long event and the number of days until it starts +# separated by a middot. +# Variables: +# $name (string) - The name of the event. +# $daysUntilStart (integer) - The number of days until the event starts. +urlbar-result-dates-countdown-range = + { $daysUntilStart -> + [one] { $name } · Започва след { $daysUntilStart } ден + *[other] { $name } · Започва след { $daysUntilStart } дни + } +# The name of a multiple day long event and the number of days until it ends +# separated by a middot. +# Variables: +# $name (string) - The name of the event. +# $daysUntilEnd (integer) - The number of days until the event ends. +urlbar-result-dates-ongoing = + { $daysUntilEnd -> + [one] { $name } · Приключва след { $daysUntilEnd } ден + *[other] { $name } · Приключва след { $daysUntilEnd } дни + } +# The name of an event and a note that it is happening today separated by a +# middot. +# Variables: +# $name (string) - The name of the event. +urlbar-result-dates-today = { $name } · Днес +# The name of multiple day long event and a note that it is ends today +# separated by a middot. +# Variables: +# $name (string) - The name of the event. +urlbar-result-dates-ends-today = { $name } · Приключва днес ## Strings used for buttons in the urlbar @@ -1112,6 +1178,9 @@ popups-infobar-block = .label = Спиране на изскачащите прозорци от { $uriHost } .accesskey = Р +popups-infobar-allow2 = + .label = Позволяване на изскачащи прозорци и пренасочвания от трети страни за { $uriHost } + .accesskey = и ## @@ -1276,6 +1345,7 @@ # $useremail (String): user email that will receive messages firefox-relay-offer-what-relay-provides = Всички имейли, изпратени до вашите имейл маски, ще бъдат препращани към { $useremail } (освен ако не решите да ги блокирате). firefox-relay-offer-legal-notice = С натискането на „Използване на маска за пощата“ вие се съгласявате с и . +firefox-relay-offer-legal-notice-1 = С регистрирането и създаването на маска се съгласявате с и . ## Add-on Pop-up Notifications @@ -1302,10 +1372,25 @@ [one] { -brand-short-name } попречи на страницата да отвори изскачащ прозорец *[other] { -brand-short-name } попречи на страницата да отвори { $popupCount } изскачащи прозореца. } +# Variables: +# $popupCount (Number): the number of pop-ups blocked. +redirect-warning-with-popup-message = + { $popupCount -> + [0] { -brand-short-name } попречи на страницата да пренасочи. + [one] { -brand-short-name } попречи на страницата да отвори изскачащ прозорец и пренасочи. + *[other] { -brand-short-name } попречи на страницата да отвори { $popupCount } изскачащи прозореца и пренасочи. + } # The singular form is left out for English, since the number of blocked pop-ups is always greater than 1. # Variables: # $popupCount (Number): the number of pop-ups blocked. popup-warning-exceeded-message = { -brand-short-name } попречи на страницата да отвори повече от { $popupCount } изскачащи прозореца. +# Variables: +# $popupCount (Number): the number of pop-ups blocked. +popup-warning-exceeded-with-redirect-message = + { $popupCount -> + [one] { -brand-short-name } попречи на страницата да отвори повече от { $popupCount } изскачащ прозорец и пренасочвания. + *[other] { -brand-short-name } попречи на страницата да отвори повече от { $popupCount } изскачащи прозореца и пренасочвания. + } popup-warning-button = .label = { PLATFORM() -> @@ -1321,6 +1406,10 @@ # $popupURI (String): the URI for the pop-up window popup-show-popup-menuitem = .label = Показване на „{ $popupURI }“ +# Variables: +# $redirectURI (String): the URI for the redirect +popup-trigger-redirect-menuitem = + .label = Показване на „{ $redirectURI }“ ## File-picker crash notification ("FilePickerCrashed.sys.mjs") @@ -1350,7 +1439,7 @@ .label = Завършване на настройката .tooltiptext = Завършване на настройката на { -brand-short-name } -## The urlbar trust panel +## The urlbar trust icon & panel trustpanel-etp-label-enabled = Подобрената защита от проследяване е включена trustpanel-etp-label-disabled = Подобрената защита от проследяване е изключена @@ -1367,7 +1456,9 @@ trustpanel-connection-label-secure = Връзката е защитена trustpanel-connection-label-insecure = Връзката не е защитена trustpanel-header-enabled = { -brand-product-name } ви пази -trustpanel-description-enabled = Вие сте защитени. Ако забележим нещо, ще ви уведомим +trustpanel-description-enabled2 = Защитени сте. Ако забележим нещо, ще ви уведомим. +trustpanel-header-enabled-insecure = Бъдете внимателни на тази страница +trustpanel-description-enabled-insecure = { -brand-product-name } установи нещо подозрително. trustpanel-header-disabled = Защитите са изключени trustpanel-description-disabled = { -brand-product-name } не ви защитава. Съветваме ви да включите защитите. trustpanel-clear-cookies-button = Изчистване на бисквитките и данните на сайта @@ -1383,8 +1474,6 @@ # $host (String): the hostname of the site that is being displayed. trustpanel-site-information-header = .title = Защити на връзките за { $host } -trustpanel-connection-secure = Връзката със сайта е сигурна. -trustpanel-connection-not-secure = Връзката към страницата не е защитена. trustpanel-siteinformation-morelink = Повече информация за уеб страницата trustpanel-blocker-see-all = Вижте всички # Variables @@ -1437,7 +1526,6 @@ [one] { -brand-product-name } разреши { $count } проследяване от социални медии *[other] { -brand-product-name } разреши { $count } проследявания от социални медии } -trustpanel-social-tracking-tab-list-header = Следните сайтове се опитват да ви проследяват: trustpanel-tracking-cookies-blocking-tab-header = { $count -> [one] { -brand-product-name } спря { $count } бисквитка за проследяване в различни сайтове @@ -1448,7 +1536,6 @@ [one] { -brand-product-name } разреши { $count } проследяваща бисквитка в различни сайтове *[other] { -brand-product-name } разреши { $count } проследяващи бисквитки в различни сайтове } -trustpanel-tracking-cookies-tab-list-header = Следните сайтове се опитват да ви проследяват: trustpanel-tracking-content-blocking-tab-header = { $count -> [one] { -brand-product-name } спря { $count } проследяване diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/browserContext.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/browserContext.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/browserContext.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/browserContext.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -272,8 +272,9 @@ .accesskey = о # Variables # $engine (String) - Name of the search engine that will perform the search. -main-context-menu-visual-search = +main-context-menu-visual-search-2 = .label = Търсене на изображения чрез { $engine } + .accesskey = р main-context-menu-video-save-as = .label = Запазване на видео като… .accesskey = в diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/contextual-manager.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/contextual-manager.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/contextual-manager.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/contextual-manager.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -18,6 +18,7 @@ contextual-manager-passwords-command-import = Внасяне от файл… contextual-manager-passwords-command-export = Изнасяне на пароли contextual-manager-passwords-command-remove-all = Премахване на всички пароли +contextual-manager-passwords-command-options = Настройки contextual-manager-passwords-command-settings = Настройки contextual-manager-passwords-command-help = Помощ contextual-manager-passwords-os-auth-dialog-caption = { -brand-full-name } @@ -61,6 +62,7 @@ } contextual-manager-passwords-import-success-heading = .heading = Паролите са внесени +contextual-manager-passwords-import-detailed-report = Подробен доклад contextual-manager-passwords-import-success-button = Готово contextual-manager-passwords-import-error-heading-and-message = .heading = Внасянето на пароли е неуспешно @@ -70,6 +72,8 @@ contextual-manager-passwords-export-success-heading = .heading = Паролите са изнесени contextual-manager-passwords-export-success-button = Готово +# Export passwords to file dialog +contextual-manager-export-passwords-dialog-title = Изнасяне на паролите във файл? contextual-manager-export-passwords-dialog-confirm-button = Продължете с изнасянето # Title of the file picker dialog contextual-manager-passwords-export-file-picker-title = Изнасяне на пароли от { -brand-short-name } @@ -113,20 +117,35 @@ # The attribute .data-after describes the text that should be displayed for the ::after pseudo-selector contextual-manager-passwords-password-label = Парола .data-after = Копирана +contextual-manager-passwords-radiogroup-label = + .aria-label = Филтриране на пароли +contextual-manager-passwords-add-password-success-button = Преглед contextual-manager-passwords-update-password-success-button = Готово contextual-manager-passwords-delete-password-success-button = Готово # This message is displayed to make sure that a user wants to delete an existing login. contextual-manager-passwords-remove-login-card-title = Премахване на парола? +# This message warns the user that deleting a login is permanent. +contextual-manager-passwords-remove-login-card-message = Не може да отмените това. +# This message gives the user an option to go back to the edit login form. +contextual-manager-passwords-remove-login-card-back-message = Назад # This message confirms that the user wants to remove an existing login. contextual-manager-passwords-remove-login-card-remove-button = Премахване # This message gives the user the option to cancel their attempt to remove a login. contextual-manager-passwords-remove-login-card-cancel-button = Отказ +contextual-manager-passwords-alert-back-button = + .label = Назад +contextual-manager-passwords-breached-origin-heading-and-message = + .heading = Препоръчителна промяна на паролата + .message = Паролите от този уебсайт са докладвани като откраднати или изтекли. Сменете паролата си, за да защитите вашия профил. +contextual-manager-passwords-change-password-button = Промяна на парола contextual-manager-passwords-vulnerable-password-heading-and-message = .heading = Препоръчва се промяна на паролата .message = Тази парола може да бъде лесно налучкана. Сменете я с цел по-добра защита на вашия профил. +contextual-manager-passwords-vulnerable-password-link-message = Откъде { -brand-product-name } разбира за слабите пароли? contextual-manager-passwords-no-username-heading-and-message = .heading = Добавете потребителско име .message = Добавете потребителско име за по-бързо вписване. +contextual-manager-passwords-add-username-button = Добавяне на потребителско име ## Login Form @@ -136,6 +155,7 @@ .label = Редактиране на паролата contextual-manager-passwords-remove-label = .title = Премахване на паролата +contextual-manager-passwords-username-tooltip = Въведете потребителското име, имейл адреса или номера на профила, които използвате за вход. ## Password Card @@ -158,6 +178,15 @@ .heading = Преглед на известието contextual-manager-view-alert-button = .tooltiptext = Преглед на известието +# Variables +# $count (number) - The number of active alerts associated with the login +contextual-manager-view-alert-heading-2 = + .heading = + { $count -> + [1] Преглед на известието + [one] Преглед на известието + *[other] Преглед на известията + } contextual-manager-show-password-button = .aria-label = Показване на паролата .title = Показване на паролата @@ -178,5 +207,9 @@ ## When the user cancels a login that's currently being edited, we display a message to confirm whether ## or not the user wants to discard their current edits to the login. +contextual-manager-passwords-discard-changes-heading-and-message = + .heading = Затваряне без запазване? + .message = Промените няма да бъдат запазени. contextual-manager-passwords-discard-changes-close-button = Затваряне contextual-manager-passwords-discard-changes-go-back-button = Връщане назад +contextual-manager-primary-password-learn-more-link = Научете повече diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/featureCallout.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/featureCallout.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/featureCallout.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/featureCallout.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -103,6 +103,11 @@ # Opens Mozilla accounts sign-up page fxa-adoption-passwords-primary-button-label = Регистриране +## Taskbar Tabs callout strings + +taskbar-tabs-social-callout-title = Дръжте любимите си емисии в лентата със задачи +taskbar-tabs-chat-callout-title = Чат от лентата със задачи + ## Windows 10 EoS Sync messages group 1 callouts windows-10-eos-sync-urgency-title-1 = Не губете всичко запазено, когато преминете към Windows 11. @@ -112,6 +117,7 @@ windows-10-eos-sync-new-device-subtitle-2 = Без значение колко често използвате { -brand-short-name }, синхронизирането защитава вашите отметки, пароли и настройки. windows-10-eos-sync-new-device-primary-label = Синхронизиране windows-10-eos-sync-general-subtitle-1 = Архивирайте и синхронизирайте вашите пароли, отметки, настройки и други данни, за да запазите това, на което разчитате. +windows-10-eos-sync-tour-title-1 = Имате твърде много раздели? Облекчете работата си като ги групирате. windows-10-eos-sync-tour-subtitle-2 = Синхронизирайте вашите отметки, пароли и настройки, за да ги архивирате, преди да превключите. ## Sidebar Strings diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/firefoxRelay.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/firefoxRelay.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/firefoxRelay.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/firefoxRelay.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -23,6 +23,7 @@ # This is preceded by firefox-relay-opt-in-title-1 (on a different line), which # ends with a colon. You might need to adapt the capitalization of this string. firefox-relay-opt-in-subtitle-1 = Използвайте маска за имейл от { -relay-brand-name } +firefox-relay-use-mask-title-1 = Използване на маска за пощата firefox-relay-use-mask-title = Използвайте имейл маскиране от { -relay-brand-name } # This is followed, on a new line, by firefox-relay-opt-in-subtitle-a firefox-relay-opt-in-title-a = Предотвратете нежеланата поща с безплатна маска за пощата diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/genai.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/genai.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/genai.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/genai.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -51,11 +51,33 @@ # $provider (string) - name of the provider genai-menu-ask-provider = .label = Попитайте { $provider } +genai-menu-open-generic = + .label = Робот за разговори с ИИ +# $provider (string) - name of the provider +genai-menu-open-provider = + .label = Отваряне на { $provider } +genai-menu-remove-generic = + .label = Премахване робот с ИИ +# $provider (string) - name of the provider +genai-menu-remove-provider = + .label = Премахване на { $provider } +genai-menu-remove-sidebar = + .label = Премахване от страничната лента +genai-menu-new-badge = Ново +genai-menu-summarize-page = Обобщаване на страницата genai-input-ask-generic = .placeholder = Попитайте AI чатбота… # $provider (string) - name of the provider genai-input-ask-provider = .placeholder = Попитайте { $provider } +# $selectionLength (number) - selected text length +# $maxLength (number) - max length of what can be selected +genai-shortcuts-selected-warning-generic = + .heading = Роботът за разговори с ИИ няма да получи всичко избрано + .message = + { $selectionLength -> + *[other] Избрали сте около { $selectionLength } знака. Към роботът могат да бъдат изпратени около { $maxLength } знака. + } genai-shortcuts-hide = .label = Скриване на прекия път към чат-бота genai-menu-choose-chatbot = @@ -92,11 +114,18 @@ genai-options-hide-shortcut = .label = Скриване на пряк път при избиране на текст genai-options-about-chatbot = - .label = Относно AI чатботовете в { -brand-short-name } + .label = Относно AI чат ботовете в { -brand-short-name } + +## Chatbot footer + +genai-page-button-summarize = Обобщаване на страницата ## Chatbot onboarding genai-onboarding-header = Обобщавайте, обмисляйте и още, докато разглеждате +genai-onboarding-choose-header = Изберете робот за разговори в страничната лента на { -brand-short-name } +# "Switch anytime" refers to allowing the user to switch to a different chatbot. +genai-onboarding-choose-description = Превключвайте по всяко време. За помощ при избора, научете повече за роботите. genai-onboarding-primary = Напред genai-onboarding-secondary = Затваряне genai-onboarding-claude-tooltip = @@ -119,6 +148,11 @@ genai-onboarding-lechat-learn = Научете повече за Le Chat genai-onboarding-select-header = Изберете текст, за да видите предложения genai-onboarding-select-primary = Започнете разговор +genai-chatbot-contextual-button = Избор на чатбот +genai-chatbot-summarize-title = Ново! Обобщавайте страниците с един клик +genai-chatbot-summarize-button = Обобщаване на страницата +# “Summarize Page” should be consistent with the translation for the string genai-menu-summarize-page +genai-chatbot-summarize-sidebar-provider-subtitle = Кликнете с десния бутон на мишката върху вашия AI чатбот в страничната лента и изберете „Обобщаване на страницата“. ## Chatbot onboarding choices ## These describe features/capabilities of chatbot providers. These are not buttons/actions. @@ -163,5 +197,18 @@ link-preview-generation-error-unexpected = Нещо се обърка. # Text for the retry link when generation fails link-preview-generation-retry = Нов опит +# Onboarding card title for long press +link-preview-onboarding-title-long-press = Ново: Щракнете и задръжте върху препратка за бърз преглед +# Header for the key points section +link-preview-key-points-header = Основни точки +# Disclaimer for AI-generated key points +link-preview-key-points-disclaimer = Ключовите точки са създадени от ИИ и може да съдържат грешки. +# Progress message for the first-time setup +# $progress (number) - The percentage value 1-100 indicating the progress of the setup. +link-preview-setup = Първоначална настройка • { $progress } % +# Message indicating faster performance after initial setup +link-preview-setup-faster-next-time = Следващият път ще видите по-бързо ключовите точки. +# Onboarding card See a preview button +link-preview-onboarding-button = Преглед # Onboarding card Close button link-preview-onboarding-close = Затваряне diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/menubar.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/menubar.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/menubar.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/menubar.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -248,6 +248,13 @@ .label = Управление на профили menu-profiles-new-profile = .label = Нов профил +# Variables: +# $profileName (String): the name of the users profile +menu-profiles-current = + .label = { $profileName } (текущ) +menu-profiles-menu = + .label = Профили + .accesskey = П ## Tools Menu diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/newtab/asrouter.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/newtab/asrouter.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/newtab/asrouter.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/newtab/asrouter.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -348,6 +348,7 @@ ## Windows 10 EoS Sync messages group 1 toast notification windows-10-eos-sync-toast-primary-label = Въведение +windows-10-eos-sync-toast-secondary-label = Напомняне по-късно ## Windows 10 EoS sync messages group 2 feature callouts @@ -358,3 +359,12 @@ windows-10-eos-feature-toast-whats-new-button = Вижте какво ново windows-10-eos-feature-toast-dismiss-button = Прекратяване + +## ETP (Enhanced Tracking Protection) Strict exceptions infobar +## +## These strings are displayed in an infobar notification that appears when +## Enhanced Tracking Protection's Strict mode is causing website functionality +## issues. The infobar offers users the option to apply automatic exceptions +## to fix common site breakage by unblocking essential elements. + +etp-strict-exceptions-infobar-learn-more = Научете повече diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/newtab/newtab.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/newtab/newtab.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/newtab/newtab.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/newtab/newtab.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -320,6 +320,9 @@ newtab-custom-stories-toggle = .label = Препоръчани истории .description = Изключително съдържание подбрано от семейството на { -brand-product-name } +newtab-custom-stories-personalized-toggle = + .label = Истории +newtab-custom-stories-personalized-checkbox-label = Персонализирани истории въз основа на вашата активност newtab-custom-pocket-sponsored = Платени публикации newtab-custom-pocket-show-recent-saves = Показване на последните запазени newtab-custom-recent-title = Последна активност @@ -327,6 +330,21 @@ newtab-custom-weather-toggle = .label = Времето .description = Времето днес накратко +newtab-custom-trending-search-toggle = + .label = Популярни търсения + .description = Популярни и често търсени теми +newtab-custom-widget-weather-toggle = + .label = Времето +newtab-custom-widget-trending-search-toggle = + .label = Популярни търсения +newtab-custom-widget-lists-toggle = + .label = Списъци +newtab-custom-widget-timer-toggle = + .label = Таймер +# Tooltip for close button +newtab-custom-close-menu-button = + .title = Затваряне + .aria-label = Затваряне на менюто newtab-custom-close-button = Затваряне newtab-custom-settings = Настройки @@ -335,6 +353,7 @@ newtab-wallpaper-title = Тапети newtab-wallpaper-reset = Връщане на стандартни настройки newtab-wallpaper-upload-image = Качване на изображение +newtab-wallpaper-custom-color = Изберете цвят # Variables # $file_size (number) - The number of the maximum image file size (in MB) that may be uploaded newtab-wallpaper-error-max-file-size = Изображението надхвърля ограничението за големина на файла от { $file_size }MB. Моля, опитайте се да качите по-малък файл. @@ -380,8 +399,9 @@ newtab-wallpaper-abstract-orange = Оранжеви фигури newtab-wallpaper-gradient-orange = Преливащо се оранжево и розово newtab-wallpaper-abstract-blue-purple = Сини и лилави фигури +newtab-wallpaper-abstract-white-curves = Бяло със засенчени извивки -## Celestial +## Firefox newtab-wallpaper-category-title-photographs = Снимки newtab-wallpaper-beach-at-sunrise = Плаж при изгрев @@ -396,6 +416,14 @@ .title = { -newtab-wallpaper-feature-highlight-header } .aria-label = { -newtab-wallpaper-feature-highlight-content } +## Celestial + +# “Celestial” referring to astronomy; positioned in or relating to the sky, +# or outer space as observed in astronomy. +# Not to be confused with religious definition of the word. +newtab-wallpaper-category-title-celestial = Небесен +newtab-wallpaper-celestial-lunar-eclipse = Лунно затъмнение + ## New Tab Weather # Variables: @@ -446,8 +474,26 @@ ## Topic Selection Modal newtab-topic-selection-button-maybe-later = Може би по-късно +newtab-topic-selection-button-update-interests = Актуализирайте интересите си newtab-topic-selection-button-pick-interests = Изберете вашите интереси ## Strings for custom wallpaper highlight newtab-custom-wallpaper-cta = Опитайте + +## Strings for trending searches + +newtab-trending-searches-learn-more = Научете повече + +## Strings for task / to-do list productivity widget + +newtab-widget-lists-menu-delete = Изтриване на този списък +newtab-widget-lists-menu-learn-more = Научете повече +newtab-widget-lists-input-menu-delete = Изтриване + +## Strings for timer productivity widget +## When the timer ends, a system notification may be shown. Depending on which mode the timer is in, that message would be shown + +newtab-widget-timer-menu-learn-more = Научете повече +newtab-promo-card-body = Нашите спонсори подкрепят мисията ни да изградим по-добра мрежа +newtab-promo-card-cta = Научете повече diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/pageInfo.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/pageInfo.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/pageInfo.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/pageInfo.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -61,7 +61,7 @@ media-long-desc = .value = Дълго описание: media-select-all = - .label = Избор на всичко + .label = Избиране на всичко .accesskey = е media-save-as = .label = Запазване като… diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/policies/policies-descriptions.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/policies/policies-descriptions.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/policies/policies-descriptions.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/policies/policies-descriptions.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -10,6 +10,7 @@ ## These are short descriptions for individual policies, to be displayed ## in the documentation section in about:policies. +policy-AllowFileSelectionDialogs = Позволяване на диалози за избор на файл. policy-AppAutoUpdate = Включва или изключва автоматичното обновяване на приложението. policy-BlockAboutConfig = Забранява достъпа до страницата „about:config“. policy-BlockAboutProfiles = Забранява достъпа до страницата „about:profiles“. @@ -18,6 +19,8 @@ policy-CertificatesDescription = Добавяне на сертификати или използване на вградени сертификати. policy-DisableAppUpdate = Предотвратява обновяването на браузъра. policy-DisableDeveloperTools = Забранява достъпа до развойните инструменти. +# Firefox Screenshots is the name of the feature, and should not be translated. +policy-DisableFirefoxScreenshots = Изключване на функцията Screenshots на Firefox. policy-DisableFirefoxStudies = Забранява на { -brand-short-name } да извършва изследвания. policy-DisablePasswordReveal = В запазените регистрации паролите не могат да бъдат показвани. policy-DisablePrivateBrowsing = Изключва поверителното разглеждане. diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/preferences/colors.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/preferences/colors.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/preferences/colors.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/preferences/colors.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -16,6 +16,12 @@ colors-page-override-option-never = .label = Никога colors-text-and-background = Текст и фон +colors-text = + .label = Текст + .accesskey = т +colors-text-background = + .label = Фон + .accesskey = ф colors-text-header = Текст .accesskey = т colors-background = Фон @@ -27,6 +33,12 @@ .label = Подчертаване на препратки .accesskey = ч colors-links-header = Цветове на препратки +colors-links-unvisited = + .label = Непосетени препратки + .accesskey = н +colors-links-visited = + .label = Посетени препратки + .accesskey = п colors-unvisited-links = Непосетени препратки .accesskey = н colors-visited-links = Посетени препратки diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/preferences/formAutofill.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/preferences/formAutofill.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/preferences/formAutofill.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/preferences/formAutofill.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -17,11 +17,15 @@ autofill-manage-add-button = Добавяне… autofill-manage-edit-button = Промяна… -## The address capture doorhanger +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding address-capture-not-now-button = .label = Не сега .accessKey = Н +address-capture-learn-more-button = + .label = Научете повече # The dialog title for editing addresses in browser preferences. autofill-edit-address-title = Промяна на адрес autofill-address-given-name = Име @@ -30,53 +34,64 @@ autofill-address-organization = Организация autofill-address-street = Адрес -## address-level-3 (Sublocality) names +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding -# Used in IR, MX +# Used in Iran (IR), Mexico (MX) as sublocality (civil entity below a locality, e.g. within a city). autofill-address-neighborhood = Микрорайон -# Used in MY +# Used in Malaysia (MY) as sublocality (civil entity below a locality, e.g. within a city). autofill-address-village-township = Село или махала autofill-address-island = Остров -# Used in IE +# Used in Ireland (IE) as sublocality (civil entity below a locality, e.g. within a city). autofill-address-townland = Townland -## address-level-2 names +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding autofill-address-city = Град -# Used in HK, SD, SY, TR as Address Level-2 and used in KR as Sublocality. +# Used in Hong Kong (HK), Sudan (SD), Syria (SY), Türkiye (TR) as as secondary address information (2 levels below the country level). +# Used in Korea as sublocality (civil entity below a locality, e.g. within a city). autofill-address-district = Район -# Used in GB, NO, SE +# Used in United Kingdom (GB), Norway (NO), Sweden (SE) as as secondary address information (2 levels below the country level). autofill-address-post-town = Пощенски град -# Used in AU as Address Level-2 and used in ZZ as Sublocality. +# Used in Australia (AU) as as secondary address information (below the country level). +# Used for international addresses as sublocality (civil entity below a locality, e.g. within a city). autofill-address-suburb = Предградие -## address-level-1 names +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding autofill-address-province = Провинция autofill-address-state = Щат autofill-address-county = Графство -# Used in BB, JM +# Used in Barbados (BB), Jamaica (JM) as primary address information (1 level below the country level). autofill-address-parish = Енория -# Used in JP +# Used in Japan (JP) as primary address information (1 level below the country level). autofill-address-prefecture = Префектура -# Used in HK +# Used in Honk Kong (HK) as primary address information (1 level below the country level). autofill-address-area = Район -# Used in KR +# Used in Korea (KO) as primary address information (1 level below the country level). autofill-address-do-si = Do/Si -# Used in NI, CO +# Used in Nicaragua (NI), Colombia (CO) as primary address information (1 level below the country level). autofill-address-department = Департамент -# Used in AE +# Used in United Arab Emirates (AE) as primary address information (1 level below the country level). autofill-address-emirate = Емират -# Used in RU and UA +# Used in Russia (RU), Ukraine (UA) as primary address information (1 level below the country level). autofill-address-oblast = Област -## Postal code name types +## Labels for address fields (e.g. for a mailing address) used as part of the form +## autofill feature. For more information on the address structure (e.g. levels), +## see also https://developers.google.com/maps/documentation/javascript/geocoding -# Used in IN +# Postal code field used in India (IN). autofill-address-pin = Пощенски код autofill-address-postal-code = Пощенски код +# Postal code field. autofill-address-zip = Пощенски код -# Used in IE +# Postal code field used in Ireland (IE). autofill-address-eircode = Eircode ## diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/preferences/fxaPairDevice.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/preferences/fxaPairDevice.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/preferences/fxaPairDevice.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/preferences/fxaPairDevice.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -2,5 +2,12 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. +fxa-pair-device-dialog-sync2 = + .style = min-width: 34em; +fxa-qrcode-pair-title = Синхронизирайте { -brand-product-name } на вашия телефон или таблет +fxa-qrcode-pair-step1 = 1. Отворете { -brand-product-name } на мобилното устройство. +fxa-qrcode-pair-step2-device-steps = 2. 2. Отворете менюто и докоснете Вписване +fxa-qrcode-pair-step2-signin = 2. Отворете менюто ( в iOS или в Андроид) и докоснете Синхронизиране и запазване на данни +fxa-qrcode-pair-step3 = 3. Докоснете В готовност за сканиране и задръжте устройството над този код fxa-qrcode-error-title = Сдвояването не е успешно. fxa-qrcode-error-body = Повторен опит. diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/preferences/preferences.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/preferences/preferences.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/preferences/preferences.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/preferences/preferences.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -68,6 +68,8 @@ .key = f close-button = .aria-label = Затваряне +do-not-track-removal2 = + .label = Вече не поддържаме сигнала „Без проследяване“. ## Browser Restart Dialog @@ -123,6 +125,10 @@ always-check-default = .label = Винаги да се проверява дали { -brand-short-name } е браузър по подразбиране .accesskey = В +is-default-browser = + .message = { -brand-short-name } е стандартния за системата четец +is-not-default-browser = + .message = { -brand-short-name } не е стандартния за системата четец is-default = { -brand-short-name } е стандартния за системата четец is-not-default = { -brand-short-name } не е стандартния за системата четец set-as-my-default-browser = @@ -131,6 +137,8 @@ startup-restore-windows-and-tabs = .label = Отваряне на последните прозорци и раздели .accesskey = п +startup-windows-launch-on-login-profile-disabled = + .message = Включете настройката като отметнете „{ profile-manager-use-selected.label }“ в прозореца „Избор на потребителски профил“. windows-launch-on-login = .label = Автоматично отваряне на { -brand-short-name } при стартиране на компютъра .accesskey = А @@ -243,6 +251,15 @@ language-and-appearance-header = Език и изглед preferences-web-appearance-header = Изглед на страниците preferences-web-appearance-description = Някои страници адаптират цветовете си въз основа на вашите предпочитания. Изберете цветовата схема, която да бъде използвана за такива страници. +preferences-web-appearance-choice-auto2 = + .label = Автоматично + .title = Автоматична промяна на фона и съдържанието на страницата въз основа на вашите системни настройки и темата на { -brand-short-name }. +preferences-web-appearance-choice-light2 = + .label = Светла + .title = Да се ползва светъл външен вид за фон и съдържание на страниците. +preferences-web-appearance-choice-dark2 = + .label = Тъмна + .title = Да се ползва тъмен външен вид за фон и съдържание на страниците. preferences-web-appearance-choice-auto = Автоматично preferences-web-appearance-choice-light = Светла preferences-web-appearance-choice-dark = Тъмна @@ -258,6 +275,8 @@ .aria-description = { preferences-web-appearance-choice-tooltip-light.title } preferences-web-appearance-choice-input-dark = .aria-description = { preferences-web-appearance-choice-tooltip-dark.title } +preferences-web-appearance-link = + .label = Управлявайте темите на { -brand-short-name } в Управление на добавки # This can appear when using windows HCM or "Override colors: always" without # system colors. preferences-web-appearance-override-warning = Избраните от вас цветове променят външния вид на сайта. Управление на цветове @@ -333,6 +352,11 @@ ## General Section - Files and Applications files-and-applications-title = Файлове и приложения +downloads-header-2 = + .label = Изтегляния +download-save-where-2 = + .label = Запазване на файловете в + .accesskey = З download-header = Изтегляния download-save-where = Запазване на файловете в .accesskey = З @@ -350,6 +374,9 @@ download-always-ask-where = .label = Винаги да се пита къде да бъдат запазвани файловете .accesskey = В +download-private-browsing-delete = + .label = Изтриване на файловете, изтеглени в поверителен режим, когато всички поверителни прозорци се затворят + .accesskey = ф applications-header = Приложения applications-description = Изберете как { -brand-short-name } управлява изтеглените файлове или приложенията, които използвате докато разглеждате. applications-filter = @@ -558,7 +585,7 @@ home-new-windows-tabs-header = Нови прозорци и раздели home-new-windows-tabs-description2 = Изберете какво да виждате при отваряне на началната страница, нови прозорци или раздели. -## Home Section - Home Page Customization +## Custom Homepage subpage home-homepage-mode-label = Начална страница и нови прозорци home-newtabs-mode-label = Нов раздел @@ -723,6 +750,8 @@ containers-back-button2 = .aria-label = Към настройките containers-header = Изолирани раздели +containers-section-header = + .heading = Изолирани раздели containers-add-button = .label = Нов изолатор .accesskey = и @@ -887,6 +916,14 @@ ## The device name controls. sync-device-name-header = Име на текущото устройство +# Variables: +# $placeholder (string) - The placeholder text of the input +sync-device-name-input = + .aria-label = Име на текущото устройство + .placeholder = { $placeholder } +sync-device-name-change-2 = + .label = Преименуване + .accesskey = м sync-device-name-change = .label = Преименуване… .accesskey = м @@ -1048,6 +1085,10 @@ .label = не помни история history-remember-option-custom = .label = ползва потребителски настройки за историята +history-remember-description2 = + .description = { -brand-short-name } ще пази историята на разглеждане, изтегляния и търсене. +history-dontremember-description2 = + .description = { -brand-short-name } ще използва същите настройки като при поверително разглеждане и няма да помни никаква история, докато сте в интернет. history-remember-description = { -brand-short-name } ще пази историята на разглеждане, изтегляния и търсене. history-dontremember-description = { -brand-short-name } ще използва същите настройки като при поверително разглеждане и няма да помни никаква история, докато сте в интернет. history-private-browsing-permanent = @@ -1081,6 +1122,8 @@ sitedata-delete-on-close = .label = Изтриване на бисквитки и данни на страници при изход от { -brand-short-name } .accesskey = д +sitedata-delete-on-close-private-browsing3 = + .message = Въз основа на вашите настройки за пазене на история { -brand-short-name } изтрива бисквитки и данни от сайтове от вашата сесията при затваряне на браузъра. sitedata-delete-on-close-private-browsing = В постоянен режим на поверително разглеждане бисквитките и данните на страници винаги ще бъдат изчиствани при затваряне на { -brand-short-name }. sitedata-delete-on-close-private-browsing2 = Въз основа на вашите настройки за пазене на история { -brand-short-name } изтрива бисквитки и данни от сайтове от вашата сесията при затваряне на браузъра. sitedata-allow-cookies-option = @@ -1173,6 +1216,10 @@ addressbar-locbar-showtrendingsuggestions-option = .label = Показване на набиращи популярност предложения за търсене .accesskey = щ +# Toggles whether suggestions are obtained from Firefox Suggest or not (local or online). +addressbar-locbar-suggest-all-option = + .label = Предложения от { -brand-short-name } +addressbar-locbar-suggest-all-option-desc = Получавайте предложения от мрежата, свързани с вашето търсене. # Nonsponsored suggestions refers to Firefox Suggest suggestions like Wikipedia. addressbar-locbar-suggest-nonsponsored-option = .label = Предложения от { -brand-short-name } @@ -1322,6 +1369,8 @@ permissions-notification-pause = .label = Спиране на известията до рестарт на { -brand-short-name } .accesskey = з +permissions-autoplay2 = + .label = Автоматично възпроизвеждане permissions-autoplay = Автоматично възпроизвеждане permissions-autoplay-settings = .label = Настройки… @@ -1341,6 +1390,16 @@ permissions-addon-exceptions = .label = Изключения… .accesskey = И +permissions-location2 = + .label = Местоположение +permissions-xr2 = + .label = Виртуална реалност +permissions-camera2 = + .label = Камера +permissions-microphone2 = + .label = Микрофон +permissions-notification2 = + .label = Известия ## Privacy Section - Data Collection @@ -1438,6 +1497,7 @@ certs-thirdparty-toggle = .label = Разрешаване на { -brand-short-name } автоматично да се доверява на кореновите сертификати на трети страни, които инсталирате .accesskey = т +certs-devices-enable-fips = Включване на FIPS space-alert-over-5gb-settings-button = .label = Към Настройки .accesskey = с diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/profiles.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/profiles.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/profiles.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/profiles.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -18,9 +18,19 @@ # Variables # $number (number) - The number of the profile default-profile-name = Профил { $number } +edit-profile-page-delete-button = + .label = Изтриване +new-profile-page-learn-more = Научете повече ## Delete profile dialogue that allows users to review what they will lose if they choose to delete their profile. Each item (open windows, etc.) is displayed in a table, followed by a column with the number of items. +# Variables +# $profilename (String) - The name of the profile. +delete-profile-page-title = Изтриване на потребителския профил на { $profilename } +# Variables +# $profilename (String) - The name of the profile. +delete-profile-header = Да се изтрие ли потребителския профил на { $profilename }? +delete-profile-description = { -brand-short-name } ще изтрие необратимо следните данни от устройството: delete-profile-logins = Пароли ## @@ -44,6 +54,6 @@ shopping-avatar-alt = .alt = Количка за пазаруване -## Labels for default avatar icons +## Tooltips for default avatar icons shopping-avatar = Количка за пазаруване diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/screenshots.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/screenshots.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/screenshots.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/screenshots.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -15,6 +15,10 @@ screenshots-download-button-tooltip = Изтегляне на екранна снимка screenshots-copy-button = Копиране screenshots-copy-button-tooltip = Копиране в клипборда +screenshots-download-button-title = + .title = Изтегляне на екранна снимка +screenshots-copy-button-title = + .title = Копиране на екранната снимка в системния буфер screenshots-cancel-button-title = .title = Отмяна screenshots-retry-button-title = @@ -41,6 +45,9 @@ screenshots-generic-error-title = Леле! Нещо се обърка с { -screenshots-brand-name }. screenshots-generic-error-details = Не сме сигурни какво точно се случи. Може да опитате отново, както и да снимате друга страница. screenshots-too-large-error-title = Екранната ви снимка беше отрязана, защото е твърде голяма +screenshots-component-retry-button = + .title = Нов опит за снимка на екрана + .aria-label = Нов опит за снимка на екрана # Variables # $shortcut (String) - A keyboard shortcut for copying the screenshot. screenshots-component-copy-button-2 = Копиране @@ -51,6 +58,11 @@ screenshots-component-download-button-2 = Изтегляне .title = Изтегляне ({ $shortcut }) .aria-label = Изтегляне +# Variables +# $shortcut (String) - A keyboard shortcut for the screenshot command. +screenshot-toolbar-button = + .label = Екранна снимка + .tooltiptext = Направете снимка на екрана ({ $shortcut }) ## diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/sidebar.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/sidebar.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/sidebar.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/sidebar.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -4,6 +4,8 @@ menu-view-genai-chat = .label = AI Чатбот +menu-view-contextual-password-manager = + .label = Пароли sidebar-options-menu-button = .title = Отваряне на меню @@ -19,10 +21,24 @@ .heading = { DATETIME($date, dateStyle: "full") } sidebar-history-date-prev-month = .heading = { DATETIME($date, month: "long", year: "numeric") } +# When history is sorted by site, this heading is used in place of a domain, in +# order to group sites that do not come from an outside host. +# For example, this would be the heading for all file:/// URLs in history. +sidebar-history-site-localhost = + .heading = (местни файлове) sidebar-history-delete = .title = Изтриване от историята sidebar-history-clear = .label = Изчистване на историята +sidebar-history-sort-by-heading = Подреждане по: +sidebar-history-sort-option-date = + .label = Дата +sidebar-history-sort-option-site = + .label = Сайт +sidebar-history-sort-option-date-and-site = + .label = Дата и сайт +sidebar-history-sort-option-last-visited = + .label = Последно посетени ## Labels for sidebar search @@ -40,6 +56,18 @@ sidebar-customize-firefox-settings = Управление на настройките на { -brand-short-name } sidebar-vertical-tabs = .label = Вертикални раздели +sidebar-settings = + .label = Настройки на страничната лента +sidebar-hide-tabs-and-sidebar = + .label = Скриване на раздели и странична лента +sidebar-show-on-the-right = + .label = Преместване на страничната лента отдясно +sidebar-show-on-the-left = + .label = Преместване на страничната лента вляво +# Option to automatically expand the collapsed sidebar when the mouse pointer +# hovers over it. +expand-sidebar-on-hover = + .label = Разгъване на страничната лента при движение на мишката sidebar-manage-extensions = Управление на разширения ## Labels for sidebar context menu items @@ -50,18 +78,43 @@ .label = Премахване на разширението sidebar-context-menu-report-extension = .label = Докладване на разширението +sidebar-context-menu-open-in-tab = + .label = Отваряне в нов раздел +sidebar-context-menu-open-in-container-tab = + .label = Отворяне в нов изолиран раздел sidebar-context-menu-open-in-window = .label = Отваряне в прозорец sidebar-context-menu-open-in-private-window = .label = Отваряне в поверителен прозорец +sidebar-context-menu-forget-site = + .label = Изчистване на всички данни за уебсайт… sidebar-context-menu-bookmark-tab = .label = Отмятане на раздела… sidebar-context-menu-copy-link = .label = Копиране на препратката +sidebar-context-menu-hide-sidebar = + .label = Скриване на страничната лента +sidebar-context-menu-enable-vertical-tabs = + .label = Включване на вертикални раздели +sidebar-context-menu-customize-sidebar = + .label = Персонализиране на страничната лента # Variables: # $deviceName (String) - The name of the device the user is closing a tab for sidebar-context-menu-close-remote-tab = .label = Затваряне на раздела на { $deviceName } +sidebar-context-menu-remove-extension2 = + .label = Премахване от { -brand-short-name } +sidebar-context-menu-unpin-extension = + .label = Премахване от страничната лента + +## Labels for sidebar history context menu items + +sidebar-history-context-menu-delete-page-2 = + .label = Изтриване на страницата от историята +sidebar-history-context-menu-bookmark-page = + .label = Отмятане на страница… +sidebar-history-context-menu-delete-pages = + .label = Изтриване на страници от История ## Labels for sidebar menu items. @@ -75,6 +128,10 @@ .label = Отметки sidebar-menu-customize-label = .label = Приспособяване на страничната лента +sidebar-menu-contextual-password-manager-label = + .label = Пароли +sidebar-menu-more-tools-label = + .label = Още инструменти ## Tooltips for sidebar menu items. @@ -95,6 +152,16 @@ # $shortcut (String) - The OS specific keyboard shortcut. sidebar-menu-close-bookmarks-tooltip = Затваряне на отметките ({ $shortcut }) +## Tooltips displayed over the AI chatbot icon. +## Variables: +## $shortcut (String) - The OS specific keyboard shortcut. +## $provider (String) - The name of the AI chatbot provider (if available). + +sidebar-menu-open-ai-chatbot-tooltip-generic = Отваряне на AI чатбот ({ $shortcut }) +sidebar-menu-open-ai-chatbot-provider-tooltip = Отваряне на { $provider } ({ $shortcut }) +sidebar-menu-close-ai-chatbot-tooltip-generic = Затваряне на AI чатбот ({ $shortcut }) +sidebar-menu-close-ai-chatbot-provider-tooltip = Затваряне на { $provider } ({ $shortcut }) + ## Headings for sidebar menu panels. sidebar-menu-customize-header = @@ -103,6 +170,8 @@ .heading = История sidebar-menu-syncedtabs-header = .heading = Раздели от други устройства +sidebar-menu-cpm-header = + .heading = Пароли sidebar-panel-header-close-button = .tooltiptext = Затваряне @@ -146,3 +215,7 @@ sidebar-widget-hide-sidebar2 = .tooltiptext = Скриване на страничната лента ({ $shortcut }) .label = Странични ленти +# Promotional message displayed in the expanded sidebar state for Vertical Tabs +# users who do not have any pinned tabs. Indicates that they can drop tabs in +# this area to pin them. +sidebar-pins-promo-text = Плъзнете тук важните раздели, за да ги имате под ръка diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/tabContextMenu.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/tabContextMenu.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/tabContextMenu.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/tabContextMenu.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -130,3 +130,11 @@ *[other] Изпращане на { $tabCount } раздела до устройство } .accesskey = у +tab-context-unload-n-tabs = + .label = + { $tabCount -> + [1] Освобождаване на раздели + [one] Освобождаване на { $tabCount } раздел + *[other] Освобождаване на { $tabCount } раздела + } + .accesskey = О diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/tabbrowser.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/tabbrowser.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/tabbrowser.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/tabbrowser.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -8,6 +8,15 @@ .label = Затваряне на раздела tabbrowser-menuitem-close = .label = Затваряне +# Displayed within the tooltip on tabs inside of a tab group. +# Variables: +# $tabGroupName (String): the user-defined name of the current tab group. +tabbrowser-tab-tooltip-tab-group = { $tabGroupName } +# Displayed within the tooltip on tabs inside of a tab group if the tab is also in a container. +# Variables: +# $tabGroupName (String): the user-defined name of the current tab group. +# $containerName (String): the name of the current container. +tabbrowser-tab-tooltip-tab-group-container = { $tabGroupName } — { $containerName } # Displayed as a tooltip on container tabs # Variables: # $title (String): the title of the current tab. @@ -196,10 +205,16 @@ .tooltiptext = Включване на звука на раздела tabbrowser-manager-close-tab = .tooltiptext = Затваряне на раздела +# This is for tab groups that have been "saved and closed" (see tab-group-editor-action-save). It does +# not include "deleted" tab groups (see tab-group-editor-action-delete). +tabbrowser-manager-closed-tab-group = + .label = { $tabGroupName } + .tooltiptext = { $tabGroupName } — Затворено +tabbrowser-manager-current-window-tab-group = + .label = { $tabGroupName } + .tooltiptext = { $tabGroupName } — Текущ прозорец -## Variables: -## $tabGroupName (String): The name of the tab group. Defaults to the value -## of tab-group-name-default. +## tab-group-editor-title-create = Създаване на група от раздели tab-group-editor-title-edit = Управление на група от раздели @@ -209,8 +224,12 @@ tab-group-editor-cancel = .label = Отказ .accesskey = о +tab-group-editor-color-selector = + .aria-label = Цвят на група раздели +tab-group-description = { $tabGroupName } — Група от раздели tab-context-unnamed-group = .label = Неименувана група +tab-group-name-default = Неименувана група ## @@ -228,6 +247,8 @@ *[other] Добавяне на раздели към група } .accesskey = г +tab-context-move-tab-to-group-saved-groups = + .label = Затворени групи tab-group-editor-action-new-tab = .label = Нов раздел в групата tab-group-editor-action-new-window = @@ -252,3 +273,28 @@ *[other] Премахване от групи } .accesskey = г + +## Open/saved tab group context menu + +# For a tab group open in any window, clicking this will create a new +# window and move this tab group to that new window. +tab-group-context-move-to-new-window = + .label = Преместване на групата в нов прозорец +# For a tab group open in a different window from the one that the +# user is using to access the tab group menu, move that tab group into the +# user's current window. +tab-group-context-move-to-this-window = + .label = Преместване на групата в този прозорец +# For a tab group that is open in any window, close the tab group and +# do not save it. For a tab group that is closed but saved by the user, clicking +# this will forget the saved tab group. +tab-group-context-delete = + .label = Изтриване на група +# For a saved tab group that is not open in any window, open the tab group +# in the user's current window. +tab-group-context-open-saved-group-in-this-window = + .label = Отваряне на групата в този прозорец +# For a saved tab group that is not open in any window, create a new window and +# open the tab group in that window. +tab-group-context-open-saved-group-in-new-window = + .label = Отваряне на групата в нов прозорец diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/taskbartabs.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/taskbartabs.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/taskbartabs.ftl 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/taskbartabs.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -0,0 +1,11 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at https://mozilla.org/MPL/2.0/. + + +## Taskbar Tab urlbar button, will appear if +## browser.taskbarTabs.enabled = true and the user +## navigates to a website. + +taskbar-tab-urlbar-button-open = + .tooltiptext = Добавяне на раздел към лентата със задачи diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/unexpectedScript.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/unexpectedScript.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/unexpectedScript.ftl 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/unexpectedScript.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -0,0 +1,5 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +unexpected-script-load-learn-more = Научете повече diff -Nru firefox-esr-140.5.0esr/l10n-bg/browser/browser/webauthnDialog.ftl firefox-esr-140.6.0esr/l10n-bg/browser/browser/webauthnDialog.ftl --- firefox-esr-140.5.0esr/l10n-bg/browser/browser/webauthnDialog.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/browser/browser/webauthnDialog.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -25,3 +25,40 @@ *[other] Проверката на потребител е неуспешна. Остават { $retriesLeft } опита. Опитайте отново. } webauthn-uv-invalid-short-prompt = Проверката за потребител е неуспешна. Опитайте отново. + +## WebAuthn prompts + +# Variables: +# $hostname (String): the origin (website) asking for the security key. +webauthn-user-presence-prompt = Докоснете ключа си за сигурност, за да продължите с { $hostname }. +# The website is asking for extended information about your +# hardware authenticator that shouldn't be generally necessary. Permitting +# this is safe if you only use one account at this website. If you have +# multiple accounts at this website, and you use the same hardware +# authenticator, then the website could link those accounts together. +# And this is true even if you use a different profile / browser (or even Tor +# Browser). To avoid this, you should use different hardware authenticators +# for different accounts on this website. +# Variables: +# $hostname (String): the origin (website) asking for the extended information. +webauthn-register-direct-prompt = { $hostname } иска разширена информация за вашия ключ за сигурност, която може да засегне поверителността ви. +webauthn-register-direct-prompt-hint = { -brand-short-name } може да анонимизира това за вас, но уебсайтът може да откаже този ключ. При отказ може да опитате отново. +# Variables: +# $hostname (String): the origin (website) for which an account needs to be selected. +webauthn-select-sign-result-prompt = Намерени са множество регистрации за { $hostname }. Изберете коя да използвате или да откажете. +# Variables: +# $hostname (String): the origin (website) for which a device needs to be selected. +webauthn-select-device-prompt = Намерени са множество устройства за { $hostname }. Моля, изберете едно. +# Variables: +# $hostname (String): the origin (website) for which user verification failed. +webauthn-pin-not-set-prompt = Потребителската проверка на { $hostname } е неуспешна. Може да се наложи да зададете PIN на устройството си. +# Variables: +# $hostname (String): the origin (website) for which user verification failed. +webauthn-uv-blocked-prompt = Потребителската проверка на { $hostname } е неуспешна. Имаше твърде много неуспешни опити и вграденият метод за потребителска проверка е блокиран. +webauthn-already-registered-prompt = Устройството вече е регистрирано. Опитайте с друго устройство. +webauthn-cancel = Отказ + .accesskey = о +webauthn-allow = Разрешаване + .accesskey = А +webauthn-block = Блокиране + .accesskey = Б diff -Nru firefox-esr-140.5.0esr/l10n-bg/devtools/client/accessibility.ftl firefox-esr-140.6.0esr/l10n-bg/devtools/client/accessibility.ftl --- firefox-esr-140.5.0esr/l10n-bg/devtools/client/accessibility.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/devtools/client/accessibility.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -38,5 +38,8 @@ ## with its text label or accessible name. accessibility-text-label-issue-dialog = Диалозите трябва да имат етикет. Научете повече +accessibility-text-label-issue-embed = Вграденото съдържание трябва да имат етикет. Научете повече +accessibility-text-label-issue-figure = Илюстрациите с допълнителни надписи трябва да имат етикет. Научете повече +accessibility-text-label-issue-form = Елементите от формуляр трябва да бъдат етикетирани. Научете повече accessibility-text-label-issue-image = Съдържанието с изображения трябва да има етикет. Научете повече accessibility-text-label-issue-interactive = Интерактивните елементи трябва да имат етикет. Научете повече diff -Nru firefox-esr-140.5.0esr/l10n-bg/devtools/client/accessibility.properties firefox-esr-140.6.0esr/l10n-bg/devtools/client/accessibility.properties --- firefox-esr-140.5.0esr/l10n-bg/devtools/client/accessibility.properties 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/devtools/client/accessibility.properties 2025-11-21 02:32:14.000000000 +0000 @@ -27,6 +27,14 @@ # LOCALIZATION NOTE (accessibility.treeName): A title text used for # Accessibility tree (that represents accessible element name) container. accessibility.treeName = Дърво на достъпност +# LOCALIZATION NOTE (accessibility.accessible.selectElement.title): A title text +# displayed on buttons next to accessible elements in the `relations` section, allowing the +# user to select the element in the accessibility tree. +accessibility.accessible.selectElement.title = Щракнете, за да изберете възела в дървото на достъпността +# LOCALIZATION NOTE (accessibility.accessible.selectNodeInInspector.title): A title text +# displayed on buttons next to nodes in the sidebar, allowing the user to select the node +# in the Inspector panel. +accessibility.accessible.selectNodeInInspector.title = Щракнете, за да изберете възел в инспектора # LOCALIZATION NOTE (accessibility.accessible.notAvailable): A title text # displayed when accessible sidebar panel does not have an accessible object to # display. diff -Nru firefox-esr-140.5.0esr/l10n-bg/devtools/client/application.ftl firefox-esr-140.6.0esr/l10n-bg/devtools/client/application.ftl --- firefox-esr-140.5.0esr/l10n-bg/devtools/client/application.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/devtools/client/application.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -43,18 +43,38 @@ serviceworker-worker-status-running = Включена # Service Worker status. A stopped service worker is registered but not currently active. serviceworker-worker-status-stopped = Спряна +# Text displayed when no service workers are visible for the current page. +serviceworker-empty-intro2 = Не са открити обслужващи нишки # Link will open https://developer.mozilla.org/docs/Web/API/Service_Worker_API/Using_Service_Workers serviceworker-empty-intro-link = Научете повече # Text displayed when there are no Service Workers to display for the current page, # introducing hints to debug Service Worker issues. # and are links that will open the webconsole and the debugger, respectively. serviceworker-empty-suggestions2 = Ако текущата страница трябва да има обслужваща нишка, (service worker), може да потърсите грешки в конзолата или да преминете през регистрацията на нишката (service worker) в дебъгера. +# Header for the Manifest page when we have an actual manifest +manifest-view-header = Манифест на приложението +# Header for the Manifest page when there's no manifest to inspect +manifest-empty-intro2 = Не е открит манифест на уеб приложението +# The link will open https://developer.mozilla.org/en-US/docs/Web/Manifest +manifest-empty-intro-link = Научете как да добавите манифест # Header for the Errors and Warnings section of Manifest inspection displayed in the application panel. manifest-item-warnings = Грешки и предупреждения +# Header for the Identity section of Manifest inspection displayed in the application panel. +manifest-item-identity = Идентичност # Header for the Icon section of Manifest inspection displayed in the application panel. manifest-item-icons = Пиктограми # Text displayed while we are loading the manifest file manifest-loading = Зареждане на manifest… +# Text displayed when the manifest has been successfully loaded +manifest-loaded-ok = Манифестът е зареден. +# Text displayed as a caption when there has been an error while trying to +# load the manifest +manifest-loaded-error = Възникна грешка при зареждане на манифеста: +# Text displayed as an error when there has been a Firefox DevTools error while +# trying to load the manifest +manifest-loaded-devtools-error = Грешка в Firefox DevTools +# Text displayed when the page has no manifest available +manifest-non-existing = Не е намерен манифест за проверка. # Text displayed as the alt attribute for tags showing the icons in the # manifest. manifest-icon-img = diff -Nru firefox-esr-140.5.0esr/l10n-bg/devtools/client/boxmodel.properties firefox-esr-140.6.0esr/l10n-bg/devtools/client/boxmodel.properties --- firefox-esr-140.5.0esr/l10n-bg/devtools/client/boxmodel.properties 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/devtools/client/boxmodel.properties 2025-11-21 02:32:14.000000000 +0000 @@ -21,6 +21,14 @@ # LOCALIZATION NOTE: (boxmodel.propertiesLabel) This label is displayed as the header # for showing and collapsing the properties underneath the box model in the layout view boxmodel.propertiesLabel = Свойства +# LOCALIZATION NOTE (boxmodel.propertiesHideLabel): +# This is the spoken label for the twisty. +# If the properties are currently showing, it will say "Hide". +boxmodel.propertiesHideLabel = Скриване +# LOCALIZATION NOTE (boxmodel.propertiesShowLabel): +# This is the spoken label for the twisty. +# If the properties are currently hidden, it will say "Show". +boxmodel.propertiesShowLabel = Показване # LOCALIZATION NOTE: (boxmodel.offsetParent) This label is displayed inside the list of # properties, below the box model, in the layout view. It is displayed next to the # position property, when position is absolute, relative, sticky. This label tells users diff -Nru firefox-esr-140.5.0esr/l10n-bg/devtools/client/changes.properties firefox-esr-140.6.0esr/l10n-bg/devtools/client/changes.properties --- firefox-esr-140.5.0esr/l10n-bg/devtools/client/changes.properties 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/devtools/client/changes.properties 2025-11-21 02:32:14.000000000 +0000 @@ -10,19 +10,33 @@ # LOCALIZATION NOTE (changes.noChangesDescription): This text is shown when no changes are # available and provides additional context for the purpose of the Changes panel. changes.noChangesDescription = Промени от инспектора на CSS ще се покажат тук. +# LOCALIZATION NOTE (changes.inlineStyleSheetLabel2): This label appears in the Changes +# panel above changes done to inline stylesheets. +changes.inlineStyleSheetLabel2 = Вложен (inline) # LOCALIZATION NOTE (changes.inlineStyleSheetLabel): This label appears in the Changes # panel above changes done to inline stylesheets. The variable will be replaced with the # index of the stylesheet within its document like so: Inline #1 -changes.inlineStyleSheetLabel = Едноредово %S +changes.inlineStyleSheetLabel = Вложен (inline) %S # LOCALIZATION NOTE (changes.elementStyleLabel): This label appears in the Changes # panel above changes done to element styles. changes.elementStyleLabel = Елемент +# LOCALIZATION NOTE (changes.iframeLabel): This label appears next to URLs of stylesheets +# and element inline styles hosted by iframes. Lowercase intentional. +changes.iframeLabel = iframe # LOCALIZATION NOTE (changes.contextmenu.copy): Label for "Copy" option in Changes panel # context menu changes.contextmenu.copy = Копиране # LOCALIZATION NOTE (changes.contextmenu.copy.accessKey): Access key for "Copy" # option in the Changes panel. changes.contextmenu.copy.accessKey = К +# LOCALIZATION NOTE (changes.contextmenu.copyAllChanges): Label for "Copy All Changes" +# option in Changes panel context menu which copies all changed CSS declarations from a +# stylesheet +changes.contextmenu.copyAllChanges = Копиране на всички промени +# LOCALIZATION NOTE (changes.contextmenu.copyAllChangesDescription): Detailed explanation +# for "Copy All Changes" option in Changes panel. Used as title attribute on "Copy All +# Changes" button +changes.contextmenu.copyAllChangesDescription = Копиране на списък с всички промени в CSS в системния буфер. # LOCALIZATION NOTE (changes.contextmenu.copyDeclaration): Label for "Copy Declaration" # option in Changes panel context menu which copies the target CSS declaration. changes.contextmenu.copyDeclaration = Копиране на декларация diff -Nru firefox-esr-140.5.0esr/l10n-bg/devtools/client/compatibility.ftl firefox-esr-140.6.0esr/l10n-bg/devtools/client/compatibility.ftl --- firefox-esr-140.5.0esr/l10n-bg/devtools/client/compatibility.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/devtools/client/compatibility.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -3,6 +3,10 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. +## Messages used as headers in the main pane + +compatibility-all-elements-header = Всички + ## Message used as labels for the type of issue compatibility-issue-deprecated = (изведено от употреба) diff -Nru firefox-esr-140.5.0esr/l10n-bg/devtools/client/components.properties firefox-esr-140.6.0esr/l10n-bg/devtools/client/components.properties --- firefox-esr-140.5.0esr/l10n-bg/devtools/client/components.properties 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/devtools/client/components.properties 2025-11-21 02:32:14.000000000 +0000 @@ -15,3 +15,6 @@ # LOCALIZATION NOTE (notificationBox.closeTooltip): The content of a tooltip that # appears when hovering over the close button in a notification box. notificationBox.closeTooltip = Затваряне на съобщението +# LOCALIZATION NOTE (appErrorBoundary.fileBugButton): This is the text that appears in +# the button to visit the bug filing link. +appErrorBoundary.fileBugButton = Подаване на доклад за дефект diff -Nru firefox-esr-140.5.0esr/l10n-bg/devtools/client/debugger.properties firefox-esr-140.6.0esr/l10n-bg/devtools/client/debugger.properties --- firefox-esr-140.5.0esr/l10n-bg/devtools/client/debugger.properties 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/devtools/client/debugger.properties 2025-11-21 02:32:14.000000000 +0000 @@ -32,6 +32,8 @@ # LOCALIZATION NOTE (removeDirectoryRoot.label): This is the text that appears in the # context menu to remove a directory as root directory removeDirectoryRoot.label = Премахване на коренова папка +# LOCALIZATION NOTE (ignoreAll.label): Text associated with the ignore context menu item +ignoreAll.label = Пренебрегване # LOCALIZATION NOTE (unignoreAllInGroup.label): This is the text that appears in the # context submenu to unignore all files inside of the selected group unignoreAllInGroup.label = Премахнете игнорирането на файловете в тази група diff -Nru firefox-esr-140.5.0esr/l10n-bg/devtools/client/toolbox-options.ftl firefox-esr-140.6.0esr/l10n-bg/devtools/client/toolbox-options.ftl --- firefox-esr-140.5.0esr/l10n-bg/devtools/client/toolbox-options.ftl 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/devtools/client/toolbox-options.ftl 2025-11-21 02:32:14.000000000 +0000 @@ -59,6 +59,8 @@ options-screenshot-label = Снимка на екрана # Label for the checkbox that toggles screenshot to clipboard feature options-screenshot-clipboard-only-label = Екранна снимка само в системен буфер +options-screenshot-clipboard-tooltip2 = + .title = Запазва екранната снимка директно в системния буфер # Label for the checkbox that toggles the camera shutter audio for screenshot tool options-screenshot-audio-label = Звук от затвора на фотоапарат options-screenshot-audio-tooltip = @@ -107,5 +109,5 @@ options-source-maps-label = Включване на Source Maps options-source-maps-tooltip = .title = Ако е отметнато source maps ще бъдат използвани в инструментите. -# The message shown for settings that trigger page reload +# The message shown for settings that trigger page reload and will only apply to the current session options-context-triggers-page-refresh = * Само за текущата сесия, презарежда страницата diff -Nru firefox-esr-140.5.0esr/l10n-bg/dom/chrome/dom/dom.properties firefox-esr-140.6.0esr/l10n-bg/dom/chrome/dom/dom.properties --- firefox-esr-140.5.0esr/l10n-bg/dom/chrome/dom/dom.properties 2025-09-08 11:42:00.000000000 +0000 +++ firefox-esr-140.6.0esr/l10n-bg/dom/chrome/dom/dom.properties 2025-11-21 02:32:14.000000000 +0000 @@ -79,6 +79,8 @@ SetHTMLScript = Извикване на setHTML върху елемент + + + + + + + + + + + + diff -Nru firefox-esr-140.5.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/iframe_javascript_url_form_submission.html firefox-esr-140.6.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/iframe_javascript_url_form_submission.html --- firefox-esr-140.5.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/iframe_javascript_url_form_submission.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/iframe_javascript_url_form_submission.html 2025-12-01 18:15:45.000000000 +0000 @@ -0,0 +1,32 @@ + +javascript: URL in form submission, initial src is not about:blank + + + + + + + diff -Nru firefox-esr-140.5.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/iframe_javascript_url_xhr.html firefox-esr-140.6.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/iframe_javascript_url_xhr.html --- firefox-esr-140.5.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/iframe_javascript_url_xhr.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/iframe_javascript_url_xhr.html 2025-12-01 18:15:44.000000000 +0000 @@ -0,0 +1,84 @@ + +javascript: URL triggers sync xhr + + + + + + + + diff -Nru firefox-esr-140.5.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/resources/javascript_url_form_submission.html firefox-esr-140.6.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/resources/javascript_url_form_submission.html --- firefox-esr-140.5.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/resources/javascript_url_form_submission.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/testing/web-platform/tests/html/semantics/embedded-content/the-iframe-element/resources/javascript_url_form_submission.html 2025-12-01 18:15:44.000000000 +0000 @@ -0,0 +1,3 @@ + + +
\ No newline at end of file diff -Nru firefox-esr-140.5.0esr/testing/web-platform/tests/webrtc-encoded-transform/RTCRtpScriptTransform-sender-worker-single-frame.https.html firefox-esr-140.6.0esr/testing/web-platform/tests/webrtc-encoded-transform/RTCRtpScriptTransform-sender-worker-single-frame.https.html --- firefox-esr-140.5.0esr/testing/web-platform/tests/webrtc-encoded-transform/RTCRtpScriptTransform-sender-worker-single-frame.https.html 2025-11-07 00:11:17.000000000 +0000 +++ firefox-esr-140.6.0esr/testing/web-platform/tests/webrtc-encoded-transform/RTCRtpScriptTransform-sender-worker-single-frame.https.html 2025-12-01 18:15:45.000000000 +0000 @@ -1,6 +1,7 @@ + RTCRtpScriptTransform Insertable Streams - Worker diff -Nru firefox-esr-140.5.0esr/third_party/moz.build firefox-esr-140.6.0esr/third_party/moz.build --- firefox-esr-140.5.0esr/third_party/moz.build 2025-11-07 00:11:18.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/moz.build 2025-12-01 18:15:47.000000000 +0000 @@ -108,3 +108,6 @@ with Files("fmt"): BUG_COMPONENT = ("Core", "MFBT") + +with Files("zucchini/**"): + BUG_COMPONENT = ("Toolkit", "Application Update") diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/LICENSE firefox-esr-140.6.0esr/third_party/zucchini/chromium/LICENSE --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/LICENSE 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/LICENSE 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,27 @@ +// Copyright 2015 The Chromium Authors +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google LLC nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/augmentations/compiler_specific.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/augmentations/compiler_specific.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/augmentations/compiler_specific.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/augmentations/compiler_specific.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,22 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_AUGMENTATIONS_COMPILER_SPECIFIC_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_AUGMENTATIONS_COMPILER_SPECIFIC_H_ + +// Extensions for PA's copy of `//base/compiler_specific.h`. + +#include "base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h" + +// PA_ATTRIBUTE_RETURNS_NONNULL +// +// Tells the compiler that a function never returns a null pointer. +// Sourced from Abseil's `attributes.h`. +#if PA_HAS_ATTRIBUTE(returns_nonnull) +#define PA_ATTRIBUTE_RETURNS_NONNULL __attribute__((returns_nonnull)) +#else +#define PA_ATTRIBUTE_RETURNS_NONNULL +#endif + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_AUGMENTATIONS_COMPILER_SPECIFIC_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h 2025-12-01 18:15:47.000000000 +0000 @@ -0,0 +1,235 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_COMPILER_SPECIFIC_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_COMPILER_SPECIFIC_H_ + +#include "build/build_config.h" + +// A wrapper around `__has_attribute`, similar to HAS_CPP_ATTRIBUTE. +#if defined(__has_attribute) +#define PA_HAS_ATTRIBUTE(x) __has_attribute(x) +#else +#define PA_HAS_ATTRIBUTE(x) 0 +#endif + +// A wrapper around `__has_builtin`, similar to HAS_CPP_ATTRIBUTE. +#if defined(__has_builtin) +#define PA_HAS_BUILTIN(x) __has_builtin(x) +#else +#define PA_HAS_BUILTIN(x) 0 +#endif + +// Annotate a function indicating it should not be inlined. +// Use like: +// NOINLINE void DoStuff() { ... } +#if defined(__clang__) && PA_HAS_ATTRIBUTE(noinline) && \ + (!defined(MOZ_ZUCCHINI) || __clang_major__ >= 15) +#define PA_NOINLINE [[clang::noinline]] +#elif defined(COMPILER_GCC) && PA_HAS_ATTRIBUTE(noinline) +#define PA_NOINLINE __attribute__((noinline)) +#elif defined(COMPILER_MSVC) +#define PA_NOINLINE __declspec(noinline) +#else +#define PA_NOINLINE +#endif + +#if defined(__clang__) && defined(NDEBUG) && PA_HAS_ATTRIBUTE(always_inline) && \ + (!defined(MOZ_ZUCCHINI) || __clang_major__ >= 15) +#define PA_ALWAYS_INLINE [[clang::always_inline]] inline +#elif defined(COMPILER_GCC) && defined(NDEBUG) && \ + PA_HAS_ATTRIBUTE(always_inline) +#define PA_ALWAYS_INLINE inline __attribute__((__always_inline__)) +#elif defined(COMPILER_MSVC) && defined(NDEBUG) +#define PA_ALWAYS_INLINE __forceinline +#else +#define PA_ALWAYS_INLINE inline +#endif + +// Annotate a function indicating it should never be tail called. Useful to make +// sure callers of the annotated function are never omitted from call-stacks. +// To provide the complementary behavior (prevent the annotated function from +// being omitted) look at NOINLINE. Also note that this doesn't prevent code +// folding of multiple identical caller functions into a single signature. To +// prevent code folding, see NO_CODE_FOLDING() in base/debug/alias.h. +// Use like: +// void NOT_TAIL_CALLED FooBar(); +#if defined(__clang__) && PA_HAS_ATTRIBUTE(not_tail_called) +#define PA_NOT_TAIL_CALLED [[clang::not_tail_called]] +#else +#define PA_NOT_TAIL_CALLED +#endif + +// Specify memory alignment for structs, classes, etc. +// Use like: +// class PA_ALIGNAS(16) MyClass { ... } +// PA_ALIGNAS(16) int array[4]; +// +// In most places you can use the C++11 keyword "alignas", which is preferred. +// +// Historically, compilers had trouble mixing __attribute__((...)) syntax with +// alignas(...) syntax. However, at least Clang is very accepting nowadays. It +// may be that this macro can be removed entirely. +#if defined(__clang__) +#define PA_ALIGNAS(byte_alignment) alignas(byte_alignment) +#elif defined(COMPILER_MSVC) +#define PA_ALIGNAS(byte_alignment) __declspec(align(byte_alignment)) +#elif defined(COMPILER_GCC) && PA_HAS_ATTRIBUTE(aligned) +#define PA_ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment))) +#endif + +// Tells the compiler a function is using a printf-style format string. +// |format_param| is the one-based index of the format string parameter; +// |dots_param| is the one-based index of the "..." parameter. +// For v*printf functions (which take a va_list), pass 0 for dots_param. +// (This is undocumented but matches what the system C headers do.) +// For member functions, the implicit this parameter counts as index 1. +#if (defined(COMPILER_GCC) || defined(__clang__)) && PA_HAS_ATTRIBUTE(format) +#define PA_PRINTF_FORMAT(format_param, dots_param) \ + __attribute__((format(printf, format_param, dots_param))) +#else +#define PA_PRINTF_FORMAT(format_param, dots_param) +#endif + +// Sanitizers annotations. +#if PA_HAS_ATTRIBUTE(no_sanitize) +#define PA_NO_SANITIZE(what) __attribute__((no_sanitize(what))) +#endif +#if !defined(PA_NO_SANITIZE) +#define PA_NO_SANITIZE(what) +#endif + +// MemorySanitizer annotations. +#if defined(MEMORY_SANITIZER) +#include + +// Mark a memory region fully initialized. +// Use this to annotate code that deliberately reads uninitialized data, for +// example a GC scavenging root set pointers from the stack. +#define PA_MSAN_UNPOISON(p, size) __msan_unpoison(p, size) +#else // MEMORY_SANITIZER +#define PA_MSAN_UNPOISON(p, size) +#endif // MEMORY_SANITIZER + +// Macro for hinting that an expression is likely to be false. +#if !defined(PA_UNLIKELY) +#if defined(COMPILER_GCC) || defined(__clang__) +#define PA_UNLIKELY(x) __builtin_expect(!!(x), 0) +#else +#define PA_UNLIKELY(x) (x) +#endif // defined(COMPILER_GCC) +#endif // !defined(PA_UNLIKELY) + +#if !defined(PA_LIKELY) +#if defined(COMPILER_GCC) || defined(__clang__) +#define PA_LIKELY(x) __builtin_expect(!!(x), 1) +#else +#define PA_LIKELY(x) (x) +#endif // defined(COMPILER_GCC) +#endif // !defined(PA_LIKELY) + +#if !defined(PA_CPU_ARM_NEON) +#if defined(__arm__) +#if !defined(__ARMEB__) && !defined(__ARM_EABI__) && !defined(__EABI__) && \ + !defined(__VFP_FP__) && !defined(_WIN32_WCE) && !defined(ANDROID) +#error Chromium does not support middle endian architecture +#endif +#if defined(__ARM_NEON__) +#define PA_CPU_ARM_NEON 1 +#endif +#endif // defined(__arm__) +#endif // !defined(CPU_ARM_NEON) + +#if !defined(PA_HAVE_MIPS_MSA_INTRINSICS) +#if defined(__mips_msa) && defined(__mips_isa_rev) && (__mips_isa_rev >= 5) +#define PA_HAVE_MIPS_MSA_INTRINSICS 1 +#endif +#endif + +// The ANALYZER_ASSUME_TRUE(bool arg) macro adds compiler-specific hints +// to Clang which control what code paths are statically analyzed, +// and is meant to be used in conjunction with assert & assert-like functions. +// The expression is passed straight through if analysis isn't enabled. +// +// ANALYZER_SKIP_THIS_PATH() suppresses static analysis for the current +// codepath and any other branching codepaths that might follow. +#if defined(__clang_analyzer__) + +namespace partition_alloc::internal { + +inline constexpr bool AnalyzerNoReturn() __attribute__((analyzer_noreturn)) { + return false; +} + +inline constexpr bool AnalyzerAssumeTrue(bool arg) { + // PartitionAllocAnalyzerNoReturn() is invoked and analysis is terminated if + // |arg| is false. + return arg || AnalyzerNoReturn(); +} + +} // namespace partition_alloc::internal + +#define PA_ANALYZER_ASSUME_TRUE(arg) \ + ::partition_alloc::internal::AnalyzerAssumeTrue(!!(arg)) +#define PA_ANALYZER_SKIP_THIS_PATH() \ + static_cast(::partition_alloc::internal::AnalyzerNoReturn()) + +#else // !defined(__clang_analyzer__) + +#define PA_ANALYZER_ASSUME_TRUE(arg) (arg) +#define PA_ANALYZER_SKIP_THIS_PATH() + +#endif // defined(__clang_analyzer__) + +// Use nomerge attribute to disable optimization of merging multiple same calls. +#if defined(__clang__) && PA_HAS_ATTRIBUTE(nomerge) +#define PA_NOMERGE [[clang::nomerge]] +#else +#define PA_NOMERGE +#endif + +// Marks a type as being eligible for the "trivial" ABI despite having a +// non-trivial destructor or copy/move constructor. Such types can be relocated +// after construction by simply copying their memory, which makes them eligible +// to be passed in registers. The canonical example is std::unique_ptr. +// +// Use with caution; this has some subtle effects on constructor/destructor +// ordering and will be very incorrect if the type relies on its address +// remaining constant. When used as a function argument (by value), the value +// may be constructed in the caller's stack frame, passed in a register, and +// then used and destructed in the callee's stack frame. A similar thing can +// occur when values are returned. +// +// TRIVIAL_ABI is not needed for types which have a trivial destructor and +// copy/move constructors, such as base::TimeTicks and other POD. +// +// It is also not likely to be effective on types too large to be passed in one +// or two registers on typical target ABIs. +// +// See also: +// https://clang.llvm.org/docs/AttributeReference.html#trivial-abi +// https://libcxx.llvm.org/docs/DesignDocs/UniquePtrTrivialAbi.html +#if defined(__clang__) && PA_HAS_ATTRIBUTE(trivial_abi) +#define PA_TRIVIAL_ABI [[clang::trivial_abi]] +#else +#define PA_TRIVIAL_ABI +#endif + +// Requires constant initialization. See constinit in C++20. Allows to rely on a +// variable being initialized before execution, and not requiring a global +// constructor. +#if PA_HAS_ATTRIBUTE(require_constant_initialization) +#define PA_CONSTINIT __attribute__((require_constant_initialization)) +#endif +#if !defined(PA_CONSTINIT) +#define PA_CONSTINIT +#endif + +#if defined(__clang__) && (!defined(MOZ_ZUCCHINI) || __clang_major__ >= 13) +#define PA_GSL_POINTER [[gsl::Pointer]] +#else +#define PA_GSL_POINTER +#endif + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_COMPILER_SPECIFIC_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/component_export.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/component_export.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/component_export.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/component_export.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,80 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_COMPONENT_EXPORT_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_COMPONENT_EXPORT_H_ + +// Used to annotate symbols which are exported by the component named +// |component|. Note that this only does the right thing if the corresponding +// component target's sources are compiled with |IS_$component_IMPL| defined +// as 1. For example: +// +// class PA_COMPONENT_EXPORT(FOO) Bar {}; +// +// If IS_FOO_IMPL=1 at compile time, then Bar will be annotated using the +// PA_COMPONENT_EXPORT_ANNOTATION macro defined below. Otherwise it will be +// annotated using the PA_COMPONENT_IMPORT_ANNOTATION macro. +#define PA_COMPONENT_EXPORT(component) \ + PA_COMPONENT_MACRO_CONDITIONAL_(IS_##component##_IMPL, \ + PA_COMPONENT_EXPORT_ANNOTATION, \ + PA_COMPONENT_IMPORT_ANNOTATION) + +// Indicates whether the current compilation unit is being compiled as part of +// the implementation of the component named |component|. Expands to |1| if +// |IS_$component_IMPL| is defined as |1|; expands to |0| otherwise. +// +// Note in particular that if |IS_$component_IMPL| is not defined at all, it is +// still fine to test PA_INSIDE_COMPONENT_IMPL(component), which expands to |0| +// as expected. +#define PA_INSIDE_COMPONENT_IMPL(component) \ + PA_COMPONENT_MACRO_CONDITIONAL_(IS_##component##_IMPL, 1, 0) + +// Compiler-specific macros to annotate for export or import of a symbol. No-op +// in non-component builds. These should not see much if any direct use. +// Instead use the PA_COMPONENT_EXPORT macro defined above. +#if defined(COMPONENT_BUILD) +#if defined(WIN32) +#define PA_COMPONENT_EXPORT_ANNOTATION __declspec(dllexport) +#define PA_COMPONENT_IMPORT_ANNOTATION __declspec(dllimport) +#else // defined(WIN32) +#define PA_COMPONENT_EXPORT_ANNOTATION __attribute__((visibility("default"))) +#define PA_COMPONENT_IMPORT_ANNOTATION +#endif // defined(WIN32) +#else // defined(COMPONENT_BUILD) +#define PA_COMPONENT_EXPORT_ANNOTATION +#define PA_COMPONENT_IMPORT_ANNOTATION +#endif // defined(COMPONENT_BUILD) + +// Below this point are several internal utility macros used for the +// implementation of the above macros. Not intended for external use. + +// Helper for conditional expansion to one of two token strings. If |condition| +// expands to |1| then this macro expands to |consequent|; otherwise it expands +// to |alternate|. +#define PA_COMPONENT_MACRO_CONDITIONAL_(condition, consequent, alternate) \ + PA_COMPONENT_MACRO_SELECT_THIRD_ARGUMENT_( \ + PA_COMPONENT_MACRO_CONDITIONAL_COMMA_(condition), consequent, alternate) + +// MSVC workaround for __VA_ARGS__ expanding into one expression. +#define PA_MSVC_EXPAND_ARG(arg) arg + +// Expands to a comma (,) iff its first argument expands to |1|. Used in +// conjunction with |PA_COMPONENT_MACRO_SELECT_THIRD_ARGUMENT_()|, as the +// presence or absense of an extra comma can be used to conditionally shift +// subsequent argument positions and thus influence which argument is selected. +#define PA_COMPONENT_MACRO_CONDITIONAL_COMMA_(...) \ + PA_COMPONENT_MACRO_CONDITIONAL_COMMA_IMPL_(__VA_ARGS__, ) +#define PA_COMPONENT_MACRO_CONDITIONAL_COMMA_IMPL_(x, ...) \ + PA_COMPONENT_MACRO_CONDITIONAL_COMMA_##x##_ +#define PA_COMPONENT_MACRO_CONDITIONAL_COMMA_1_ , + +// Helper which simply selects its third argument. Used in conjunction with +// |PA_COMPONENT_MACRO_CONDITIONAL_COMMA_()| above to implement conditional +// macro expansion. +#define PA_COMPONENT_MACRO_SELECT_THIRD_ARGUMENT_(...) \ + PA_MSVC_EXPAND_ARG( \ + PA_COMPONENT_MACRO_SELECT_THIRD_ARGUMENT_IMPL_(__VA_ARGS__)) +#define PA_COMPONENT_MACRO_SELECT_THIRD_ARGUMENT_IMPL_(a, b, c, ...) c + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_COMPONENT_EXPORT_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/cxx20_is_constant_evaluated.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/cxx20_is_constant_evaluated.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/cxx20_is_constant_evaluated.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/cxx20_is_constant_evaluated.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,41 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_CXX20_IS_CONSTANT_EVALUATED_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_CXX20_IS_CONSTANT_EVALUATED_H_ + +namespace partition_alloc::internal::base { + +// std::is_constant_evaluated was introduced in C++20. PartitionAlloc's minimum +// supported C++ version is C++17. +#if defined(__cpp_lib_is_constant_evaluated) && \ + __cpp_lib_is_constant_evaluated >= 201811L + +#include +using std::is_constant_evaluated; + +#else + +#if defined(MOZ_ZUCCHINI) +#include "base/compiler_specific.h" +#endif // defined(MOZ_ZUCCHINI) + +// Implementation of C++20's std::is_constant_evaluated. +// +// References: +// - https://en.cppreference.com/w/cpp/types/is_constant_evaluated +// - https://wg21.link/meta.const.eval +constexpr bool is_constant_evaluated() noexcept { +#if !defined(MOZ_ZUCCHINI) || HAS_BUILTIN(__builtin_is_constant_evaluated) + return __builtin_is_constant_evaluated(); +#else + return false; +#endif // !defined(MOZ_ZUCCHINI) || HAS_BUILTIN(__builtin_is_constant_evaluated) +} + +#endif + +} // namespace partition_alloc::internal::base + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_CXX20_IS_CONSTANT_EVALUATED_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,264 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This header file contains macro definitions for thread safety annotations +// that allow developers to document the locking policies of multi-threaded +// code. The annotations can also help program analysis tools to identify +// potential thread safety issues. +// +// Note that no analysis is done inside constructors and destructors, +// regardless of what attributes are used. See +// https://clang.llvm.org/docs/ThreadSafetyAnalysis.html#no-checking-inside-constructors-and-destructors +// for details. +// +// Note that the annotations we use are described as deprecated in the Clang +// documentation, linked below. E.g. we use PA_EXCLUSIVE_LOCKS_REQUIRED where +// the Clang docs use REQUIRES. +// +// http://clang.llvm.org/docs/ThreadSafetyAnalysis.html +// +// We use the deprecated Clang annotations to match Abseil (relevant header +// linked below) and its ecosystem of libraries. We will follow Abseil with +// respect to upgrading to more modern annotations. +// +// https://github.com/abseil/abseil-cpp/blob/master/absl/base/thread_annotations.h +// +// These annotations are implemented using compiler attributes. Using the macros +// defined here instead of raw attributes allow for portability and future +// compatibility. +// +// When referring to mutexes in the arguments of the attributes, you should +// use variable names or more complex expressions (e.g. my_object->mutex_) +// that evaluate to a concrete mutex object whenever possible. If the mutex +// you want to refer to is not in scope, you may use a member pointer +// (e.g. &MyClass::mutex_) to refer to a mutex in some (unknown) object. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_THREAD_ANNOTATIONS_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_THREAD_ANNOTATIONS_H_ + +#include "base/allocator/partition_allocator/partition_alloc_base/debug/debugging_buildflags.h" +#include "build/build_config.h" + +#if defined(__clang__) && (!defined(MOZ_ZUCCHINI) || __clang_major__ >= 9) +#define PA_THREAD_ANNOTATION_ATTRIBUTE__(x) __attribute__((x)) +#else +#define PA_THREAD_ANNOTATION_ATTRIBUTE__(x) // no-op +#endif + +// PA_GUARDED_BY() +// +// Documents if a shared field or global variable needs to be protected by a +// mutex. PA_GUARDED_BY() allows the user to specify a particular mutex that +// should be held when accessing the annotated variable. +// +// Example: +// +// Mutex mu; +// int p1 PA_GUARDED_BY(mu); +#define PA_GUARDED_BY(x) PA_THREAD_ANNOTATION_ATTRIBUTE__(guarded_by(x)) + +// PA_PT_GUARDED_BY() +// +// Documents if the memory location pointed to by a pointer should be guarded +// by a mutex when dereferencing the pointer. +// +// Example: +// Mutex mu; +// int *p1 PA_PT_GUARDED_BY(mu); +// +// Note that a pointer variable to a shared memory location could itself be a +// shared variable. +// +// Example: +// +// // `q`, guarded by `mu1`, points to a shared memory location that is +// // guarded by `mu2`: +// int *q PA_GUARDED_BY(mu1) PA_PT_GUARDED_BY(mu2); +#define PA_PT_GUARDED_BY(x) PA_THREAD_ANNOTATION_ATTRIBUTE__(pt_guarded_by(x)) + +// PA_ACQUIRED_AFTER() / PA_ACQUIRED_BEFORE() +// +// Documents the acquisition order between locks that can be held +// simultaneously by a thread. For any two locks that need to be annotated +// to establish an acquisition order, only one of them needs the annotation. +// (i.e. You don't have to annotate both locks with both PA_ACQUIRED_AFTER +// and PA_ACQUIRED_BEFORE.) +// +// Example: +// +// Mutex m1; +// Mutex m2 PA_ACQUIRED_AFTER(m1); +#define PA_ACQUIRED_AFTER(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(acquired_after(__VA_ARGS__)) + +#define PA_ACQUIRED_BEFORE(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(acquired_before(__VA_ARGS__)) + +// PA_EXCLUSIVE_LOCKS_REQUIRED() / PA_SHARED_LOCKS_REQUIRED() +// +// Documents a function that expects a mutex to be held prior to entry. +// The mutex is expected to be held both on entry to, and exit from, the +// function. +// +// Example: +// +// Mutex mu1, mu2; +// int a PA_GUARDED_BY(mu1); +// int b PA_GUARDED_BY(mu2); +// +// void foo() PA_EXCLUSIVE_LOCKS_REQUIRED(mu1, mu2) { ... }; +#define PA_EXCLUSIVE_LOCKS_REQUIRED(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(exclusive_locks_required(__VA_ARGS__)) + +#define PA_SHARED_LOCKS_REQUIRED(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(shared_locks_required(__VA_ARGS__)) + +// PA_LOCKS_EXCLUDED() +// +// Documents the locks acquired in the body of the function. These locks +// cannot be held when calling this function (as Abseil's `Mutex` locks are +// non-reentrant). +#define PA_LOCKS_EXCLUDED(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(locks_excluded(__VA_ARGS__)) + +// PA_LOCK_RETURNED() +// +// Documents a function that returns a mutex without acquiring it. For example, +// a public getter method that returns a pointer to a private mutex should +// be annotated with PA_LOCK_RETURNED. +#define PA_LOCK_RETURNED(x) PA_THREAD_ANNOTATION_ATTRIBUTE__(lock_returned(x)) + +// PA_LOCKABLE +// +// Documents if a class/type is a lockable type (such as the `Mutex` class). +#define PA_LOCKABLE PA_THREAD_ANNOTATION_ATTRIBUTE__(lockable) + +// PA_SCOPED_LOCKABLE +// +// Documents if a class does RAII locking (such as the `MutexLock` class). +// The constructor should use `PA_*_LOCK_FUNCTION()` to specify the mutex that +// is acquired, and the destructor should use `PA_UNLOCK_FUNCTION()` with no +// arguments; the analysis will assume that the destructor unlocks whatever the +// constructor locked. +#define PA_SCOPED_LOCKABLE PA_THREAD_ANNOTATION_ATTRIBUTE__(scoped_lockable) + +// PA_EXCLUSIVE_LOCK_FUNCTION() +// +// Documents functions that acquire a lock in the body of a function, and do +// not release it. +#define PA_EXCLUSIVE_LOCK_FUNCTION(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(exclusive_lock_function(__VA_ARGS__)) + +// PA_SHARED_LOCK_FUNCTION() +// +// Documents functions that acquire a shared (reader) lock in the body of a +// function, and do not release it. +#define PA_SHARED_LOCK_FUNCTION(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(shared_lock_function(__VA_ARGS__)) + +// PA_UNLOCK_FUNCTION() +// +// Documents functions that expect a lock to be held on entry to the function, +// and release it in the body of the function. +#define PA_UNLOCK_FUNCTION(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(unlock_function(__VA_ARGS__)) + +// PA_EXCLUSIVE_TRYLOCK_FUNCTION() / PA_SHARED_TRYLOCK_FUNCTION() +// +// Documents functions that try to acquire a lock, and return success or failure +// (or a non-boolean value that can be interpreted as a boolean). +// The first argument should be `true` for functions that return `true` on +// success, or `false` for functions that return `false` on success. The second +// argument specifies the mutex that is locked on success. If unspecified, this +// mutex is assumed to be `this`. +#define PA_EXCLUSIVE_TRYLOCK_FUNCTION(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(exclusive_trylock_function(__VA_ARGS__)) + +#define PA_SHARED_TRYLOCK_FUNCTION(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(shared_trylock_function(__VA_ARGS__)) + +// PA_ASSERT_EXCLUSIVE_LOCK() / PA_ASSERT_SHARED_LOCK() +// +// Documents functions that dynamically check to see if a lock is held, and fail +// if it is not held. +#define PA_ASSERT_EXCLUSIVE_LOCK(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(assert_exclusive_lock(__VA_ARGS__)) + +#define PA_ASSERT_SHARED_LOCK(...) \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(assert_shared_lock(__VA_ARGS__)) + +// PA_NO_THREAD_SAFETY_ANALYSIS +// +// Turns off thread safety checking within the body of a particular function. +// This annotation is used to mark functions that are known to be correct, but +// the locking behavior is more complicated than the analyzer can handle. +#define PA_NO_THREAD_SAFETY_ANALYSIS \ + PA_THREAD_ANNOTATION_ATTRIBUTE__(no_thread_safety_analysis) + +//------------------------------------------------------------------------------ +// Tool-Supplied Annotations +//------------------------------------------------------------------------------ + +// PA_TS_UNCHECKED should be placed around lock expressions that are not valid +// C++ syntax, but which are present for documentation purposes. These +// annotations will be ignored by the analysis. +#define PA_TS_UNCHECKED(x) "" + +// PA_TS_FIXME is used to mark lock expressions that are not valid C++ syntax. +// It is used by automated tools to mark and disable invalid expressions. +// The annotation should either be fixed, or changed to PA_TS_UNCHECKED. +#define PA_TS_FIXME(x) "" + +// Like PA_NO_THREAD_SAFETY_ANALYSIS, this turns off checking within the body of +// a particular function. However, this attribute is used to mark functions +// that are incorrect and need to be fixed. It is used by automated tools to +// avoid breaking the build when the analysis is updated. +// Code owners are expected to eventually fix the routine. +#define PA_NO_THREAD_SAFETY_ANALYSIS_FIXME PA_NO_THREAD_SAFETY_ANALYSIS + +// Similar to PA_NO_THREAD_SAFETY_ANALYSIS_FIXME, this macro marks a +// PA_GUARDED_BY annotation that needs to be fixed, because it is producing +// thread safety warning. It disables the PA_GUARDED_BY. +#define PA_GUARDED_BY_FIXME(x) + +// Disables warnings for a single read operation. This can be used to avoid +// warnings when it is known that the read is not actually involved in a race, +// but the compiler cannot confirm that. +#define PA_TS_UNCHECKED_READ(x) \ + partition_alloc::internal::thread_safety_analysis::ts_unchecked_read(x) + +namespace partition_alloc::internal::thread_safety_analysis { + +// Takes a reference to a guarded data member, and returns an unguarded +// reference. +template +inline const T& ts_unchecked_read(const T& v) PA_NO_THREAD_SAFETY_ANALYSIS { + return v; +} + +template +inline T& ts_unchecked_read(T& v) PA_NO_THREAD_SAFETY_ANALYSIS { + return v; +} + +} // namespace partition_alloc::internal::thread_safety_analysis + +// The above is imported as-is from abseil-cpp. The following Chromium-specific +// synonyms are added for Chromium concepts (SequenceChecker/ThreadChecker). +#if BUILDFLAG(PA_DCHECK_IS_ON) + +// Equivalent to PA_GUARDED_BY for SequenceChecker/ThreadChecker. Currently, +#define PA_GUARDED_BY_CONTEXT(name) PA_GUARDED_BY(name) + +// Equivalent to PA_EXCLUSIVE_LOCKS_REQUIRED for SequenceChecker/ThreadChecker. +#define PA_VALID_CONTEXT_REQUIRED(name) PA_EXCLUSIVE_LOCKS_REQUIRED(name) + +#else // BUILDFLAG(PA_DCHECK_IS_ON) + +#define PA_GUARDED_BY_CONTEXT(name) +#define PA_VALID_CONTEXT_REQUIRED(name) + +#endif // BUILDFLAG(PA_DCHECK_IS_ON) + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_THREAD_ANNOTATIONS_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,16 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_WIN_WIN_HANDLE_TYPES_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_WIN_WIN_HANDLE_TYPES_H_ + +// Forward declare Windows compatible handles. + +#define PA_WINDOWS_HANDLE_TYPE(name) \ + struct name##__; \ + typedef struct name##__* name; +#include "base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types_list.inc" +#undef PA_WINDOWS_HANDLE_TYPE + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_BASE_WIN_WIN_HANDLE_TYPES_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types_list.inc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types_list.inc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types_list.inc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types_list.inc 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,25 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file intentionally does not have header guards, it's included +// inside a macro to generate enum values. The following line silences a +// presubmit and Tricium warning that would otherwise be triggered by this: +// no-include-guard-because-multiply-included +// NOLINT(build/header_guard) + +// This file contains the list of Windows handle types that can be recognized +// via specific pointee types declared in //base/win/windows_types.h +// (e.g. `HDC` points to a fake/forward-declared `HDC__` struct). + +PA_WINDOWS_HANDLE_TYPE(HDC) +PA_WINDOWS_HANDLE_TYPE(HDESK) +PA_WINDOWS_HANDLE_TYPE(HGLRC) +PA_WINDOWS_HANDLE_TYPE(HICON) +PA_WINDOWS_HANDLE_TYPE(HINSTANCE) +PA_WINDOWS_HANDLE_TYPE(HKEY) +PA_WINDOWS_HANDLE_TYPE(HKL) +PA_WINDOWS_HANDLE_TYPE(HMENU) +PA_WINDOWS_HANDLE_TYPE(HWINSTA) +PA_WINDOWS_HANDLE_TYPE(HWND) +PA_WINDOWS_HANDLE_TYPE(HMONITOR) diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_config.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_config.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_config.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_config.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,333 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_CONFIG_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_CONFIG_H_ + +#include "base/allocator/partition_allocator/partition_alloc_base/debug/debugging_buildflags.h" +#include "base/allocator/partition_allocator/partition_alloc_buildflags.h" +#include "build/build_config.h" + +// PA_CONFIG() uses a similar trick as BUILDFLAG() to allow the compiler catch +// typos or a missing #include. +// +// ----------------------------------------------------------------------------- +// Housekeeping Rules +// ----------------------------------------------------------------------------- +// 1. Prefix all config macros in this file with PA_CONFIG_ and define them in +// a function-like manner, e.g. PA_CONFIG_MY_SETTING(). +// 2. Both positive and negative cases must be defined. +// 3. Don't use PA_CONFIG_MY_SETTING() directly outside of this file, use +// PA_CONFIG(flag-without-PA_CONFIG_) instead, e.g. PA_CONFIG(MY_SETTING). +// 4. Do not use PA_CONFIG() when defining config macros, or it will lead to +// recursion. Either use #if/#else, or PA_CONFIG_MY_SETTING() directly. +// 5. Try to use constexpr instead of macros wherever possible. +// TODO(bartekn): Convert macros to constexpr or BUILDFLAG as much as possible. +#define PA_CONFIG(flag) (PA_CONFIG_##flag()) + +// Assert that the heuristic in partition_alloc.gni is accurate on supported +// configurations. +#if BUILDFLAG(HAS_64_BIT_POINTERS) +static_assert(sizeof(void*) == 8, ""); +#else +static_assert(sizeof(void*) != 8, ""); +#endif // PA_CONFIG(HAS_64_BITS_POINTERS) + +#if BUILDFLAG(HAS_64_BIT_POINTERS) && \ + (defined(__ARM_NEON) || defined(__ARM_NEON__)) && defined(__ARM_FP) +#define PA_CONFIG_STARSCAN_NEON_SUPPORTED() 1 +#else +#define PA_CONFIG_STARSCAN_NEON_SUPPORTED() 0 +#endif + +#if BUILDFLAG(HAS_64_BIT_POINTERS) && BUILDFLAG(IS_IOS) +// Allow PA to select an alternate pool size at run-time before initialization, +// rather than using a single constexpr value. +// +// This is needed on iOS because iOS test processes can't handle large pools +// (see crbug.com/1250788). +// +// This setting is specific to 64-bit, as 32-bit has a different implementation. +#define PA_CONFIG_DYNAMICALLY_SELECT_POOL_SIZE() 1 +#else +#define PA_CONFIG_DYNAMICALLY_SELECT_POOL_SIZE() 0 +#endif // BUILDFLAG(HAS_64_BIT_POINTERS) && BUILDFLAG(IS_IOS) + +#if BUILDFLAG(HAS_64_BIT_POINTERS) && \ + (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID)) +#include +// TODO(bikineev): Enable for ChromeOS. +#define PA_CONFIG_STARSCAN_UFFD_WRITE_PROTECTOR_SUPPORTED() \ + (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 8, 0)) +#else +#define PA_CONFIG_STARSCAN_UFFD_WRITE_PROTECTOR_SUPPORTED() 0 +#endif // BUILDFLAG(HAS_64_BIT_POINTERS) && + // (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID)) + +#if BUILDFLAG(USE_STARSCAN) +// Use card table to avoid races for PCScan configuration without safepoints. +// The card table provides the guaranteee that for a marked card the underling +// super-page is fully initialized. +#define PA_CONFIG_STARSCAN_USE_CARD_TABLE() 1 +#else +// The card table is permanently disabled for 32-bit. +#define PA_CONFIG_STARSCAN_USE_CARD_TABLE() 0 +#endif // BUILDFLAG(USE_STARSCAN) + +// Use batched freeing when sweeping pages. This builds up a freelist in the +// scanner thread and appends to the slot-span's freelist only once. +#define PA_CONFIG_STARSCAN_BATCHED_FREE() 1 + +// TODO(bikineev): Temporarily disable inlining in *Scan to get clearer +// stacktraces. +#define PA_CONFIG_STARSCAN_NOINLINE_SCAN_FUNCTIONS() 1 + +// TODO(bikineev): Temporarily disable *Scan in MemoryReclaimer as it seems to +// cause significant jank. +#define PA_CONFIG_STARSCAN_ENABLE_STARSCAN_ON_RECLAIM() 0 + +// Double free detection comes with expensive cmpxchg (with the loop around it). +// We currently disable it to improve the runtime. +#define PA_CONFIG_STARSCAN_EAGER_DOUBLE_FREE_DETECTION_ENABLED() 0 + +// POSIX is not only UNIX, e.g. macOS and other OSes. We do use Linux-specific +// features such as futex(2). +#define PA_CONFIG_HAS_LINUX_KERNEL() \ + (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)) + +// On some platforms, we implement locking by spinning in userspace, then going +// into the kernel only if there is contention. This requires platform support, +// namely: +// - On Linux, futex(2) +// - On Windows, a fast userspace "try" operation which is available with +// SRWLock +// - On macOS, pthread_mutex_trylock() is fast by default starting with macOS +// 10.14. Chromium targets an earlier version, so it cannot be known at +// compile-time. So we use something different. +// TODO(https://crbug.com/1459032): macOS 10.15 is now required; switch to +// better locking. +// - Otherwise, on POSIX we assume that a fast userspace pthread_mutex_trylock() +// is available. +// +// Otherwise, a userspace spinlock implementation is used. +#if PA_CONFIG(HAS_LINUX_KERNEL) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || \ + BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +#define PA_CONFIG_HAS_FAST_MUTEX() 1 +#else +#define PA_CONFIG_HAS_FAST_MUTEX() 0 +#endif + +// If defined, enables zeroing memory on Free() with roughly 1% probability. +// This applies only to normal buckets, as direct-map allocations are always +// decommitted. +// TODO(bartekn): Re-enable once PartitionAlloc-Everywhere evaluation is done. +#define PA_CONFIG_ZERO_RANDOMLY_ON_FREE() 0 + +// Need TLS support. +#define PA_CONFIG_THREAD_CACHE_SUPPORTED() \ + (BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA)) + +// Too expensive for official builds, as it adds cache misses to all +// allocations. On the other hand, we want wide metrics coverage to get +// realistic profiles. +#define PA_CONFIG_THREAD_CACHE_ALLOC_STATS() \ + (BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && !defined(OFFICIAL_BUILD)) + +// Optional statistics collection. Lightweight, contrary to the ones above, +// hence enabled by default. +#define PA_CONFIG_THREAD_CACHE_ENABLE_STATISTICS() 1 + +// Enable free list shadow entry to strengthen hardening as much as possible. +// The shadow entry is an inversion (bitwise-NOT) of the encoded `next` pointer. +// +// Disabled when ref-count is placed in the previous slot, as it will overlap +// with the shadow for the smallest slots. +// +// Disabled on Big Endian CPUs, because encoding is also a bitwise-NOT there, +// making the shadow entry equal to the original, valid pointer to the next +// slot. In case Use-after-Free happens, we'd rather not hand out a valid, +// ready-to-use pointer. +#define PA_CONFIG_HAS_FREELIST_SHADOW_ENTRY() \ + (!BUILDFLAG(PUT_REF_COUNT_IN_PREVIOUS_SLOT) && \ + defined(ARCH_CPU_LITTLE_ENDIAN)) + +#define PA_CONFIG_HAS_MEMORY_TAGGING() \ + (defined(ARCH_CPU_ARM64) && defined(__clang__) && \ + (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID))) + +#if PA_CONFIG(HAS_MEMORY_TAGGING) +static_assert(sizeof(void*) == 8); +#endif + +// If memory tagging is enabled with BRP previous slot, the MTE tag and BRP ref +// count will cause a race (crbug.com/1445816). To prevent this, the +// ref_count_size is increased to the MTE granule size and the ref count is not +// tagged. +#if PA_CONFIG(HAS_MEMORY_TAGGING) && \ + BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) && \ + BUILDFLAG(PUT_REF_COUNT_IN_PREVIOUS_SLOT) +#define PA_CONFIG_INCREASE_REF_COUNT_SIZE_FOR_MTE() 1 +#else +#define PA_CONFIG_INCREASE_REF_COUNT_SIZE_FOR_MTE() 0 +#endif + +// Specifies whether allocation extras need to be added. +#if BUILDFLAG(PA_DCHECK_IS_ON) || BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) +#define PA_CONFIG_EXTRAS_REQUIRED() 1 +#else +#define PA_CONFIG_EXTRAS_REQUIRED() 0 +#endif + +// Count and total wall clock time spent in memory related system calls. This +// doesn't cover all system calls, in particular the ones related to locking. +// +// Not enabled by default, as it has a runtime cost, and causes issues with some +// builds (e.g. Windows). +// However the total count is collected on all platforms. +#define PA_CONFIG_COUNT_SYSCALL_TIME() 0 + +// On Windows, |thread_local| variables cannot be marked "dllexport", see +// compiler error C2492 at +// https://docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-1/compiler-error-c2492?view=msvc-160. +// Don't use it there. +// +// On macOS and iOS: +// - With PartitionAlloc-Everywhere, thread_local allocates, reentering the +// allocator. +// - Component builds triggered a clang bug: crbug.com/1243375 +// +// Regardless, the "normal" TLS access is fast on x86_64 (see partition_tls.h), +// so don't bother with thread_local anywhere. +#define PA_CONFIG_THREAD_LOCAL_TLS() \ + (!(BUILDFLAG(IS_WIN) && defined(COMPONENT_BUILD)) && !BUILDFLAG(IS_APPLE)) + +// When PartitionAlloc is malloc(), detect malloc() becoming re-entrant by +// calling malloc() again. +// +// Limitations: +// - BUILDFLAG(PA_DCHECK_IS_ON) due to runtime cost +// - thread_local TLS to simplify the implementation +// - Not on Android due to bot failures +#if BUILDFLAG(PA_DCHECK_IS_ON) && BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && \ + PA_CONFIG(THREAD_LOCAL_TLS) && !BUILDFLAG(IS_ANDROID) +#define PA_CONFIG_HAS_ALLOCATION_GUARD() 1 +#else +#define PA_CONFIG_HAS_ALLOCATION_GUARD() 0 +#endif + +// On Android, we have to go through emutls, since this is always a shared +// library, so don't bother. +#if PA_CONFIG(THREAD_LOCAL_TLS) && !BUILDFLAG(IS_ANDROID) +#define PA_CONFIG_THREAD_CACHE_FAST_TLS() 1 +#else +#define PA_CONFIG_THREAD_CACHE_FAST_TLS() 0 +#endif + +// Lazy commit should only be enabled on Windows, because commit charge is +// only meaningful and limited on Windows. It affects performance on other +// platforms and is simply not needed there due to OS supporting overcommit. +#if BUILDFLAG(IS_WIN) +constexpr bool kUseLazyCommit = true; +#else +constexpr bool kUseLazyCommit = false; +#endif + +// On these platforms, lock all the partitions before fork(), and unlock after. +// This may be required on more platforms in the future. +#define PA_CONFIG_HAS_ATFORK_HANDLER() \ + (BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) + +// PartitionAlloc uses PartitionRootEnumerator to acquire all +// PartitionRoots at BeforeFork and to release at AfterFork. +#if BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && PA_CONFIG(HAS_ATFORK_HANDLER) +#define PA_CONFIG_USE_PARTITION_ROOT_ENUMERATOR() 1 +#else +#define PA_CONFIG_USE_PARTITION_ROOT_ENUMERATOR() 0 +#endif + +// Due to potential conflict with the free list pointer in the "previous slot" +// mode in the smallest bucket, we can't check both the cookie and the dangling +// raw_ptr at the same time. +#define PA_CONFIG_REF_COUNT_CHECK_COOKIE() \ + (!(BUILDFLAG(ENABLE_DANGLING_RAW_PTR_CHECKS) && \ + BUILDFLAG(PUT_REF_COUNT_IN_PREVIOUS_SLOT)) && \ + (BUILDFLAG(PA_DCHECK_IS_ON) || \ + BUILDFLAG(ENABLE_BACKUP_REF_PTR_SLOW_CHECKS))) + +// Use available space in the reference count to store the initially requested +// size from the application. This is used for debugging. +#if !PA_CONFIG(REF_COUNT_CHECK_COOKIE) && \ + !BUILDFLAG(ENABLE_DANGLING_RAW_PTR_CHECKS) +// Set to 1 when needed. +#define PA_CONFIG_REF_COUNT_STORE_REQUESTED_SIZE() 0 +#else +// You probably want it at 0, outside of local testing, or else +// PartitionRefCount will grow past 8B. +#define PA_CONFIG_REF_COUNT_STORE_REQUESTED_SIZE() 0 +#endif + +#if PA_CONFIG(REF_COUNT_STORE_REQUESTED_SIZE) && \ + PA_CONFIG(REF_COUNT_CHECK_COOKIE) +#error "Cannot use a cookie *and* store the allocation size" +#endif + +// Prefer smaller slot spans. +// +// Smaller slot spans may improve dirty memory fragmentation, but may also +// increase address space usage. +// +// This is intended to roll out more broadly, but only enabled on Linux for now +// to get performance bot and real-world data pre-A/B experiment. +// +// Also enabled on ARM64 macOS, as the 16kiB pages on this platform lead to +// larger slot spans. +#define PA_CONFIG_PREFER_SMALLER_SLOT_SPANS() \ + (BUILDFLAG(IS_LINUX) || (BUILDFLAG(IS_MAC) && defined(ARCH_CPU_ARM64))) + +// Enable shadow metadata. +// +// With this flag, shadow pools will be mapped, on which writable shadow +// metadatas are placed, and the real metadatas are set to read-only instead. +// This feature is only enabled with 64-bit environment because pools work +// differently with 32-bits pointers (see glossary). +#if BUILDFLAG(ENABLE_SHADOW_METADATA_FOR_64_BITS_POINTERS) && \ + BUILDFLAG(HAS_64_BIT_POINTERS) +#define PA_CONFIG_ENABLE_SHADOW_METADATA() 1 +#else +#define PA_CONFIG_ENABLE_SHADOW_METADATA() 0 +#endif + +// According to crbug.com/1349955#c24, macOS 11 has a bug where they asset that +// malloc_size() of an allocation is equal to the requested size. This is +// generally not true. The assert passed only because it happened to be true for +// the sizes they requested. BRP changes that, hence can't be deployed without a +// workaround. +// +// The bug has been fixed in macOS 12. Here we can only check the platform, and +// the version is checked dynamically later. +#define PA_CONFIG_ENABLE_MAC11_MALLOC_SIZE_HACK() \ + (BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) && BUILDFLAG(IS_MAC)) + +#if BUILDFLAG(ENABLE_POINTER_COMPRESSION) + +#if PA_CONFIG(DYNAMICALLY_SELECT_POOL_SIZE) +#error "Dynamically selected pool size is currently not supported" +#endif +#if PA_CONFIG(HAS_MEMORY_TAGGING) +// TODO(1376980): Address MTE once it's enabled. +#error "Compressed pointers don't support tag in the upper bits" +#endif + +#endif // BUILDFLAG(ENABLE_POINTER_COMPRESSION) + +// PA_CONFIG(IS_NONCLANG_MSVC): mimics the compound condition used by +// Chromium's `//base/compiler_specific.h` to detect true (non-Clang) +// MSVC. +#if defined(COMPILER_MSVC) && !defined(__clang__) +#define PA_CONFIG_IS_NONCLANG_MSVC() 1 +#else +#define PA_CONFIG_IS_NONCLANG_MSVC() 0 +#endif + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_CONFIG_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_forward.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_forward.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_forward.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/partition_alloc_forward.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,94 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_FORWARD_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_FORWARD_H_ + +#include +#include +#include +#include + +#include "base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h" +#include "base/allocator/partition_allocator/partition_alloc_base/component_export.h" +#include "base/allocator/partition_allocator/partition_alloc_base/debug/debugging_buildflags.h" +#include "base/allocator/partition_allocator/partition_alloc_base/thread_annotations.h" +#include "base/allocator/partition_allocator/partition_alloc_config.h" + +namespace partition_alloc { + +namespace internal { + +// Alignment has two constraints: +// - Alignment requirement for scalar types: alignof(std::max_align_t) +// - Alignment requirement for operator new(). +// +// The two are separate on Windows 64 bits, where the first one is 8 bytes, and +// the second one 16. We could technically return something different for +// malloc() and operator new(), but this would complicate things, and most of +// our allocations are presumably coming from operator new() anyway. +#if !defined(MOZ_ZUCCHINI) +constexpr size_t kAlignment = + std::max(alignof(max_align_t), + static_cast(__STDCPP_DEFAULT_NEW_ALIGNMENT__)); +static_assert(kAlignment <= 16, + "PartitionAlloc doesn't support a fundamental alignment larger " + "than 16 bytes."); +#endif // !defined(MOZ_ZUCCHINI) + +struct SlotSpanMetadata; +class PA_LOCKABLE Lock; + +// This type trait verifies a type can be used as a pointer offset. +// +// We support pointer offsets in signed (ptrdiff_t) or unsigned (size_t) values. +// Smaller types are also allowed. +template +static constexpr bool is_offset_type = + std::is_integral_v && sizeof(Z) <= sizeof(ptrdiff_t); + +} // namespace internal + +class PartitionStatsDumper; + +struct PartitionRoot; + +namespace internal { +// Declare PartitionRootLock() for thread analysis. Its implementation +// is defined in partition_root.h. +Lock& PartitionRootLock(PartitionRoot*); +} // namespace internal + +} // namespace partition_alloc + +// From https://clang.llvm.org/docs/AttributeReference.html#malloc: +// +// The malloc attribute indicates that the function acts like a system memory +// allocation function, returning a pointer to allocated storage disjoint from +// the storage for any other object accessible to the caller. +// +// Note that it doesn't apply to realloc()-type functions, as they can return +// the same pointer as the one passed as a parameter, as noted in e.g. stdlib.h +// on Linux systems. +#if PA_HAS_ATTRIBUTE(malloc) +#define PA_MALLOC_FN __attribute__((malloc)) +#endif + +// Allows the compiler to assume that the return value is aligned on a +// kAlignment boundary. This is useful for e.g. using aligned vector +// instructions in the constructor for zeroing. +#if PA_HAS_ATTRIBUTE(assume_aligned) +#define PA_MALLOC_ALIGNED \ + __attribute__((assume_aligned(::partition_alloc::internal::kAlignment))) +#endif + +#if !defined(PA_MALLOC_FN) +#define PA_MALLOC_FN +#endif + +#if !defined(PA_MALLOC_ALIGNED) +#define PA_MALLOC_ALIGNED +#endif + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_FORWARD_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr.h 2025-12-01 18:15:49.000000000 +0000 @@ -0,0 +1,1049 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_PTR_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_PTR_H_ + +#include +#include + +#include +#include +#include +#include + +#include "base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h" +#include "base/allocator/partition_allocator/partition_alloc_base/component_export.h" +#include "base/allocator/partition_allocator/partition_alloc_base/cxx20_is_constant_evaluated.h" +#include "base/allocator/partition_allocator/partition_alloc_base/debug/debugging_buildflags.h" +#include "base/allocator/partition_allocator/partition_alloc_buildflags.h" +#include "base/allocator/partition_allocator/partition_alloc_config.h" +#include "base/allocator/partition_allocator/partition_alloc_forward.h" +#include "base/allocator/partition_allocator/pointers/raw_ptr_exclusion.h" +#include "build/build_config.h" +#include "build/buildflag.h" + +#if BUILDFLAG(IS_WIN) +#include "base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types.h" +#endif + +#if BUILDFLAG(USE_PARTITION_ALLOC) +#include "base/allocator/partition_allocator/partition_alloc_base/check.h" +// Live implementation of MiraclePtr being built. +#if BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) || \ + BUILDFLAG(USE_ASAN_BACKUP_REF_PTR) +#define PA_RAW_PTR_CHECK(condition) PA_BASE_CHECK(condition) +#else +// No-op implementation of MiraclePtr being built. +// Note that `PA_BASE_DCHECK()` evaporates from non-DCHECK builds, +// minimizing impact of generated code. +#define PA_RAW_PTR_CHECK(condition) PA_BASE_DCHECK(condition) +#endif // BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) || + // BUILDFLAG(USE_ASAN_BACKUP_REF_PTR) +#else // BUILDFLAG(USE_PARTITION_ALLOC) +// Without PartitionAlloc, there's no `PA_BASE_D?CHECK()` implementation +// available. +#define PA_RAW_PTR_CHECK(condition) +#endif // BUILDFLAG(USE_PARTITION_ALLOC) + +#if BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) +#include "base/allocator/partition_allocator/pointers/raw_ptr_backup_ref_impl.h" +#elif BUILDFLAG(USE_ASAN_UNOWNED_PTR) +#include "base/allocator/partition_allocator/pointers/raw_ptr_asan_unowned_impl.h" +#elif BUILDFLAG(USE_HOOKABLE_RAW_PTR) +#include "base/allocator/partition_allocator/pointers/raw_ptr_hookable_impl.h" +#else +#include "base/allocator/partition_allocator/pointers/raw_ptr_noop_impl.h" +#endif + +namespace cc { +class Scheduler; +} +namespace base::internal { +class DelayTimerBase; +} +namespace content::responsiveness { +class Calculator; +} + +namespace base { + +// NOTE: All methods should be `PA_ALWAYS_INLINE`. raw_ptr is meant to be a +// lightweight replacement of a raw pointer, hence performance is critical. + +// This is a bitfield representing the different flags that can be applied to a +// raw_ptr. +// +// Internal use only: Developers shouldn't use those values directly. +// +// Housekeeping rules: Try not to change trait values, so that numeric trait +// values stay constant across builds (could be useful e.g. when analyzing stack +// traces). A reasonable exception to this rule are `*ForTest` traits. As a +// matter of fact, we propose that new non-test traits are added before the +// `*ForTest` traits. +enum class RawPtrTraits : unsigned { + kEmpty = 0, + + // Disables dangling pointer detection, but keeps other raw_ptr protections. + // + // Don't use directly, use DisableDanglingPtrDetection or DanglingUntriaged + // instead. + kMayDangle = (1 << 0), + + // Disables any hooks, when building with BUILDFLAG(USE_HOOKABLE_RAW_PTR). + // + // Internal use only. + kDisableHooks = (1 << 2), + + // Pointer arithmetic is discouraged and disabled by default. + // + // Don't use directly, use AllowPtrArithmetic instead. + kAllowPtrArithmetic = (1 << 3), + + // This pointer is evaluated by a separate, Ash-related experiment. + // + // Don't use directly, use ExperimentalAsh instead. + kExperimentalAsh = (1 << 4), + + // *** ForTest traits below *** + + // Adds accounting, on top of the chosen implementation, for test purposes. + // raw_ptr/raw_ref with this trait perform extra bookkeeping, e.g. to track + // the number of times the raw_ptr is wrapped, unwrapped, etc. + // + // Test only. Include raw_ptr_counting_wrapper_impl_for_test.h in your test + // files when using this trait. + kUseCountingWrapperForTest = (1 << 10), + + // Helper trait that can be used to test raw_ptr's behaviour or conversions. + // + // Test only. + kDummyForTest = (1 << 11), +}; + +// Used to combine RawPtrTraits: +constexpr RawPtrTraits operator|(RawPtrTraits a, RawPtrTraits b) { + return static_cast(static_cast(a) | + static_cast(b)); +} +constexpr RawPtrTraits operator&(RawPtrTraits a, RawPtrTraits b) { + return static_cast(static_cast(a) & + static_cast(b)); +} +constexpr RawPtrTraits operator~(RawPtrTraits a) { + return static_cast(~static_cast(a)); +} + +namespace raw_ptr_traits { + +constexpr bool Contains(RawPtrTraits a, RawPtrTraits b) { + return (a & b) != RawPtrTraits::kEmpty; +} + +constexpr RawPtrTraits Remove(RawPtrTraits a, RawPtrTraits b) { + return a & ~b; +} + +constexpr bool AreValid(RawPtrTraits traits) { + return Remove(traits, RawPtrTraits::kMayDangle | RawPtrTraits::kDisableHooks | + RawPtrTraits::kAllowPtrArithmetic | + RawPtrTraits::kExperimentalAsh | + RawPtrTraits::kUseCountingWrapperForTest | + RawPtrTraits::kDummyForTest) == + RawPtrTraits::kEmpty; +} + +// IsSupportedType::value answers whether raw_ptr 1) compiles and 2) is +// always safe at runtime. Templates that may end up using `raw_ptr` should +// use IsSupportedType to ensure that raw_ptr is not used with unsupported +// types. As an example, see how base::internal::StorageTraits uses +// IsSupportedType as a condition for using base::internal::UnretainedWrapper +// (which has a `ptr_` field that will become `raw_ptr` after the Big +// Rewrite). +template +struct IsSupportedType { + static constexpr bool value = true; +}; + +// raw_ptr is not compatible with function pointer types. Also, they don't +// even need the raw_ptr protection, because they don't point on heap. +template +struct IsSupportedType::value>> { + static constexpr bool value = false; +}; + +// This section excludes some types from raw_ptr to avoid them from being +// used inside base::Unretained in performance sensitive places. These were +// identified from sampling profiler data. See crbug.com/1287151 for more info. +template <> +struct IsSupportedType { + static constexpr bool value = false; +}; +template <> +struct IsSupportedType { + static constexpr bool value = false; +}; +template <> +struct IsSupportedType { + static constexpr bool value = false; +}; + +#if __OBJC__ +// raw_ptr is not compatible with pointers to Objective-C classes for a +// multitude of reasons. They may fail to compile in many cases, and wouldn't +// work well with tagged pointers. Anyway, Objective-C objects have their own +// way of tracking lifespan, hence don't need the raw_ptr protection as much. +// +// Such pointers are detected by checking if they're convertible to |id| type. +template +struct IsSupportedType::value>> { + static constexpr bool value = false; +}; +#endif // __OBJC__ + +#if BUILDFLAG(IS_WIN) +// raw_ptr is unsafe at runtime - if the handle happens to also +// represent a valid pointer into a PartitionAlloc-managed region then it can +// lead to manipulating random memory when treating it as BackupRefPtr +// ref-count. See also https://crbug.com/1262017. +// +// TODO(https://crbug.com/1262017): Cover other handle types like HANDLE, +// HLOCAL, HINTERNET, or HDEVINFO. Maybe we should avoid using raw_ptr when +// T=void (as is the case in these handle types). OTOH, explicit, +// non-template-based raw_ptr should be allowed. Maybe this can be solved +// by having 2 traits: IsPointeeAlwaysSafe (to be used in templates) and +// IsPointeeUsuallySafe (to be used in the static_assert in raw_ptr). The +// upside of this approach is that it will safely handle base::Bind closing over +// HANDLE. The downside of this approach is that base::Bind closing over a +// void* pointer will not get UaF protection. +#define PA_WINDOWS_HANDLE_TYPE(name) \ + template <> \ + struct IsSupportedType { \ + static constexpr bool value = false; \ + }; +#include "base/allocator/partition_allocator/partition_alloc_base/win/win_handle_types_list.inc" +#undef PA_WINDOWS_HANDLE_TYPE +#endif + +#if BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) +template +using UnderlyingImplForTraits = internal::RawPtrBackupRefImpl< + /*AllowDangling=*/Contains(Traits, RawPtrTraits::kMayDangle), + /*ExperimentalAsh=*/Contains(Traits, RawPtrTraits::kExperimentalAsh)>; + +#elif BUILDFLAG(USE_ASAN_UNOWNED_PTR) +template +using UnderlyingImplForTraits = + internal::RawPtrAsanUnownedImpl; + +#elif BUILDFLAG(USE_HOOKABLE_RAW_PTR) +template +using UnderlyingImplForTraits = internal::RawPtrHookableImpl< + /*EnableHooks=*/!Contains(Traits, RawPtrTraits::kDisableHooks)>; + +#else +template +using UnderlyingImplForTraits = internal::RawPtrNoOpImpl; +#endif + +} // namespace raw_ptr_traits + +namespace test { + +template +struct RawPtrCountingImplWrapperForTest; + +} // namespace test + +namespace raw_ptr_traits { + +// ImplForTraits is the struct that implements raw_ptr functions. Think of +// raw_ptr as a thin wrapper, that directs calls to ImplForTraits. ImplForTraits +// may be different from UnderlyingImplForTraits, because it may include a +// wrapper. +template +using ImplForTraits = std::conditional_t< + Contains(Traits, RawPtrTraits::kUseCountingWrapperForTest), + test::RawPtrCountingImplWrapperForTest< + Remove(Traits, RawPtrTraits::kUseCountingWrapperForTest)>, + UnderlyingImplForTraits>; + +} // namespace raw_ptr_traits + +// `raw_ptr` is a non-owning smart pointer that has improved memory-safety +// over raw pointers. It behaves just like a raw pointer on platforms where +// USE_BACKUP_REF_PTR is off, and almost like one when it's on (the main +// difference is that it's zero-initialized and cleared on destruction and +// move). Unlike `std::unique_ptr`, `base::scoped_refptr`, etc., it +// doesn’t manage ownership or lifetime of an allocated object - you are still +// responsible for freeing the object when no longer used, just as you would +// with a raw C++ pointer. +// +// Compared to a raw C++ pointer, on platforms where USE_BACKUP_REF_PTR is on, +// `raw_ptr` incurs additional performance overhead for initialization, +// destruction, and assignment (including `ptr++` and `ptr += ...`). There is +// no overhead when dereferencing a pointer. +// +// `raw_ptr` is beneficial for security, because it can prevent a significant +// percentage of Use-after-Free (UaF) bugs from being exploitable. `raw_ptr` +// has limited impact on stability - dereferencing a dangling pointer remains +// Undefined Behavior. Note that the security protection is not yet enabled by +// default. +// +// raw_ptr is marked as [[gsl::Pointer]] which allows the compiler to catch +// some bugs where the raw_ptr holds a dangling pointer to a temporary object. +// However the [[gsl::Pointer]] analysis expects that such types do not have a +// non-default move constructor/assignment. Thus, it's possible to get an error +// where the pointer is not actually dangling, and have to work around the +// compiler. We have not managed to construct such an example in Chromium yet. +template +class PA_TRIVIAL_ABI PA_GSL_POINTER raw_ptr { + public: + using Impl = typename raw_ptr_traits::ImplForTraits; + // Needed to make gtest Pointee matcher work with raw_ptr. + using element_type = T; + using DanglingType = raw_ptr; + +#if !BUILDFLAG(USE_PARTITION_ALLOC) + // See comment at top about `PA_RAW_PTR_CHECK()`. + static_assert(std::is_same_v); +#endif // !BUILDFLAG(USE_PARTITION_ALLOC) + + static_assert(raw_ptr_traits::AreValid(Traits), "Unknown raw_ptr trait(s)"); + static_assert(raw_ptr_traits::IsSupportedType::value, + "raw_ptr doesn't work with this kind of pointee type T"); + + // TODO(bartekn): Turn on zeroing as much as possible, to reduce + // pointer-related UBs. In the current implementation we do it only when the + // underlying implementation needs it for correctness, for performance + // reasons. There are two secnarios where it's important: + // 1. When rewriting renderer, we don't want extra overhead get in the way of + // our perf evaluation. + // 2. The same applies to rewriting 3rd party libraries, but also we want + // RawPtrNoOpImpl to be a true no-op, in case the library is linked with + // a product other than Chromium (this can be mitigated using + // `build_with_chromium` GN variable). + static constexpr bool kZeroOnInit = Impl::kMustZeroOnInit; + static constexpr bool kZeroOnMove = Impl::kMustZeroOnMove; + static constexpr bool kZeroOnDestruct = Impl::kMustZeroOnDestruct; + +#if BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) || \ + BUILDFLAG(USE_ASAN_UNOWNED_PTR) || BUILDFLAG(USE_HOOKABLE_RAW_PTR) + // BackupRefPtr requires a non-trivial default constructor, destructor, etc. + PA_ALWAYS_INLINE constexpr raw_ptr() noexcept { + if constexpr (kZeroOnInit) { + wrapped_ptr_ = nullptr; + } + } + + PA_ALWAYS_INLINE constexpr raw_ptr(const raw_ptr& p) noexcept + : wrapped_ptr_(Impl::Duplicate(p.wrapped_ptr_)) {} + + PA_ALWAYS_INLINE constexpr raw_ptr(raw_ptr&& p) noexcept { + wrapped_ptr_ = p.wrapped_ptr_; + if constexpr (kZeroOnMove) { + p.wrapped_ptr_ = nullptr; + } + } + + PA_ALWAYS_INLINE constexpr raw_ptr& operator=(const raw_ptr& p) noexcept { + // Duplicate before releasing, in case the pointer is assigned to itself. + // + // Unlike the move version of this operator, don't add |this != &p| branch, + // for performance reasons. Even though Duplicate() is not cheap, we + // practically never assign a raw_ptr to itself. We suspect that a + // cumulative cost of a conditional branch, even if always correctly + // predicted, would exceed that. + T* new_ptr = Impl::Duplicate(p.wrapped_ptr_); + Impl::ReleaseWrappedPtr(wrapped_ptr_); + wrapped_ptr_ = new_ptr; + return *this; + } + + PA_ALWAYS_INLINE constexpr raw_ptr& operator=(raw_ptr&& p) noexcept { + // Unlike the the copy version of this operator, this branch is necessaty + // for correctness. + if (PA_LIKELY(this != &p)) { + Impl::ReleaseWrappedPtr(wrapped_ptr_); + wrapped_ptr_ = p.wrapped_ptr_; + if constexpr (kZeroOnMove) { + p.wrapped_ptr_ = nullptr; + } + } + return *this; + } + +// Constexpr destructors were introduced in C++20. PartitionAlloc's minimum +// supported C++ version is C++17. +#if defined(__cpp_constexpr) && __cpp_constexpr >= 201907L + PA_ALWAYS_INLINE constexpr ~raw_ptr() noexcept { +#else + PA_ALWAYS_INLINE ~raw_ptr() noexcept { +#endif + Impl::ReleaseWrappedPtr(wrapped_ptr_); + // Work around external issues where raw_ptr is used after destruction. + if constexpr (kZeroOnDestruct) { + wrapped_ptr_ = nullptr; + } + } + +#else // BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) || + // BUILDFLAG(USE_ASAN_UNOWNED_PTR) || BUILDFLAG(USE_HOOKABLE_RAW_PTR) + + // raw_ptr can be trivially default constructed (leaving |wrapped_ptr_| + // uninitialized). + PA_ALWAYS_INLINE constexpr raw_ptr() noexcept = default; + + // In addition to nullptr_t ctor above, raw_ptr needs to have these + // as |=default| or |constexpr| to avoid hitting -Wglobal-constructors in + // cases like this: + // struct SomeStruct { int int_field; raw_ptr ptr_field; }; + // SomeStruct g_global_var = { 123, nullptr }; + PA_ALWAYS_INLINE raw_ptr(const raw_ptr&) noexcept = default; + PA_ALWAYS_INLINE raw_ptr(raw_ptr&&) noexcept = default; + PA_ALWAYS_INLINE raw_ptr& operator=(const raw_ptr&) noexcept = default; + PA_ALWAYS_INLINE raw_ptr& operator=(raw_ptr&&) noexcept = default; + + PA_ALWAYS_INLINE ~raw_ptr() noexcept = default; + + // With default constructor, destructor and move operations, we don't have an + // opportunity to zero the underlying pointer, so ensure this isn't expected. + static_assert(!kZeroOnInit); + static_assert(!kZeroOnMove); + static_assert(!kZeroOnDestruct); +#endif // BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) || + // BUILDFLAG(USE_ASAN_UNOWNED_PTR) || BUILDFLAG(USE_HOOKABLE_RAW_PTR) + + // Cross-kind copy constructor. + // Move is not supported as different traits may use different ref-counts, so + // let move operations degrade to copy, which handles it well. + template > + PA_ALWAYS_INLINE constexpr explicit raw_ptr( + const raw_ptr& p) noexcept + : wrapped_ptr_(Impl::WrapRawPtrForDuplication( + raw_ptr_traits::ImplForTraits:: + UnsafelyUnwrapPtrForDuplication(p.wrapped_ptr_))) { + // Limit cross-kind conversions only to cases where kMayDangle gets added, + // because that's needed for Unretained(Ref)Wrapper. Use a static_assert, + // instead of disabling via SFINAE, so that the compiler catches other + // conversions. Otherwise implicit raw_ptr -> T* -> raw_ptr<> route will + // be taken. + static_assert(Traits == (PassedTraits | RawPtrTraits::kMayDangle)); + } + + // Cross-kind assignment. + // Move is not supported as different traits may use different ref-counts, so + // let move operations degrade to copy, which handles it well. + template > + PA_ALWAYS_INLINE constexpr raw_ptr& operator=( + const raw_ptr& p) noexcept { + // Limit cross-kind assignments only to cases where kMayDangle gets added, + // because that's needed for Unretained(Ref)Wrapper. Use a static_assert, + // instead of disabling via SFINAE, so that the compiler catches other + // conversions. Otherwise implicit raw_ptr -> T* -> raw_ptr<> route will + // be taken. + static_assert(Traits == (PassedTraits | RawPtrTraits::kMayDangle)); + + Impl::ReleaseWrappedPtr(wrapped_ptr_); + wrapped_ptr_ = Impl::WrapRawPtrForDuplication( + raw_ptr_traits::ImplForTraits< + PassedTraits>::UnsafelyUnwrapPtrForDuplication(p.wrapped_ptr_)); + return *this; + } + + // Deliberately implicit, because raw_ptr is supposed to resemble raw ptr. + // Ignore kZeroOnInit, because here the caller explicitly wishes to initialize + // with nullptr. NOLINTNEXTLINE(google-explicit-constructor) + PA_ALWAYS_INLINE constexpr raw_ptr(std::nullptr_t) noexcept + : wrapped_ptr_(nullptr) {} + + // Deliberately implicit, because raw_ptr is supposed to resemble raw ptr. + // NOLINTNEXTLINE(google-explicit-constructor) + PA_ALWAYS_INLINE constexpr raw_ptr(T* p) noexcept + : wrapped_ptr_(Impl::WrapRawPtr(p)) {} + + // Deliberately implicit in order to support implicit upcast. + template ::value && + !std::is_void::type>::value>> + // NOLINTNEXTLINE(google-explicit-constructor) + PA_ALWAYS_INLINE constexpr raw_ptr(const raw_ptr& ptr) noexcept + : wrapped_ptr_( + Impl::Duplicate(Impl::template Upcast(ptr.wrapped_ptr_))) {} + // Deliberately implicit in order to support implicit upcast. + template ::value && + !std::is_void::type>::value>> + // NOLINTNEXTLINE(google-explicit-constructor) + PA_ALWAYS_INLINE constexpr raw_ptr(raw_ptr&& ptr) noexcept + : wrapped_ptr_(Impl::template Upcast(ptr.wrapped_ptr_)) { + if constexpr (kZeroOnMove) { + ptr.wrapped_ptr_ = nullptr; + } + } + + PA_ALWAYS_INLINE constexpr raw_ptr& operator=(std::nullptr_t) noexcept { + Impl::ReleaseWrappedPtr(wrapped_ptr_); + wrapped_ptr_ = nullptr; + return *this; + } + PA_ALWAYS_INLINE constexpr raw_ptr& operator=(T* p) noexcept { + Impl::ReleaseWrappedPtr(wrapped_ptr_); + wrapped_ptr_ = Impl::WrapRawPtr(p); + return *this; + } + + // Upcast assignment + template ::value && + !std::is_void::type>::value>> + PA_ALWAYS_INLINE constexpr raw_ptr& operator=( + const raw_ptr& ptr) noexcept { + // Make sure that pointer isn't assigned to itself (look at raw_ptr address, + // not its contained pointer value). The comparison is only needed when they + // are the same type, otherwise they can't be the same raw_ptr object. +#if BUILDFLAG(PA_DCHECK_IS_ON) || BUILDFLAG(ENABLE_BACKUP_REF_PTR_SLOW_CHECKS) + if constexpr (std::is_same_v>) { + PA_RAW_PTR_CHECK(this != &ptr); + } +#endif + Impl::ReleaseWrappedPtr(wrapped_ptr_); + wrapped_ptr_ = + Impl::Duplicate(Impl::template Upcast(ptr.wrapped_ptr_)); + return *this; + } + template ::value && + !std::is_void::type>::value>> + PA_ALWAYS_INLINE constexpr raw_ptr& operator=( + raw_ptr&& ptr) noexcept { + // Make sure that pointer isn't assigned to itself (look at raw_ptr address, + // not its contained pointer value). The comparison is only needed when they + // are the same type, otherwise they can't be the same raw_ptr object. +#if BUILDFLAG(PA_DCHECK_IS_ON) || BUILDFLAG(ENABLE_BACKUP_REF_PTR_SLOW_CHECKS) + if constexpr (std::is_same_v>) { + PA_RAW_PTR_CHECK(this != &ptr); + } +#endif + Impl::ReleaseWrappedPtr(wrapped_ptr_); + wrapped_ptr_ = Impl::template Upcast(ptr.wrapped_ptr_); + if constexpr (kZeroOnMove) { + ptr.wrapped_ptr_ = nullptr; + } + return *this; + } + + // Avoid using. The goal of raw_ptr is to be as close to raw pointer as + // possible, so use it only if absolutely necessary (e.g. for const_cast). + PA_ALWAYS_INLINE constexpr T* get() const { return GetForExtraction(); } + + PA_ALWAYS_INLINE constexpr explicit operator bool() const { + return !!wrapped_ptr_; + } + + template ::type>::value>> + PA_ALWAYS_INLINE constexpr U& operator*() const { + return *GetForDereference(); + } + PA_ALWAYS_INLINE constexpr T* operator->() const { + return GetForDereference(); + } + + // Disables `(my_raw_ptr->*pmf)(...)` as a workaround for + // the ICE in GCC parsing the code, reported at + // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=103455 + template + void operator->*(PMF) const = delete; + + // Deliberately implicit, because raw_ptr is supposed to resemble raw ptr. + // NOLINTNEXTLINE(google-explicit-constructor) + PA_ALWAYS_INLINE constexpr operator T*() const { return GetForExtraction(); } + template + PA_ALWAYS_INLINE constexpr explicit operator U*() const { + // This operator may be invoked from static_cast, meaning the types may not + // be implicitly convertible, hence the need for static_cast here. + return static_cast(GetForExtraction()); + } + + PA_ALWAYS_INLINE constexpr raw_ptr& operator++() { + wrapped_ptr_ = Impl::Advance(wrapped_ptr_, 1); + return *this; + } + PA_ALWAYS_INLINE constexpr raw_ptr& operator--() { + wrapped_ptr_ = Impl::Retreat(wrapped_ptr_, 1); + return *this; + } + PA_ALWAYS_INLINE constexpr raw_ptr operator++(int /* post_increment */) { + raw_ptr result = *this; + ++(*this); + return result; + } + PA_ALWAYS_INLINE constexpr raw_ptr operator--(int /* post_decrement */) { + raw_ptr result = *this; + --(*this); + return result; + } + template < + typename Z, + typename = std::enable_if_t>> + PA_ALWAYS_INLINE constexpr raw_ptr& operator+=(Z delta_elems) { + wrapped_ptr_ = Impl::Advance(wrapped_ptr_, delta_elems); + return *this; + } + template < + typename Z, + typename = std::enable_if_t>> + PA_ALWAYS_INLINE constexpr raw_ptr& operator-=(Z delta_elems) { + wrapped_ptr_ = Impl::Retreat(wrapped_ptr_, delta_elems); + return *this; + } + + // Do not disable operator+() and operator-(). + // They provide OOB checks, which prevent from assigning an arbitrary value to + // raw_ptr, leading BRP to modifying arbitrary memory thinking it's ref-count. + // Keep them enabled, which may be blocked later when attempting to apply the + // += or -= operation, when disabled. In the absence of operators +/-, the + // compiler is free to implicitly convert to the underlying T* representation + // and perform ordinary pointer arithmetic, thus invalidating the purpose + // behind disabling them. + template + PA_ALWAYS_INLINE friend constexpr raw_ptr operator+(const raw_ptr& p, + Z delta_elems) { + raw_ptr result = p; + return result += delta_elems; + } + template + PA_ALWAYS_INLINE friend constexpr raw_ptr operator-(const raw_ptr& p, + Z delta_elems) { + raw_ptr result = p; + return result -= delta_elems; + } + + PA_ALWAYS_INLINE friend constexpr ptrdiff_t operator-(const raw_ptr& p1, + const raw_ptr& p2) { + return Impl::GetDeltaElems(p1.wrapped_ptr_, p2.wrapped_ptr_); + } + PA_ALWAYS_INLINE friend constexpr ptrdiff_t operator-(T* p1, + const raw_ptr& p2) { + return Impl::GetDeltaElems(p1, p2.wrapped_ptr_); + } + PA_ALWAYS_INLINE friend constexpr ptrdiff_t operator-(const raw_ptr& p1, + T* p2) { + return Impl::GetDeltaElems(p1.wrapped_ptr_, p2); + } + + // Stop referencing the underlying pointer and free its memory. Compared to + // raw delete calls, this avoids the raw_ptr to be temporarily dangling + // during the free operation, which will lead to taking the slower path that + // involves quarantine. + PA_ALWAYS_INLINE constexpr void ClearAndDelete() noexcept { + delete GetForExtractionAndReset(); + } + PA_ALWAYS_INLINE constexpr void ClearAndDeleteArray() noexcept { + delete[] GetForExtractionAndReset(); + } + + // Clear the underlying pointer and return another raw_ptr instance + // that is allowed to dangle. + // This can be useful in cases such as: + // ``` + // ptr.ExtractAsDangling()->SelfDestroy(); + // ``` + // ``` + // c_style_api_do_something_and_destroy(ptr.ExtractAsDangling()); + // ``` + // NOTE, avoid using this method as it indicates an error-prone memory + // ownership pattern. If possible, use smart pointers like std::unique_ptr<> + // instead of raw_ptr<>. + // If you have to use it, avoid saving the return value in a long-lived + // variable (or worse, a field)! It's meant to be used as a temporary, to be + // passed into a cleanup & freeing function, and destructed at the end of the + // statement. + PA_ALWAYS_INLINE constexpr DanglingType ExtractAsDangling() noexcept { + DanglingType res(std::move(*this)); + // Not all implementation clear the source pointer on move. Furthermore, + // even for implemtantions that do, cross-kind conversions (that add + // kMayDangle) fall back to a copy, instead of move. So do it here just in + // case. Should be cheap. + operator=(nullptr); + return res; + } + + // Comparison operators between raw_ptr and raw_ptr/U*/std::nullptr_t. + // Strictly speaking, it is not necessary to provide these: the compiler can + // use the conversion operator implicitly to allow comparisons to fall back to + // comparisons between raw pointers. However, `operator T*`/`operator U*` may + // perform safety checks with a higher runtime cost, so to avoid this, provide + // explicit comparison operators for all combinations of parameters. + + // Comparisons between `raw_ptr`s. This unusual declaration and separate + // definition below is because `GetForComparison()` is a private method. The + // more conventional approach of defining a comparison operator between + // `raw_ptr` and `raw_ptr` in the friend declaration itself does not work, + // because a comparison operator defined inline would not be allowed to call + // `raw_ptr`'s private `GetForComparison()` method. + template + friend bool operator==(const raw_ptr& lhs, const raw_ptr& rhs); + template + friend bool operator!=(const raw_ptr& lhs, const raw_ptr& rhs); + template + friend bool operator<(const raw_ptr& lhs, const raw_ptr& rhs); + template + friend bool operator>(const raw_ptr& lhs, const raw_ptr& rhs); + template + friend bool operator<=(const raw_ptr& lhs, const raw_ptr& rhs); + template + friend bool operator>=(const raw_ptr& lhs, const raw_ptr& rhs); + + // Comparisons with U*. These operators also handle the case where the RHS is + // T*. + template + PA_ALWAYS_INLINE friend bool operator==(const raw_ptr& lhs, U* rhs) { + return lhs.GetForComparison() == rhs; + } + template + PA_ALWAYS_INLINE friend bool operator!=(const raw_ptr& lhs, U* rhs) { + return !(lhs == rhs); + } + template + PA_ALWAYS_INLINE friend bool operator==(U* lhs, const raw_ptr& rhs) { + return rhs == lhs; // Reverse order to call the operator above. + } + template + PA_ALWAYS_INLINE friend bool operator!=(U* lhs, const raw_ptr& rhs) { + return rhs != lhs; // Reverse order to call the operator above. + } + template + PA_ALWAYS_INLINE friend bool operator<(const raw_ptr& lhs, U* rhs) { + return lhs.GetForComparison() < rhs; + } + template + PA_ALWAYS_INLINE friend bool operator<=(const raw_ptr& lhs, U* rhs) { + return lhs.GetForComparison() <= rhs; + } + template + PA_ALWAYS_INLINE friend bool operator>(const raw_ptr& lhs, U* rhs) { + return lhs.GetForComparison() > rhs; + } + template + PA_ALWAYS_INLINE friend bool operator>=(const raw_ptr& lhs, U* rhs) { + return lhs.GetForComparison() >= rhs; + } + template + PA_ALWAYS_INLINE friend bool operator<(U* lhs, const raw_ptr& rhs) { + return lhs < rhs.GetForComparison(); + } + template + PA_ALWAYS_INLINE friend bool operator<=(U* lhs, const raw_ptr& rhs) { + return lhs <= rhs.GetForComparison(); + } + template + PA_ALWAYS_INLINE friend bool operator>(U* lhs, const raw_ptr& rhs) { + return lhs > rhs.GetForComparison(); + } + template + PA_ALWAYS_INLINE friend bool operator>=(U* lhs, const raw_ptr& rhs) { + return lhs >= rhs.GetForComparison(); + } + + // Comparisons with `std::nullptr_t`. + PA_ALWAYS_INLINE friend bool operator==(const raw_ptr& lhs, std::nullptr_t) { + return !lhs; + } + PA_ALWAYS_INLINE friend bool operator!=(const raw_ptr& lhs, std::nullptr_t) { + return !!lhs; // Use !! otherwise the costly implicit cast will be used. + } + PA_ALWAYS_INLINE friend bool operator==(std::nullptr_t, const raw_ptr& rhs) { + return !rhs; + } + PA_ALWAYS_INLINE friend bool operator!=(std::nullptr_t, const raw_ptr& rhs) { + return !!rhs; // Use !! otherwise the costly implicit cast will be used. + } + + PA_ALWAYS_INLINE friend constexpr void swap(raw_ptr& lhs, + raw_ptr& rhs) noexcept { + Impl::IncrementSwapCountForTest(); + std::swap(lhs.wrapped_ptr_, rhs.wrapped_ptr_); + } + + PA_ALWAYS_INLINE void ReportIfDangling() const noexcept { +#if BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) + Impl::ReportIfDangling(wrapped_ptr_); +#endif + } + + private: + // This getter is meant for situations where the pointer is meant to be + // dereferenced. It is allowed to crash on nullptr (it may or may not), + // because it knows that the caller will crash on nullptr. + PA_ALWAYS_INLINE constexpr T* GetForDereference() const { + return Impl::SafelyUnwrapPtrForDereference(wrapped_ptr_); + } + // This getter is meant for situations where the raw pointer is meant to be + // extracted outside of this class, but not necessarily with an intention to + // dereference. It mustn't crash on nullptr. + PA_ALWAYS_INLINE constexpr T* GetForExtraction() const { + return Impl::SafelyUnwrapPtrForExtraction(wrapped_ptr_); + } + // This getter is meant *only* for situations where the pointer is meant to be + // compared (guaranteeing no dereference or extraction outside of this class). + // Any verifications can and should be skipped for performance reasons. + PA_ALWAYS_INLINE constexpr T* GetForComparison() const { + return Impl::UnsafelyUnwrapPtrForComparison(wrapped_ptr_); + } + + PA_ALWAYS_INLINE constexpr T* GetForExtractionAndReset() { + T* ptr = GetForExtraction(); + operator=(nullptr); + return ptr; + } + + // This field is not a raw_ptr<> because it was filtered by the rewriter for: + // #union, #global-scope, #constexpr-ctor-field-initializer + RAW_PTR_EXCLUSION T* wrapped_ptr_; + + template + friend class raw_ptr; +}; + +template +PA_ALWAYS_INLINE bool operator==(const raw_ptr& lhs, + const raw_ptr& rhs) { + return lhs.GetForComparison() == rhs.GetForComparison(); +} + +template +PA_ALWAYS_INLINE bool operator!=(const raw_ptr& lhs, + const raw_ptr& rhs) { + return !(lhs == rhs); +} + +template +PA_ALWAYS_INLINE bool operator<(const raw_ptr& lhs, + const raw_ptr& rhs) { + return lhs.GetForComparison() < rhs.GetForComparison(); +} + +template +PA_ALWAYS_INLINE bool operator>(const raw_ptr& lhs, + const raw_ptr& rhs) { + return lhs.GetForComparison() > rhs.GetForComparison(); +} + +template +PA_ALWAYS_INLINE bool operator<=(const raw_ptr& lhs, + const raw_ptr& rhs) { + return lhs.GetForComparison() <= rhs.GetForComparison(); +} + +template +PA_ALWAYS_INLINE bool operator>=(const raw_ptr& lhs, + const raw_ptr& rhs) { + return lhs.GetForComparison() >= rhs.GetForComparison(); +} + +template +struct IsRawPtr : std::false_type {}; + +template +struct IsRawPtr> : std::true_type {}; + +template +inline constexpr bool IsRawPtrV = IsRawPtr::value; + +template +inline constexpr bool IsRawPtrMayDangleV = false; + +template +inline constexpr bool IsRawPtrMayDangleV> = + raw_ptr_traits::Contains(Traits, RawPtrTraits::kMayDangle); + +// Template helpers for working with T* or raw_ptr. +template +struct IsPointer : std::false_type {}; + +template +struct IsPointer : std::true_type {}; + +template +struct IsPointer> : std::true_type {}; + +template +inline constexpr bool IsPointerV = IsPointer::value; + +template +struct RemovePointer { + using type = T; +}; + +template +struct RemovePointer { + using type = T; +}; + +template +struct RemovePointer> { + using type = T; +}; + +template +using RemovePointerT = typename RemovePointer::type; + +struct RawPtrGlobalSettings { + static void EnableExperimentalAsh() { +#if BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) + internal::BackupRefPtrGlobalSettings::EnableExperimentalAsh(); +#endif + } + + static void DisableExperimentalAshForTest() { +#if BUILDFLAG(ENABLE_BACKUP_REF_PTR_SUPPORT) + internal::BackupRefPtrGlobalSettings::DisableExperimentalAshForTest(); +#endif + } +}; + +} // namespace base + +using base::raw_ptr; + +// DisableDanglingPtrDetection option for raw_ptr annotates +// "intentional-and-safe" dangling pointers. It is meant to be used at the +// margin, only if there is no better way to re-architecture the code. +// +// Usage: +// raw_ptr dangling_ptr; +// +// When using it, please provide a justification about what guarantees that it +// will never be dereferenced after becoming dangling. +constexpr auto DisableDanglingPtrDetection = base::RawPtrTraits::kMayDangle; + +// See `docs/dangling_ptr.md` +// Annotates known dangling raw_ptr. Those haven't been triaged yet. All the +// occurrences are meant to be removed. See https://crbug.com/1291138. +constexpr auto DanglingUntriaged = base::RawPtrTraits::kMayDangle; + +// Unlike DanglingUntriaged, this annotates raw_ptrs that are known to +// dangle only occasionally on the CQ. +// +// These were found from CQ runs and analysed in this dashboard: +// https://docs.google.com/spreadsheets/d/1k12PQOG4y1-UEV9xDfP1F8FSk4cVFywafEYHmzFubJ8/ +// +// This is not meant to be added manually. You can ignore this flag. +constexpr auto FlakyDanglingUntriaged = base::RawPtrTraits::kMayDangle; + +// Dangling raw_ptr that is more likely to cause UAF: its memory was freed in +// one task, and the raw_ptr was released in a different one. +// +// This is not meant to be added manually. You can ignore this flag. +constexpr auto AcrossTasksDanglingUntriaged = base::RawPtrTraits::kMayDangle; + +// The use of pointer arithmetic with raw_ptr is strongly discouraged and +// disabled by default. Usually a container like span<> should be used +// instead of the raw_ptr. +constexpr auto AllowPtrArithmetic = base::RawPtrTraits::kAllowPtrArithmetic; + +// Temporary flag for `raw_ptr` / `raw_ref`. This is used by finch experiments +// to differentiate pointers added recently for the ChromeOS ash rewrite. +// +// See launch plan: +// https://docs.google.com/document/d/105OVhNl-2lrfWElQSk5BXYv-nLynfxUrbC4l8cZ0CoU/edit +// +// This is not meant to be added manually. You can ignore this flag. +constexpr auto ExperimentalAsh = base::RawPtrTraits::kExperimentalAsh; + +// This flag is used to tag a subset of dangling pointers. Similarly to +// DanglingUntriaged, those pointers are known to be dangling. However, we also +// detected that those raw_ptr's were never released (either by calling +// raw_ptr's destructor or by resetting its value), which can ultimately put +// pressure on the BRP quarantine. +// +// This is not meant to be added manually. You can ignore this flag. +constexpr auto LeakedDanglingUntriaged = base::RawPtrTraits::kMayDangle; + +// Public verson used in callbacks arguments when it is known that they might +// receive dangling pointers. In any other cases, please +// use one of: +// - raw_ptr +// - raw_ptr +template +using MayBeDangling = base::raw_ptr; + +namespace std { + +// Override so set/map lookups do not create extra raw_ptr. This also allows +// dangling pointers to be used for lookup. +template +struct less> { + using Impl = typename raw_ptr::Impl; + using is_transparent = void; + + bool operator()(const raw_ptr& lhs, + const raw_ptr& rhs) const { + Impl::IncrementLessCountForTest(); + return lhs < rhs; + } + + bool operator()(T* lhs, const raw_ptr& rhs) const { + Impl::IncrementLessCountForTest(); + return lhs < rhs; + } + + bool operator()(const raw_ptr& lhs, T* rhs) const { + Impl::IncrementLessCountForTest(); + return lhs < rhs; + } +}; + +// Define for cases where raw_ptr holds a pointer to an array of type T. +// This is consistent with definition of std::iterator_traits. +// Algorithms like std::binary_search need that. +template +struct iterator_traits> { + using difference_type = ptrdiff_t; + using value_type = std::remove_cv_t; + using pointer = T*; + using reference = T&; + using iterator_category = std::random_access_iterator_tag; +}; + +// Specialize std::pointer_traits. The latter is required to obtain the +// underlying raw pointer in the std::to_address(pointer) overload. +// Implementing the pointer_traits is the standard blessed way to customize +// `std::to_address(pointer)` in C++20 [3]. +// +// [1] https://wg21.link/pointer.traits.optmem + +template +struct pointer_traits<::raw_ptr> { + using pointer = ::raw_ptr; + using element_type = T; + using difference_type = ptrdiff_t; + + template + using rebind = ::raw_ptr; + + static constexpr pointer pointer_to(element_type& r) noexcept { + return pointer(&r); + } + + static constexpr element_type* to_address(pointer p) noexcept { + return p.get(); + } +}; + +} // namespace std + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_PTR_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr_exclusion.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr_exclusion.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr_exclusion.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr_exclusion.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,37 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_PTR_EXCLUSION_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_PTR_EXCLUSION_H_ + +// This header will be leakily included even when +// `!use_partition_alloc`, which is okay because it's a leaf header. +#include "base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h" // nogncheck +#include "base/allocator/partition_allocator/partition_alloc_buildflags.h" +#include "build/build_config.h" + +#if PA_HAS_ATTRIBUTE(annotate) +#if defined(OFFICIAL_BUILD) && !BUILDFLAG(FORCE_ENABLE_RAW_PTR_EXCLUSION) +// The annotation changed compiler output and increased binary size so disable +// for official builds. +// TODO(crbug.com/1320670): Remove when issue is resolved. +#define RAW_PTR_EXCLUSION +#else +// Marks a field as excluded from the `raw_ptr` usage enforcement via +// Chromium Clang plugin. +// +// Example: +// RAW_PTR_EXCLUSION Foo* foo_; +// +// `RAW_PTR_EXCLUSION` should be avoided, as exclusions makes it significantly +// easier for any bug involving the pointer to become a security vulnerability. +// For additional guidance please see the "When to use raw_ptr" section of +// `//base/memory/raw_ptr.md`. +#define RAW_PTR_EXCLUSION __attribute__((annotate("raw_ptr_exclusion"))) +#endif +#else +#define RAW_PTR_EXCLUSION +#endif + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_PTR_EXCLUSION_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr_noop_impl.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr_noop_impl.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr_noop_impl.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ptr_noop_impl.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,120 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_PTR_NOOP_IMPL_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_PTR_NOOP_IMPL_H_ + +#include + +#include "base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h" +#include "base/allocator/partition_allocator/partition_alloc_forward.h" + +namespace base::internal { + +struct RawPtrNoOpImpl { + static constexpr bool kMustZeroOnInit = false; + static constexpr bool kMustZeroOnMove = false; + static constexpr bool kMustZeroOnDestruct = false; + + // Wraps a pointer. + template + PA_ALWAYS_INLINE static constexpr T* WrapRawPtr(T* ptr) { + return ptr; + } + + // Notifies the allocator when a wrapped pointer is being removed or + // replaced. + template + PA_ALWAYS_INLINE static constexpr void ReleaseWrappedPtr(T*) {} + + // Unwraps the pointer, while asserting that memory hasn't been freed. The + // function is allowed to crash on nullptr. + template + PA_ALWAYS_INLINE static constexpr T* SafelyUnwrapPtrForDereference( + T* wrapped_ptr) { + return wrapped_ptr; + } + + // Unwraps the pointer, while asserting that memory hasn't been freed. The + // function must handle nullptr gracefully. + template + PA_ALWAYS_INLINE static constexpr T* SafelyUnwrapPtrForExtraction( + T* wrapped_ptr) { + return wrapped_ptr; + } + + // Unwraps the pointer, without making an assertion on whether memory was + // freed or not. + template + PA_ALWAYS_INLINE static constexpr T* UnsafelyUnwrapPtrForComparison( + T* wrapped_ptr) { + return wrapped_ptr; + } + + // Upcasts the wrapped pointer. + template + PA_ALWAYS_INLINE static constexpr To* Upcast(From* wrapped_ptr) { + static_assert(std::is_convertible::value, + "From must be convertible to To."); + // Note, this cast may change the address if upcasting to base that lies + // in the middle of the derived object. + return wrapped_ptr; + } + + // Advance the wrapped pointer by `delta_elems`. + template < + typename T, + typename Z, + typename = + std::enable_if_t, void>> + PA_ALWAYS_INLINE static constexpr T* Advance(T* wrapped_ptr, Z delta_elems) { + return wrapped_ptr + delta_elems; + } + + // Retreat the wrapped pointer by `delta_elems`. + template < + typename T, + typename Z, + typename = + std::enable_if_t, void>> + PA_ALWAYS_INLINE static constexpr T* Retreat(T* wrapped_ptr, Z delta_elems) { + return wrapped_ptr - delta_elems; + } + + template + PA_ALWAYS_INLINE static constexpr ptrdiff_t GetDeltaElems(T* wrapped_ptr1, + T* wrapped_ptr2) { + return wrapped_ptr1 - wrapped_ptr2; + } + + // Returns a copy of a wrapped pointer, without making an assertion on + // whether memory was freed or not. + template + PA_ALWAYS_INLINE static constexpr T* Duplicate(T* wrapped_ptr) { + return wrapped_ptr; + } + + // `WrapRawPtrForDuplication` and `UnsafelyUnwrapPtrForDuplication` are used + // to create a new raw_ptr from another raw_ptr of a different flavor. + template + PA_ALWAYS_INLINE static constexpr T* WrapRawPtrForDuplication(T* ptr) { + return ptr; + } + + template + PA_ALWAYS_INLINE static constexpr T* UnsafelyUnwrapPtrForDuplication( + T* wrapped_ptr) { + return wrapped_ptr; + } + + // This is for accounting only, used by unit tests. + PA_ALWAYS_INLINE constexpr static void IncrementSwapCountForTest() {} + PA_ALWAYS_INLINE constexpr static void IncrementLessCountForTest() {} + PA_ALWAYS_INLINE constexpr static void + IncrementPointerToMemberOperatorCountForTest() {} +}; + +} // namespace base::internal + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_PTR_NOOP_IMPL_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ref.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ref.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ref.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/allocator/partition_allocator/pointers/raw_ref.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,444 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_REF_H_ +#define BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_REF_H_ + +#include +#include +#include + +#include "base/allocator/partition_allocator/partition_alloc_base/augmentations/compiler_specific.h" +#include "base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h" +#include "base/allocator/partition_allocator/partition_alloc_buildflags.h" +#include "base/allocator/partition_allocator/partition_alloc_config.h" +#include "base/allocator/partition_allocator/pointers/raw_ptr.h" + +namespace base { + +template +class raw_ref; + +namespace internal { + +template +struct is_raw_ref : std::false_type {}; + +template +struct is_raw_ref<::base::raw_ref> : std::true_type {}; + +template +constexpr inline bool is_raw_ref_v = is_raw_ref::value; + +} // namespace internal + +// A smart pointer for a pointer which can not be null, and which provides +// Use-after-Free protection in the same ways as raw_ptr. This class acts like a +// combination of std::reference_wrapper and raw_ptr. +// +// See raw_ptr and //base/memory/raw_ptr.md for more details on the +// Use-after-Free protection. +// +// # Use after move +// +// The raw_ref type will abort if used after being moved. +// +// # Constness +// +// Use a `const raw_ref` when the smart pointer should not be able to rebind +// to a new reference. Use a `const raw_ref` do the same for a const +// reference, which is like `const T&`. +// +// Unlike a native `T&` reference, a mutable `raw_ref` can be changed +// independent of the underlying `T`, similar to `std::reference_wrapper`. That +// means the reference inside it can be moved and reassigned. +template +class PA_TRIVIAL_ABI PA_GSL_POINTER raw_ref { + // operator* is used with the expectation of GetForExtraction semantics: + // + // raw_ref foo_raw_ref = something; + // Foo& foo_ref = *foo_raw_ref; + // + // The implementation of operator* provides GetForDereference semantics, and + // this results in spurious crashes in BRP-ASan builds, so we need to disable + // hooks that provide BRP-ASan instrumentation for raw_ref. + using Inner = raw_ptr; + + // Some underlying implementations do not clear on move, which produces an + // inconsistent behaviour. We want consistent behaviour such that using a + // raw_ref after move is caught and aborts, so do it when the underlying + // implementation doesn't. Failure to clear would be indicated by the related + // death tests not CHECKing appropriately. + static constexpr bool kNeedClearAfterMove = !Inner::kZeroOnMove; + + public: + using Impl = typename Inner::Impl; + + // Construct a raw_ref from a pointer, which must not be null. + // + // This function is safe to use with any pointer, as it will CHECK and + // terminate the process if the pointer is null. Avoid dereferencing a pointer + // to avoid this CHECK as you may be dereferencing null. + PA_ALWAYS_INLINE constexpr static raw_ref from_ptr(T* ptr) noexcept { + PA_RAW_PTR_CHECK(ptr); + return raw_ref(*ptr); + } + + // Construct a raw_ref from a reference. + PA_ALWAYS_INLINE constexpr explicit raw_ref(T& p) noexcept + : inner_(std::addressof(p)) {} + + // Assign a new reference to the raw_ref, replacing the existing reference. + PA_ALWAYS_INLINE constexpr raw_ref& operator=(T& p) noexcept { + inner_.operator=(&p); + return *this; + } + + // Disallow holding references to temporaries. + raw_ref(const T&& p) = delete; + raw_ref& operator=(const T&& p) = delete; + + PA_ALWAYS_INLINE constexpr raw_ref(const raw_ref& p) noexcept + : inner_(p.inner_) { + PA_RAW_PTR_CHECK(inner_); // Catch use-after-move. + } + + PA_ALWAYS_INLINE constexpr raw_ref(raw_ref&& p) noexcept + : inner_(std::move(p.inner_)) { + PA_RAW_PTR_CHECK(inner_); // Catch use-after-move. + if constexpr (kNeedClearAfterMove) { + p.inner_ = nullptr; + } + } + + PA_ALWAYS_INLINE constexpr raw_ref& operator=(const raw_ref& p) noexcept { + PA_RAW_PTR_CHECK(p.inner_); // Catch use-after-move. + inner_.operator=(p.inner_); + return *this; + } + + PA_ALWAYS_INLINE constexpr raw_ref& operator=(raw_ref&& p) noexcept { + PA_RAW_PTR_CHECK(p.inner_); // Catch use-after-move. + inner_.operator=(std::move(p.inner_)); + if constexpr (kNeedClearAfterMove) { + p.inner_ = nullptr; + } + return *this; + } + + // Deliberately implicit in order to support implicit upcast. + // Delegate cross-kind conversion to the inner raw_ptr, which decides when to + // allow it. + template >> + // NOLINTNEXTLINE(google-explicit-constructor) + PA_ALWAYS_INLINE constexpr raw_ref(const raw_ref& p) noexcept + : inner_(p.inner_) { + PA_RAW_PTR_CHECK(inner_); // Catch use-after-move. + } + // Deliberately implicit in order to support implicit upcast. + // Delegate cross-kind conversion to the inner raw_ptr, which decides when to + // allow it. + template >> + // NOLINTNEXTLINE(google-explicit-constructor) + PA_ALWAYS_INLINE constexpr raw_ref(raw_ref&& p) noexcept + : inner_(std::move(p.inner_)) { + PA_RAW_PTR_CHECK(inner_); // Catch use-after-move. + if constexpr (kNeedClearAfterMove) { + p.inner_ = nullptr; + } + } + + // Upcast assignment + // Delegate cross-kind conversion to the inner raw_ptr, which decides when to + // allow it. + template >> + PA_ALWAYS_INLINE constexpr raw_ref& operator=( + const raw_ref& p) noexcept { + PA_RAW_PTR_CHECK(p.inner_); // Catch use-after-move. + inner_.operator=(p.inner_); + return *this; + } + // Delegate cross-kind conversion to the inner raw_ptr, which decides when to + // allow it. + template >> + PA_ALWAYS_INLINE constexpr raw_ref& operator=( + raw_ref&& p) noexcept { + PA_RAW_PTR_CHECK(p.inner_); // Catch use-after-move. + inner_.operator=(std::move(p.inner_)); + if constexpr (kNeedClearAfterMove) { + p.inner_ = nullptr; + } + return *this; + } + + PA_ALWAYS_INLINE constexpr T& operator*() const { + PA_RAW_PTR_CHECK(inner_); // Catch use-after-move. + return inner_.operator*(); + } + + // This is an equivalent to operator*() that provides GetForExtraction rather + // rather than GetForDereference semantics (see raw_ptr.h). This should be + // used in place of operator*() when the memory referred to by the reference + // is not immediately going to be accessed. + PA_ALWAYS_INLINE constexpr T& get() const { + PA_RAW_PTR_CHECK(inner_); // Catch use-after-move. + return *inner_.get(); + } + + PA_ALWAYS_INLINE constexpr T* operator->() const + PA_ATTRIBUTE_RETURNS_NONNULL { + PA_RAW_PTR_CHECK(inner_); // Catch use-after-move. + return inner_.operator->(); + } + + // This is used to verify callbacks are not invoked with dangling references. + // If the `raw_ref` references a deleted object, it will trigger an error. + // Depending on the PartitionAllocUnretainedDanglingPtr feature, this is + // either a DumpWithoutCrashing, a crash, or ignored. + PA_ALWAYS_INLINE void ReportIfDangling() const noexcept { + inner_.ReportIfDangling(); + } + + PA_ALWAYS_INLINE friend constexpr void swap(raw_ref& lhs, + raw_ref& rhs) noexcept { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + swap(lhs.inner_, rhs.inner_); + } + + template + friend bool operator==(const raw_ref& lhs, + const raw_ref& rhs); + template + friend bool operator!=(const raw_ref& lhs, + const raw_ref& rhs); + template + friend bool operator<(const raw_ref& lhs, + const raw_ref& rhs); + template + friend bool operator>(const raw_ref& lhs, + const raw_ref& rhs); + template + friend bool operator<=(const raw_ref& lhs, + const raw_ref& rhs); + template + friend bool operator>=(const raw_ref& lhs, + const raw_ref& rhs); + + template , void>> + PA_ALWAYS_INLINE friend bool operator==(const raw_ref& lhs, const U& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + return lhs.inner_ == &rhs; + } + template , void>> + PA_ALWAYS_INLINE friend bool operator!=(const raw_ref& lhs, const U& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + return lhs.inner_ != &rhs; + } + template , void>> + PA_ALWAYS_INLINE friend bool operator<(const raw_ref& lhs, const U& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + return lhs.inner_ < &rhs; + } + template , void>> + PA_ALWAYS_INLINE friend bool operator>(const raw_ref& lhs, const U& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + return lhs.inner_ > &rhs; + } + template , void>> + PA_ALWAYS_INLINE friend bool operator<=(const raw_ref& lhs, const U& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + return lhs.inner_ <= &rhs; + } + template , void>> + PA_ALWAYS_INLINE friend bool operator>=(const raw_ref& lhs, const U& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + return lhs.inner_ >= &rhs; + } + + template , void>> + PA_ALWAYS_INLINE friend bool operator==(const U& lhs, const raw_ref& rhs) { + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return &lhs == rhs.inner_; + } + template , void>> + PA_ALWAYS_INLINE friend bool operator!=(const U& lhs, const raw_ref& rhs) { + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return &lhs != rhs.inner_; + } + template , void>> + PA_ALWAYS_INLINE friend bool operator<(const U& lhs, const raw_ref& rhs) { + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return &lhs < rhs.inner_; + } + template , void>> + PA_ALWAYS_INLINE friend bool operator>(const U& lhs, const raw_ref& rhs) { + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return &lhs > rhs.inner_; + } + template , void>> + PA_ALWAYS_INLINE friend bool operator<=(const U& lhs, const raw_ref& rhs) { + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return &lhs <= rhs.inner_; + } + template , void>> + PA_ALWAYS_INLINE friend bool operator>=(const U& lhs, const raw_ref& rhs) { + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return &lhs >= rhs.inner_; + } + + private: + template + friend class raw_ref; + + Inner inner_; +}; + +template +PA_ALWAYS_INLINE bool operator==(const raw_ref& lhs, + const raw_ref& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return lhs.inner_ == rhs.inner_; +} +template +PA_ALWAYS_INLINE bool operator!=(const raw_ref& lhs, + const raw_ref& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return lhs.inner_ != rhs.inner_; +} +template +PA_ALWAYS_INLINE bool operator<(const raw_ref& lhs, + const raw_ref& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return lhs.inner_ < rhs.inner_; +} +template +PA_ALWAYS_INLINE bool operator>(const raw_ref& lhs, + const raw_ref& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return lhs.inner_ > rhs.inner_; +} +template +PA_ALWAYS_INLINE bool operator<=(const raw_ref& lhs, + const raw_ref& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return lhs.inner_ <= rhs.inner_; +} +template +PA_ALWAYS_INLINE bool operator>=(const raw_ref& lhs, + const raw_ref& rhs) { + PA_RAW_PTR_CHECK(lhs.inner_); // Catch use-after-move. + PA_RAW_PTR_CHECK(rhs.inner_); // Catch use-after-move. + return lhs.inner_ >= rhs.inner_; +} + +// CTAD deduction guide. +template +raw_ref(T&) -> raw_ref; +template +raw_ref(const T&) -> raw_ref; + +// Template helpers for working with raw_ref. +template +struct IsRawRef : std::false_type {}; + +template +struct IsRawRef> : std::true_type {}; + +template +inline constexpr bool IsRawRefV = IsRawRef::value; + +template +struct RemoveRawRef { + using type = T; +}; + +template +struct RemoveRawRef> { + using type = T; +}; + +template +using RemoveRawRefT = typename RemoveRawRef::type; + +} // namespace base + +using base::raw_ref; + +template +auto ToRawRef(T& ref) { + return raw_ref(ref); +} + +namespace std { + +// Override so set/map lookups do not create extra raw_ref. This also +// allows C++ references to be used for lookup. +template +struct less> { + using Impl = typename raw_ref::Impl; + using is_transparent = void; + + bool operator()(const raw_ref& lhs, + const raw_ref& rhs) const { + Impl::IncrementLessCountForTest(); + return lhs < rhs; + } + + bool operator()(T& lhs, const raw_ref& rhs) const { + Impl::IncrementLessCountForTest(); + return lhs < rhs; + } + + bool operator()(const raw_ref& lhs, T& rhs) const { + Impl::IncrementLessCountForTest(); + return lhs < rhs; + } +}; + +// Specialize std::pointer_traits. The latter is required to obtain the +// underlying raw pointer in the std::to_address(pointer) overload. +// Implementing the pointer_traits is the standard blessed way to customize +// `std::to_address(pointer)` in C++20 [3]. +// +// [1] https://wg21.link/pointer.traits.optmem + +template +struct pointer_traits<::raw_ref> { + using pointer = ::raw_ref; + using element_type = T; + using difference_type = ptrdiff_t; + + template + using rebind = ::raw_ref; + + static constexpr pointer pointer_to(element_type& r) noexcept { + return pointer(r); + } + + static constexpr element_type* to_address(pointer p) noexcept { + // `raw_ref::get` is used instead of raw_ref::operator*`. It provides + // GetForExtraction rather rather than GetForDereference semantics (see + // raw_ptr.h). This should be used when we we don't know the memory will be + // accessed. + return &(p.get()); + } +}; + +} // namespace std + +#endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_POINTERS_RAW_REF_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/apple/bundle_locations.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/apple/bundle_locations.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/apple/bundle_locations.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/apple/bundle_locations.h 2025-12-01 18:15:47.000000000 +0000 @@ -0,0 +1,71 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_APPLE_BUNDLE_LOCATIONS_H_ +#define BASE_APPLE_BUNDLE_LOCATIONS_H_ + +#include "base/base_export.h" +#include "base/files/file_path.h" + +#if defined(__OBJC__) +#import +#endif // __OBJC__ + +namespace base { +class FilePath; +} + +// NSBundle isn't thread-safe; all functions in this file must be called on the +// main thread. + +namespace base::apple { + +// This file provides several functions to explicitly request the various +// component bundles of Chrome. Please use these methods rather than calling +// `+[NSBundle mainBundle]` or `CFBundleGetMainBundle()`. +// +// Terminology +// - "Outer Bundle" - This is the main bundle for Chrome; it's what +// `+[NSBundle mainBundle]` returns when Chrome is launched normally. +// +// - "Main Bundle" - This is the bundle from which Chrome was launched. +// This will be the same as the outer bundle except when Chrome is launched +// via an app shortcut, in which case this will return the app shortcut's +// bundle rather than the main Chrome bundle. +// +// - "Framework Bundle" - This is the bundle corresponding to the Chrome +// framework. +// +// Guidelines for use: +// - To access a resource, the Framework bundle should be used. +// - If the choice is between the Outer or Main bundles then please choose +// carefully. Most often the Outer bundle will be the right choice, but for +// cases such as adding an app to the "launch on startup" list, the Main +// bundle is probably the one to use. + +// Methods for retrieving the various bundles. +BASE_EXPORT FilePath MainBundlePath(); +BASE_EXPORT FilePath OuterBundlePath(); +BASE_EXPORT FilePath FrameworkBundlePath(); +#if defined(__OBJC__) +BASE_EXPORT NSBundle* MainBundle(); +BASE_EXPORT NSURL* MainBundleURL(); +BASE_EXPORT NSBundle* OuterBundle(); +BASE_EXPORT NSURL* OuterBundleURL(); +BASE_EXPORT NSBundle* FrameworkBundle(); +#endif // __OBJC__ + +// Set the bundle that the preceding functions will return, overriding the +// default values. Restore the default by passing in `nil` or an empty +// `FilePath`. +BASE_EXPORT void SetOverrideOuterBundlePath(const FilePath& file_path); +BASE_EXPORT void SetOverrideFrameworkBundlePath(const FilePath& file_path); +#if defined(__OBJC__) +BASE_EXPORT void SetOverrideOuterBundle(NSBundle* bundle); +BASE_EXPORT void SetOverrideFrameworkBundle(NSBundle* bundle); +#endif // __OBJC__ + +} // namespace base::apple + +#endif // BASE_APPLE_BUNDLE_LOCATIONS_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/atomic_ref_count.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/atomic_ref_count.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/atomic_ref_count.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/atomic_ref_count.h 2025-12-01 18:15:47.000000000 +0000 @@ -0,0 +1,75 @@ +// Copyright 2011 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This is a low level implementation of atomic semantics for reference +// counting. Please use base/memory/ref_counted.h directly instead. + +#ifndef BASE_ATOMIC_REF_COUNT_H_ +#define BASE_ATOMIC_REF_COUNT_H_ + +#include + +namespace base { + +namespace subtle { +class RefCountedOverflowTest; +} // namespace subtle + +class AtomicRefCount { + public: + constexpr AtomicRefCount() : ref_count_(0) {} + explicit constexpr AtomicRefCount(int initial_value) + : ref_count_(initial_value) {} + + // Increment a reference count. + // Returns the previous value of the count. + int Increment() { return Increment(1); } + + // Increment a reference count by "increment", which must exceed 0. + // Returns the previous value of the count. + int Increment(int increment) { + return ref_count_.fetch_add(increment, std::memory_order_relaxed); + } + + // Decrement a reference count, and return whether the result is non-zero. + // Insert barriers to ensure that state written before the reference count + // became zero will be visible to a thread that has just made the count zero. + bool Decrement() { + // TODO(jbroman): Technically this doesn't need to be an acquire operation + // unless the result is 1 (i.e., the ref count did indeed reach zero). + // However, there are toolchain issues that make that not work as well at + // present (notably TSAN doesn't like it). + return ref_count_.fetch_sub(1, std::memory_order_acq_rel) != 1; + } + + // Return whether the reference count is one. If the reference count is used + // in the conventional way, a refrerence count of 1 implies that the current + // thread owns the reference and no other thread shares it. This call + // performs the test for a reference count of one, and performs the memory + // barrier needed for the owning thread to act on the object, knowing that it + // has exclusive access to the object. + bool IsOne() const { return ref_count_.load(std::memory_order_acquire) == 1; } + + // Return whether the reference count is zero. With conventional object + // referencing counting, the object will be destroyed, so the reference count + // should never be zero. Hence this is generally used for a debug check. + bool IsZero() const { + return ref_count_.load(std::memory_order_acquire) == 0; + } + + // Returns the current reference count (with no barriers). This is subtle, and + // should be used only for debugging. + int SubtleRefCountForDebug() const { + return ref_count_.load(std::memory_order_relaxed); + } + + private: + friend subtle::RefCountedOverflowTest; + + std::atomic_int ref_count_; +}; + +} // namespace base + +#endif // BASE_ATOMIC_REF_COUNT_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/atomicops.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/atomicops.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/atomicops.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/atomicops.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,153 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// IMPORTANT NOTE: deprecated. Use std::atomic instead. +// +// Rationale: +// - Uniformity: most of the code uses std::atomic, and the underlying +// implementation is the same. Use the STL one. +// - Clearer code: return values from some operations (e.g. CompareAndSwap) +// differ from the equivalent ones in std::atomic, leading to confusion. +// - Richer semantics: can use actual types, rather than e.g. Atomic32 for a +// boolean flag, or AtomicWord for T*. Bitwise operations (e.g. fetch_or()) +// are only in std::atomic. +// - Harder to misuse: base::subtle::Atomic32 is just an int, making it possible +// to accidentally manipulate, not realizing that there are no atomic +// semantics attached to it. For instance, "Atomic32 a; a++;" is almost +// certainly incorrect. + +// For atomic operations on reference counts, see atomic_refcount.h. +// For atomic operations on sequence numbers, see atomic_sequence_num.h. + +// The routines exported by this module are subtle. If you use them, even if +// you get the code right, it will depend on careful reasoning about atomicity +// and memory ordering; it will be less readable, and harder to maintain. If +// you plan to use these routines, you should have a good reason, such as solid +// evidence that performance would otherwise suffer, or there being no +// alternative. You should assume only properties explicitly guaranteed by the +// specifications in this file. You are almost certainly _not_ writing code +// just for the x86; if you assume x86 semantics, x86 hardware bugs and +// implementations on other archtectures will cause your code to break. If you +// do not know what you are doing, avoid these routines, and use a Mutex. +// +// It is incorrect to make direct assignments to/from an atomic variable. +// You should use one of the Load or Store routines. The NoBarrier +// versions are provided when no barriers are needed: +// NoBarrier_Store() +// NoBarrier_Load() +// Although there are currently no compiler enforcement, you are encouraged +// to use these. +// + +#ifndef BASE_ATOMICOPS_H_ +#define BASE_ATOMICOPS_H_ + +#include + +// Small C++ header which defines implementation specific macros used to +// identify the STL implementation. +// - libc++: captures __config for _LIBCPP_VERSION +// - libstdc++: captures bits/c++config.h for __GLIBCXX__ +#include + +#include "build/build_config.h" + +namespace base { +namespace subtle { + +typedef int32_t Atomic32; +#ifdef ARCH_CPU_64_BITS +// We need to be able to go between Atomic64 and AtomicWord implicitly. This +// means Atomic64 and AtomicWord should be the same type on 64-bit. +#if defined(__ILP32__) || BUILDFLAG(IS_NACL) +// NaCl's intptr_t is not actually 64-bits on 64-bit! +// http://code.google.com/p/nativeclient/issues/detail?id=1162 +typedef int64_t Atomic64; +#else +typedef intptr_t Atomic64; +#endif +#endif + +// Use AtomicWord for a machine-sized pointer. It will use the Atomic32 or +// Atomic64 routines below, depending on your architecture. +typedef intptr_t AtomicWord; + +// Atomically execute: +// result = *ptr; +// if (*ptr == old_value) +// *ptr = new_value; +// return result; +// +// I.e., replace "*ptr" with "new_value" if "*ptr" used to be "old_value". +// Always return the old value of "*ptr" +// +// This routine implies no memory barriers. +Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value); + +// Atomically store new_value into *ptr, returning the previous value held in +// *ptr. This routine implies no memory barriers. +Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, Atomic32 new_value); + +// Atomically increment *ptr by "increment". Returns the new value of +// *ptr with the increment applied. This routine implies no memory barriers. +Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, Atomic32 increment); + +Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment); + +// These following lower-level operations are typically useful only to people +// implementing higher-level synchronization operations like spinlocks, +// mutexes, and condition-variables. They combine CompareAndSwap(), a load, or +// a store with appropriate memory-ordering instructions. "Acquire" operations +// ensure that no later memory access can be reordered ahead of the operation. +// "Release" operations ensure that no previous memory access can be reordered +// after the operation. "Barrier" operations have both "Acquire" and "Release" +// semantics. +Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value); +Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value); + +void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value); +void Release_Store(volatile Atomic32* ptr, Atomic32 value); + +Atomic32 NoBarrier_Load(volatile const Atomic32* ptr); +Atomic32 Acquire_Load(volatile const Atomic32* ptr); + +// 64-bit atomic operations (only available on 64-bit processors). +#ifdef ARCH_CPU_64_BITS +Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value); +Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, Atomic64 new_value); +Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment); +Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, Atomic64 increment); + +Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value); +Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value); +void Release_Store(volatile Atomic64* ptr, Atomic64 value); +Atomic64 NoBarrier_Load(volatile const Atomic64* ptr); +Atomic64 Acquire_Load(volatile const Atomic64* ptr); +#endif // ARCH_CPU_64_BITS + +} // namespace subtle +} // namespace base + +#include "base/atomicops_internals_portable.h" + +// On some platforms we need additional declarations to make +// AtomicWord compatible with our other Atomic* types. +#if BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_OPENBSD) +#include "base/atomicops_internals_atomicword_compat.h" +#endif + +#endif // BASE_ATOMICOPS_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/atomicops_internals_atomicword_compat.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/atomicops_internals_atomicword_compat.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/atomicops_internals_atomicword_compat.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/atomicops_internals_atomicword_compat.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,94 @@ +// Copyright 2011 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file is an internal atomic implementation, use base/atomicops.h instead. + +#ifndef BASE_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_ +#define BASE_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_ + +#include + +#include "build/build_config.h" + +// AtomicWord is a synonym for intptr_t, and Atomic32 is a synonym for int32_t, +// which in turn means int. On some LP32 platforms, intptr_t is an int, but +// on others, it's a long. When AtomicWord and Atomic32 are based on different +// fundamental types, their pointers are incompatible. +// +// This file defines function overloads to allow both AtomicWord and Atomic32 +// data to be used with this interface. +// +// On LP64 platforms, AtomicWord and Atomic64 are both always long, +// so this problem doesn't occur. + +#if !defined(ARCH_CPU_64_BITS) + +namespace base { +namespace subtle { + +inline AtomicWord NoBarrier_CompareAndSwap(volatile AtomicWord* ptr, + AtomicWord old_value, + AtomicWord new_value) { + return NoBarrier_CompareAndSwap( + reinterpret_cast(ptr), old_value, new_value); +} + +inline AtomicWord NoBarrier_AtomicExchange(volatile AtomicWord* ptr, + AtomicWord new_value) { + return NoBarrier_AtomicExchange( + reinterpret_cast(ptr), new_value); +} + +inline AtomicWord NoBarrier_AtomicIncrement(volatile AtomicWord* ptr, + AtomicWord increment) { + return NoBarrier_AtomicIncrement( + reinterpret_cast(ptr), increment); +} + +inline AtomicWord Barrier_AtomicIncrement(volatile AtomicWord* ptr, + AtomicWord increment) { + return Barrier_AtomicIncrement( + reinterpret_cast(ptr), increment); +} + +inline AtomicWord Acquire_CompareAndSwap(volatile AtomicWord* ptr, + AtomicWord old_value, + AtomicWord new_value) { + return base::subtle::Acquire_CompareAndSwap( + reinterpret_cast(ptr), old_value, new_value); +} + +inline AtomicWord Release_CompareAndSwap(volatile AtomicWord* ptr, + AtomicWord old_value, + AtomicWord new_value) { + return base::subtle::Release_CompareAndSwap( + reinterpret_cast(ptr), old_value, new_value); +} + +inline void NoBarrier_Store(volatile AtomicWord *ptr, AtomicWord value) { + NoBarrier_Store( + reinterpret_cast(ptr), value); +} + +inline void Release_Store(volatile AtomicWord* ptr, AtomicWord value) { + return base::subtle::Release_Store( + reinterpret_cast(ptr), value); +} + +inline AtomicWord NoBarrier_Load(volatile const AtomicWord *ptr) { + return NoBarrier_Load( + reinterpret_cast(ptr)); +} + +inline AtomicWord Acquire_Load(volatile const AtomicWord* ptr) { + return base::subtle::Acquire_Load( + reinterpret_cast(ptr)); +} + +} // namespace subtle +} // namespace base + +#endif // !defined(ARCH_CPU_64_BITS) + +#endif // BASE_ATOMICOPS_INTERNALS_ATOMICWORD_COMPAT_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/atomicops_internals_portable.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/atomicops_internals_portable.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/atomicops_internals_portable.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/atomicops_internals_portable.h 2025-12-01 18:15:47.000000000 +0000 @@ -0,0 +1,190 @@ +// 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. + +// This file is an internal atomic implementation, use atomicops.h instead. +// +// This implementation uses C++11 atomics' member functions. The code base is +// currently written assuming atomicity revolves around accesses instead of +// C++11's memory locations. The burden is on the programmer to ensure that all +// memory locations accessed atomically are never accessed non-atomically (tsan +// should help with this). +// +// TODO(jfb) Modify the atomicops.h API and user code to declare atomic +// locations as truly atomic. See the static_assert below. +// +// Of note in this implementation: +// * All NoBarrier variants are implemented as relaxed. +// * All Barrier variants are implemented as sequentially-consistent. +// * Compare exchange's failure ordering is always the same as the success one +// (except for release, which fails as relaxed): using a weaker ordering is +// only valid under certain uses of compare exchange. +// * Atomic increment is expected to return the post-incremented value, whereas +// C11 fetch add returns the previous value. The implementation therefore +// needs to increment twice (which the compiler should be able to detect and +// optimize). + +#ifndef BASE_ATOMICOPS_INTERNALS_PORTABLE_H_ +#define BASE_ATOMICOPS_INTERNALS_PORTABLE_H_ + +#include + +#include "build/build_config.h" + +namespace base { +namespace subtle { + +// This implementation is transitional and maintains the original API for +// atomicops.h. This requires casting memory locations to the atomic types, and +// assumes that the API and the C++11 implementation are layout-compatible, +// which isn't true for all implementations or hardware platforms. The static +// assertion should detect this issue, were it to fire then this header +// shouldn't be used. +// +// TODO(jfb) If this header manages to stay committed then the API should be +// modified, and all call sites updated. +typedef volatile std::atomic* AtomicLocation32; +static_assert(sizeof(*(AtomicLocation32) nullptr) == sizeof(Atomic32), + "incompatible 32-bit atomic layout"); + +inline Atomic32 NoBarrier_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + ((AtomicLocation32)ptr) + ->compare_exchange_strong(old_value, + new_value, + std::memory_order_relaxed, + std::memory_order_relaxed); + return old_value; +} + +inline Atomic32 NoBarrier_AtomicExchange(volatile Atomic32* ptr, + Atomic32 new_value) { + return ((AtomicLocation32)ptr) + ->exchange(new_value, std::memory_order_relaxed); +} + +inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + return increment + + ((AtomicLocation32)ptr) + ->fetch_add(increment, std::memory_order_relaxed); +} + +inline Atomic32 Barrier_AtomicIncrement(volatile Atomic32* ptr, + Atomic32 increment) { + return increment + ((AtomicLocation32)ptr)->fetch_add(increment); +} + +inline Atomic32 Acquire_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + ((AtomicLocation32)ptr) + ->compare_exchange_strong(old_value, + new_value, + std::memory_order_acquire, + std::memory_order_acquire); + return old_value; +} + +inline Atomic32 Release_CompareAndSwap(volatile Atomic32* ptr, + Atomic32 old_value, + Atomic32 new_value) { + ((AtomicLocation32)ptr) + ->compare_exchange_strong(old_value, + new_value, + std::memory_order_release, + std::memory_order_relaxed); + return old_value; +} + +inline void NoBarrier_Store(volatile Atomic32* ptr, Atomic32 value) { + ((AtomicLocation32)ptr)->store(value, std::memory_order_relaxed); +} + +inline void Release_Store(volatile Atomic32* ptr, Atomic32 value) { + ((AtomicLocation32)ptr)->store(value, std::memory_order_release); +} + +inline Atomic32 NoBarrier_Load(volatile const Atomic32* ptr) { + return ((AtomicLocation32)ptr)->load(std::memory_order_relaxed); +} + +inline Atomic32 Acquire_Load(volatile const Atomic32* ptr) { + return ((AtomicLocation32)ptr)->load(std::memory_order_acquire); +} + +#if defined(ARCH_CPU_64_BITS) + +typedef volatile std::atomic* AtomicLocation64; +static_assert(sizeof(*(AtomicLocation64) nullptr) == sizeof(Atomic64), + "incompatible 64-bit atomic layout"); + +inline Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + ((AtomicLocation64)ptr) + ->compare_exchange_strong(old_value, + new_value, + std::memory_order_relaxed, + std::memory_order_relaxed); + return old_value; +} + +inline Atomic64 NoBarrier_AtomicExchange(volatile Atomic64* ptr, + Atomic64 new_value) { + return ((AtomicLocation64)ptr) + ->exchange(new_value, std::memory_order_relaxed); +} + +inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64* ptr, + Atomic64 increment) { + return increment + + ((AtomicLocation64)ptr) + ->fetch_add(increment, std::memory_order_relaxed); +} + +inline Atomic64 Barrier_AtomicIncrement(volatile Atomic64* ptr, + Atomic64 increment) { + return increment + ((AtomicLocation64)ptr)->fetch_add(increment); +} + +inline Atomic64 Acquire_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + ((AtomicLocation64)ptr) + ->compare_exchange_strong(old_value, + new_value, + std::memory_order_acquire, + std::memory_order_acquire); + return old_value; +} + +inline Atomic64 Release_CompareAndSwap(volatile Atomic64* ptr, + Atomic64 old_value, + Atomic64 new_value) { + ((AtomicLocation64)ptr) + ->compare_exchange_strong(old_value, + new_value, + std::memory_order_release, + std::memory_order_relaxed); + return old_value; +} + +inline void Release_Store(volatile Atomic64* ptr, Atomic64 value) { + ((AtomicLocation64)ptr)->store(value, std::memory_order_release); +} + +inline Atomic64 NoBarrier_Load(volatile const Atomic64* ptr) { + return ((AtomicLocation64)ptr)->load(std::memory_order_relaxed); +} + +inline Atomic64 Acquire_Load(volatile const Atomic64* ptr) { + return ((AtomicLocation64)ptr)->load(std::memory_order_acquire); +} + +#endif // defined(ARCH_CPU_64_BITS) +} // namespace subtle +} // namespace base + +#endif // BASE_ATOMICOPS_INTERNALS_PORTABLE_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/auto_reset.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/auto_reset.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/auto_reset.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/auto_reset.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,69 @@ +// Copyright 2011 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_AUTO_RESET_H_ +#define BASE_AUTO_RESET_H_ + +#include + +#include "base/check_op.h" +#include "base/memory/raw_ptr_exclusion.h" + +// base::AutoReset<> is useful for setting a variable to a new value only within +// a particular scope. An base::AutoReset<> object resets a variable to its +// original value upon destruction, making it an alternative to writing +// "var = false;" or "var = old_val;" at all of a block's exit points. +// +// This should be obvious, but note that an base::AutoReset<> instance should +// have a shorter lifetime than its scoped_variable, to prevent invalid memory +// writes when the base::AutoReset<> object is destroyed. + +namespace base { + +template +class [[maybe_unused, nodiscard]] AutoReset { + public: + template + AutoReset(T* scoped_variable, U&& new_value) + : scoped_variable_(scoped_variable), + original_value_( + std::exchange(*scoped_variable_, std::forward(new_value))) {} + + // A constructor that's useful for asserting the old value of + // `scoped_variable`, especially when it's inconvenient to check this before + // constructing the AutoReset object (e.g. in a class member initializer + // list). + template + AutoReset(T* scoped_variable, U&& new_value, const T& expected_old_value) + : AutoReset(scoped_variable, new_value) { + DCHECK_EQ(original_value_, expected_old_value); + } + + AutoReset(AutoReset&& other) + : scoped_variable_(std::exchange(other.scoped_variable_, nullptr)), + original_value_(std::move(other.original_value_)) {} + + AutoReset& operator=(AutoReset&& rhs) { + scoped_variable_ = std::exchange(rhs.scoped_variable_, nullptr); + original_value_ = std::move(rhs.original_value_); + return *this; + } + + ~AutoReset() { + if (scoped_variable_) + *scoped_variable_ = std::move(original_value_); + } + + private: + // `scoped_variable_` is not a raw_ptr for performance reasons: Large + // number of non-PartitionAlloc pointees + AutoReset is typically short-lived + // (e.g. allocated on the stack). + RAW_PTR_EXCLUSION T* scoped_variable_; + + T original_value_; +}; + +} // namespace base + +#endif // BASE_AUTO_RESET_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/base_export.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_export.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/base_export.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_export.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,29 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_BASE_EXPORT_H_ +#define BASE_BASE_EXPORT_H_ + +#if defined(COMPONENT_BUILD) +#if defined(WIN32) + +#if defined(BASE_IMPLEMENTATION) +#define BASE_EXPORT __declspec(dllexport) +#else +#define BASE_EXPORT __declspec(dllimport) +#endif // defined(BASE_IMPLEMENTATION) + +#else // defined(WIN32) +#if defined(BASE_IMPLEMENTATION) +#define BASE_EXPORT __attribute__((visibility("default"))) +#else +#define BASE_EXPORT +#endif // defined(BASE_IMPLEMENTATION) +#endif + +#else // defined(COMPONENT_BUILD) +#define BASE_EXPORT +#endif + +#endif // BASE_BASE_EXPORT_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/base_paths.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/base_paths.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths.cc 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,73 @@ +// Copyright 2006-2008 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/base_paths.h" + +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/path_service.h" +#include "build/build_config.h" + +namespace base { + +bool PathProvider(int key, FilePath* result) { + // NOTE: DIR_CURRENT is a special case in PathService::Get + + switch (key) { + case DIR_EXE: + if (!PathService::Get(FILE_EXE, result)) + return false; + *result = result->DirName(); + return true; +#if !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_IOS) + case DIR_MODULE: + if (!PathService::Get(FILE_MODULE, result)) + return false; + *result = result->DirName(); + return true; +#if !defined(MOZ_ZUCCHINI) + case DIR_ASSETS: + return PathService::Get(DIR_MODULE, result); +#endif // !defined(MOZ_ZUCCHINI) +#endif // !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_IOS) + case DIR_TEMP: + return GetTempDir(result); + case DIR_HOME: + *result = GetHomeDir(); + return true; + case base::DIR_SRC_TEST_DATA_ROOT: + // This is only used by tests and overridden by each platform. + NOTREACHED(); + return false; +#if !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_IOS) + case DIR_OUT_TEST_DATA_ROOT: + // On most platforms test binaries are run directly from the build-output + // directory, so return the directory containing the executable. + return PathService::Get(DIR_MODULE, result); +#endif // !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_IOS) + case DIR_GEN_TEST_DATA_ROOT: + if (!PathService::Get(DIR_OUT_TEST_DATA_ROOT, result)) { + return false; + } + *result = result->Append(FILE_PATH_LITERAL("gen")); + return true; + case DIR_TEST_DATA: { + FilePath test_data_path; + if (!PathService::Get(DIR_SRC_TEST_DATA_ROOT, &test_data_path)) { + return false; + } + test_data_path = test_data_path.Append(FILE_PATH_LITERAL("base")); + test_data_path = test_data_path.Append(FILE_PATH_LITERAL("test")); + test_data_path = test_data_path.Append(FILE_PATH_LITERAL("data")); + if (!PathExists(test_data_path)) // We don't want to create this. + return false; + *result = test_data_path; + return true; + } + } + + return false; +} + +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/base_paths.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/base_paths.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,102 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_BASE_PATHS_H_ +#define BASE_BASE_PATHS_H_ + +// This file declares path keys for the base module. These can be used with +// the PathService to access various special directories and files. + +#include "build/build_config.h" + +#if BUILDFLAG(IS_WIN) +#include "base/base_paths_win.h" +#elif BUILDFLAG(IS_MAC) +#include "base/base_paths_mac.h" +#elif BUILDFLAG(IS_IOS) +#include "base/base_paths_ios.h" +#elif BUILDFLAG(IS_ANDROID) +#include "base/base_paths_android.h" +#endif + +#if BUILDFLAG(IS_POSIX) +#include "base/base_paths_posix.h" +#endif + +namespace base { + +enum BasePathKey { + PATH_START = 0, + + // The following refer to the current application. + FILE_EXE, // Path and filename of the current executable. +#if !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_IOS) + // Prefer keys (e.g., DIR_ASSETS) that are specific to the use case as the + // module location may not work as expected on some platforms. For this + // reason, this key is not defined on Fuchsia. See crbug.com/1263691 for + // details. + FILE_MODULE, // Path and filename of the module containing the code for + // the PathService (which could differ from FILE_EXE if the + // PathService were compiled into a shared object, for + // example). +#endif + DIR_EXE, // Directory containing FILE_EXE. +#if !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_IOS) + // Prefer keys (e.g., DIR_ASSETS) that are specific to the use case as the + // module location may not work as expected on some platforms. For this + // reason, this key is not defined on Fuchsia. See crbug.com/1263691 for + // details. + DIR_MODULE, // Directory containing FILE_MODULE. +#endif +#if !defined(MOZ_ZUCCHINI) + DIR_ASSETS, // Directory that contains application assets. +#endif // !defined(MOZ_ZUCCHINI) + + // The following refer to system and system user directories. + DIR_TEMP, // Temporary directory for the system and/or user. + DIR_HOME, // User's root home directory. On Windows this will look + // like "C:\Users\" which isn't necessarily a great + // place to put files. +#if !BUILDFLAG(IS_IOS) +#if !defined(MOZ_ZUCCHINI) + DIR_USER_DESKTOP, // The current user's Desktop. +#endif // !defined(MOZ_ZUCCHINI) +#endif + + // The following refer to the applications current environment. + DIR_CURRENT, // Current directory. + + // The following are only for use in tests. + // On some platforms, such as Android and Fuchsia, tests do not have access to + // the build file system so the necessary files are bundled with the test + // binary. On such platforms, these will return an appropriate path inside the + // bundle. + DIR_SRC_TEST_DATA_ROOT, // The root of files in the source tree that are + // made available to tests. Useful for tests that use + // resources that exist in the source tree. + DIR_SOURCE_ROOT = DIR_SRC_TEST_DATA_ROOT, // Legacy name still widely used. + // TODO(crbug.com/1264897): Replace + // all instances and remove alias. + DIR_OUT_TEST_DATA_ROOT, // Path of build outputs available to tests. Build + // output files are normally placed directly in the + // build output directory on platforms that do not + // "package" tests. On platforms that "package" + // tests this will instead return a package-local + // path to copies of the relevant files. + DIR_GEN_TEST_DATA_ROOT, // Path of generated intermediate files available to + // tests. Build-intermediate files are normally + // placed in the "gen" sub-directory of the build + // output directory. On platforms that "package" + // tests this will instead return a package-local + // path to copies of the relevant files. + DIR_TEST_DATA, // Directory containing test data for //base tests. + // Only for use in base_unittests. Equivalent to + // DIR_SRC_TEST_DATA_ROOT + "/base/test/data". + + PATH_END +}; + +} // namespace base + +#endif // BASE_BASE_PATHS_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/base_paths_apple.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_apple.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/base_paths_apple.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_apple.cc 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,52 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/base_paths_apple.h" + +#include +#include +#include + +#include "base/check_op.h" +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/strings/string_util.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/threading/thread_restrictions.h" +#endif // !defined(MOZ_ZUCCHINI) + +namespace base::apple::internal { + +base::FilePath GetExecutablePath() { + // Executable path can have relative references ("..") depending on + // how the app was launched. + uint32_t executable_length = 0; + _NSGetExecutablePath(NULL, &executable_length); + DCHECK_GT(executable_length, 1u); + std::string executable_path; + int rv = _NSGetExecutablePath( + base::WriteInto(&executable_path, executable_length), &executable_length); + DCHECK_EQ(rv, 0); + + // _NSGetExecutablePath may return paths containing ./ or ../ which makes + // FilePath::DirName() work incorrectly, convert it to absolute path so that + // paths such as DIR_SRC_TEST_DATA_ROOT can work, since we expect absolute + // paths to be returned here. + // TODO(bauerb): http://crbug.com/259796, http://crbug.com/373477 +#if !defined(MOZ_ZUCCHINI) + base::ScopedAllowBlocking allow_blocking; +#endif // !defined(MOZ_ZUCCHINI) + return base::MakeAbsoluteFilePath(base::FilePath(executable_path)); +} + +bool GetModulePathForAddress(base::FilePath* path, const void* address) { + Dl_info info; + if (dladdr(address, &info) == 0) { + return false; + } + *path = base::FilePath(info.dli_fname); + return true; +} + +} // namespace base::apple::internal diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/base_paths_apple.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_apple.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/base_paths_apple.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_apple.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,22 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_BASE_PATHS_APPLE_H_ +#define BASE_BASE_PATHS_APPLE_H_ + +#include "base/files/file_path.h" + +namespace base::apple::internal { + +// Returns the absolute path to the executable. +base::FilePath GetExecutablePath(); + +// Returns true if the module for |address| is found. |path| will contain +// the path to the module. Note that |path| may not be absolute. +[[nodiscard]] bool GetModulePathForAddress(base::FilePath* path, + const void* address); + +} // namespace base::apple::internal + +#endif // BASE_BASE_PATHS_APPLE_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/base_paths_mac.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_mac.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/base_paths_mac.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_mac.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,25 @@ +// Copyright 2006-2008 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_BASE_PATHS_MAC_H_ +#define BASE_BASE_PATHS_MAC_H_ + +// This file declares Mac-specific path keys for the base module. +// These can be used with the PathService to access various special +// directories and files. + +namespace base { + +enum { + PATH_MAC_START = 200, + + DIR_APP_DATA, // ~/Library/Application Support + // Data for specific applications is stored in subdirectories. + + PATH_MAC_END +}; + +} // namespace base + +#endif // BASE_BASE_PATHS_MAC_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/base_paths_mac.mm firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_mac.mm --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/base_paths_mac.mm 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_mac.mm 2025-12-01 18:15:49.000000000 +0000 @@ -0,0 +1,82 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Defines base::PathProviderMac which replaces base::PathProviderPosix for Mac +// in base/path_service.cc. + +#import + +#include "base/apple/bundle_locations.h" +#include "base/base_paths.h" +#include "base/base_paths_apple.h" +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/mac/foundation_util.h" +#include "base/notreached.h" +#include "base/path_service.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace base { + +bool PathProviderMac(int key, base::FilePath* result) { + switch (key) { + case base::FILE_EXE: + *result = base::apple::internal::GetExecutablePath(); + return true; + case base::FILE_MODULE: + return base::apple::internal::GetModulePathForAddress( + result, reinterpret_cast(&base::PathProviderMac)); + case base::DIR_APP_DATA: { + bool success = + base::mac::GetUserDirectory(NSApplicationSupportDirectory, result); + return success; + } + case base::DIR_SRC_TEST_DATA_ROOT: + // Go through PathService to catch overrides. + if (!PathService::Get(base::FILE_EXE, result)) { + return false; + } + + // Start with the executable's directory. + *result = result->DirName(); + +#if !defined(MOZ_ZUCCHINI) + if (base::mac::AmIBundled()) { + // The bundled app executables (Chromium, TestShell, etc) live five + // levels down, eg: + // src/xcodebuild/{Debug|Release}/Chromium.app/Contents/MacOS/Chromium + *result = result->DirName().DirName().DirName().DirName().DirName(); + } else { + // Unit tests execute two levels deep from the source root, eg: + // src/xcodebuild/{Debug|Release}/base_unittests + *result = result->DirName().DirName(); + } +#else + // Firefox unit tests execute three levels deep from the source root, eg: + // ./obj-aarch64-apple-darwin24.5.0/dist/bin/zucchini-gtest + *result = result->DirName().DirName().DirName(); +#endif // !defined(MOZ_ZUCCHINI) + return true; +#if !defined(MOZ_ZUCCHINI) + case base::DIR_USER_DESKTOP: + return base::mac::GetUserDirectory(NSDesktopDirectory, result); + case base::DIR_ASSETS: + if (!base::mac::AmIBundled()) { + return PathService::Get(base::DIR_MODULE, result); + } + *result = base::apple::FrameworkBundlePath().Append( + FILE_PATH_LITERAL("Resources")); + return true; + case base::DIR_CACHE: + return base::mac::GetUserDirectory(NSCachesDirectory, result); +#endif // !defined(MOZ_ZUCCHINI) + default: + return false; + } +} + +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/base_paths_posix.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_posix.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/base_paths_posix.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_posix.cc 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,139 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Defines base::PathProviderPosix, default path provider on POSIX OSes that +// don't have their own base_paths_OS.cc implementation (i.e. all but Mac and +// Android). + +#include "base/base_paths.h" + +#include +#include + +#include +#include +#include + +#if !defined(MOZ_ZUCCHINI) +#include "base/environment.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/files/file_path.h" +#include "base/files/file_util.h" +#include "base/logging.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/nix/xdg_util.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/notreached.h" +#include "base/path_service.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/process/process_metrics.h" +#else +#define kProcSelfExe "/proc/self/exe" +#endif // !defined(MOZ_ZUCCHINI) +#include "build/build_config.h" + +#if BUILDFLAG(IS_FREEBSD) +#include +#include +#elif BUILDFLAG(IS_SOLARIS) || BUILDFLAG(IS_AIX) +#include +#endif + +namespace base { + +bool PathProviderPosix(int key, FilePath* result) { + switch (key) { + case FILE_EXE: + case FILE_MODULE: { // TODO(evanm): is this correct? +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) + FilePath bin_dir; + if (!ReadSymbolicLink(FilePath(kProcSelfExe), &bin_dir)) { + NOTREACHED() << "Unable to resolve " << kProcSelfExe << "."; + return false; + } + *result = bin_dir; + return true; +#elif BUILDFLAG(IS_FREEBSD) + int name[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 }; + char bin_dir[PATH_MAX + 1]; + size_t length = sizeof(bin_dir); + // Upon return, |length| is the number of bytes written to |bin_dir| + // including the string terminator. + int error = sysctl(name, 4, bin_dir, &length, NULL, 0); + if (error < 0 || length <= 1) { + NOTREACHED() << "Unable to resolve path."; + return false; + } + *result = FilePath(FilePath::StringType(bin_dir, length - 1)); + return true; +#elif BUILDFLAG(IS_SOLARIS) + char bin_dir[PATH_MAX + 1]; + if (realpath(getexecname(), bin_dir) == NULL) { + NOTREACHED() << "Unable to resolve " << getexecname() << "."; + return false; + } + *result = FilePath(bin_dir); + return true; +#elif BUILDFLAG(IS_OPENBSD) || BUILDFLAG(IS_AIX) + // There is currently no way to get the executable path on OpenBSD + char* cpath; + if ((cpath = getenv("CHROME_EXE_PATH")) != NULL) + *result = FilePath(cpath); + else + *result = FilePath("/usr/local/chrome/chrome"); + return true; +#endif + } + case DIR_SRC_TEST_DATA_ROOT: { +#if !defined(MOZ_ZUCCHINI) + // Allow passing this in the environment, for more flexibility in build + // tree configurations (sub-project builds, gyp --output_dir, etc.) + std::unique_ptr env(Environment::Create()); + std::string cr_source_root; + FilePath path; + if (env->GetVar("CR_SOURCE_ROOT", &cr_source_root)) { + path = FilePath(cr_source_root); + if (PathExists(path)) { + *result = path; + return true; + } + DLOG(WARNING) << "CR_SOURCE_ROOT is set, but it appears to not " + << "point to a directory."; + } + // On POSIX, unit tests execute two levels deep from the source root. + // For example: out/{Debug|Release}/net_unittest + if (PathService::Get(DIR_EXE, &path)) { + *result = path.DirName().DirName(); + return true; + } +#else + FilePath path; + // On POSIX, Firefox unit tests execute three levels deep from the source root. + // For example: ./obj-x86_64-pc-linux-gnu/dist/bin/zucchini-gtest + if (PathService::Get(DIR_EXE, &path)) { + *result = path.DirName().DirName().DirName(); + return true; + } +#endif // !defined(MOZ_ZUCCHINI) + DLOG(ERROR) << "Couldn't find your source root. " + << "Try running from your chromium/src directory."; + return false; + } +#if !defined(MOZ_ZUCCHINI) + case DIR_USER_DESKTOP: + *result = nix::GetXDGUserDirectory("DESKTOP", "Desktop"); + return true; + case DIR_CACHE: { + std::unique_ptr env(Environment::Create()); + FilePath cache_dir( + nix::GetXDGDirectory(env.get(), "XDG_CACHE_HOME", ".cache")); + *result = cache_dir; + return true; + } +#endif // !defined(MOZ_ZUCCHINI) + } + return false; +} + +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/base_paths_posix.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_posix.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/base_paths_posix.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_posix.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,28 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_BASE_PATHS_POSIX_H_ +#define BASE_BASE_PATHS_POSIX_H_ + +// This file declares windows-specific path keys for the base module. +// These can be used with the PathService to access various special +// directories and files. + +namespace base { + +enum { + PATH_POSIX_START = 400, + + DIR_CACHE, // Directory for the system users where applications store cache + // data in subdirectories. Note this is *not* where the browser + // cache lives, but the browser cache can be a subdirectory. This + // is $XDG_CACHE_HOME on Linux and + // ~/Library/Caches on Mac. + + PATH_POSIX_END +}; + +} // namespace base + +#endif // BASE_BASE_PATHS_POSIX_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/base_paths_win.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_win.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/base_paths_win.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_win.cc 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,236 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include + +#include +#include + +#include "base/base_paths.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/environment.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/files/file_path.h" +#if defined(MOZ_ZUCCHINI) +#include "base/notreached.h" +#endif // defined(MOZ_ZUCCHINI) +#include "base/path_service.h" +#include "base/strings/string_util.h" +#include "base/strings/utf_string_conversions.h" +#include "base/win/current_module.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/win/scoped_co_mem.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/win/windows_version.h" + +using base::FilePath; + +namespace base { + +bool PathProviderWin(int key, FilePath* result) { + // We need to go compute the value. It would be nice to support paths with + // names longer than MAX_PATH, but the system functions don't seem to be + // designed for it either, with the exception of GetTempPath (but other + // things will surely break if the temp path is too long, so we don't bother + // handling it. + wchar_t system_buffer[MAX_PATH]; + system_buffer[0] = 0; + + FilePath cur; + switch (key) { + case base::FILE_EXE: + if (GetModuleFileName(NULL, system_buffer, MAX_PATH) == 0) + return false; + cur = FilePath(system_buffer); + break; + case base::FILE_MODULE: { + // the resource containing module is assumed to be the one that + // this code lives in, whether that's a dll or exe + if (GetModuleFileName(CURRENT_MODULE(), system_buffer, MAX_PATH) == 0) + return false; + cur = FilePath(system_buffer); + break; + } + case base::DIR_WINDOWS: + GetWindowsDirectory(system_buffer, MAX_PATH); + cur = FilePath(system_buffer); + break; + case base::DIR_SYSTEM: + GetSystemDirectory(system_buffer, MAX_PATH); + cur = FilePath(system_buffer); + break; +#if !defined(MOZ_ZUCCHINI) + case base::DIR_PROGRAM_FILESX86: + if (win::OSInfo::GetArchitecture() != win::OSInfo::X86_ARCHITECTURE) { + if (FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAM_FILESX86, NULL, + SHGFP_TYPE_CURRENT, system_buffer))) + return false; + cur = FilePath(system_buffer); + break; + } + // Fall through to base::DIR_PROGRAM_FILES if we're on an X86 machine. + [[fallthrough]]; +#endif // !defined(MOZ_ZUCCHINI) + case base::DIR_PROGRAM_FILES: + if (FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, + SHGFP_TYPE_CURRENT, system_buffer))) + return false; + cur = FilePath(system_buffer); + break; +#if !defined(MOZ_ZUCCHINI) + case base::DIR_PROGRAM_FILES6432: +#if !defined(_WIN64) + if (base::win::OSInfo::GetInstance()->IsWowX86OnAMD64()) { + std::unique_ptr env(base::Environment::Create()); + std::string programfiles_w6432; + // 32-bit process running in WOW64 sets ProgramW6432 environment + // variable. See + // https://msdn.microsoft.com/library/windows/desktop/aa384274.aspx. + if (!env->GetVar("ProgramW6432", &programfiles_w6432)) + return false; + // GetVar returns UTF8 - convert back to Wide. + cur = FilePath(UTF8ToWide(programfiles_w6432)); + break; + } +#endif + if (FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAM_FILES, NULL, + SHGFP_TYPE_CURRENT, system_buffer))) + return false; + cur = FilePath(system_buffer); + break; +#endif // !defined(MOZ_ZUCCHINI) + case base::DIR_IE_INTERNET_CACHE: + if (FAILED(SHGetFolderPath(NULL, CSIDL_INTERNET_CACHE, NULL, + SHGFP_TYPE_CURRENT, system_buffer))) + return false; + cur = FilePath(system_buffer); + break; + case base::DIR_COMMON_START_MENU: + if (FAILED(SHGetFolderPath(NULL, CSIDL_COMMON_PROGRAMS, NULL, + SHGFP_TYPE_CURRENT, system_buffer))) + return false; + cur = FilePath(system_buffer); + break; + case base::DIR_START_MENU: + if (FAILED(SHGetFolderPath(NULL, CSIDL_PROGRAMS, NULL, SHGFP_TYPE_CURRENT, + system_buffer))) + return false; + cur = FilePath(system_buffer); + break; + case base::DIR_COMMON_STARTUP: + if (FAILED(SHGetFolderPath(nullptr, CSIDL_COMMON_STARTUP, nullptr, + SHGFP_TYPE_CURRENT, system_buffer))) + return false; + cur = FilePath(system_buffer); + break; + case base::DIR_USER_STARTUP: + if (FAILED(SHGetFolderPath(nullptr, CSIDL_STARTUP, nullptr, + SHGFP_TYPE_CURRENT, system_buffer))) + return false; + cur = FilePath(system_buffer); + break; + case base::DIR_ROAMING_APP_DATA: + if (FAILED(SHGetFolderPath(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT, + system_buffer))) + return false; + cur = FilePath(system_buffer); + break; + case base::DIR_COMMON_APP_DATA: + if (FAILED(SHGetFolderPath(NULL, CSIDL_COMMON_APPDATA, NULL, + SHGFP_TYPE_CURRENT, system_buffer))) + return false; + cur = FilePath(system_buffer); + break; + case base::DIR_LOCAL_APP_DATA: + if (FAILED(SHGetFolderPath(NULL, CSIDL_LOCAL_APPDATA, NULL, + SHGFP_TYPE_CURRENT, system_buffer))) + return false; + cur = FilePath(system_buffer); + break; + case base::DIR_SRC_TEST_DATA_ROOT: { + FilePath executableDir; + // On Windows, unit tests execute two levels deep from the source root. + // For example: chrome/{Debug|Release}/ui_tests.exe + PathService::Get(base::DIR_EXE, &executableDir); +#if !defined(MOZ_ZUCCHINI) + cur = executableDir.DirName().DirName(); +#else + // On Windows, for Firefox, we are thre levels deep. + // For example: ./obj-x86_64-pc-windows-msvc/dist/bin/zucchini-gtest.exe + cur = executableDir.DirName().DirName().DirName(); +#endif // !defined(MOZ_ZUCCHINI) + break; + } + case base::DIR_APP_SHORTCUTS: { +#if !defined(MOZ_ZUCCHINI) + base::win::ScopedCoMem path_buf; + if (FAILED(SHGetKnownFolderPath(FOLDERID_ApplicationShortcuts, 0, NULL, + &path_buf))) + return false; + + cur = FilePath(path_buf.get()); + break; +#else + NOTREACHED(); + return false; +#endif // !defined(MOZ_ZUCCHINI) + } +#if !defined(MOZ_ZUCCHINI) + case base::DIR_USER_DESKTOP: + if (FAILED(SHGetFolderPath(NULL, CSIDL_DESKTOPDIRECTORY, NULL, + SHGFP_TYPE_CURRENT, system_buffer))) { + return false; + } + cur = FilePath(system_buffer); + break; +#endif // !defined(MOZ_ZUCCHINI) + case base::DIR_COMMON_DESKTOP: + if (FAILED(SHGetFolderPath(NULL, CSIDL_COMMON_DESKTOPDIRECTORY, NULL, + SHGFP_TYPE_CURRENT, system_buffer))) { + return false; + } + cur = FilePath(system_buffer); + break; + case base::DIR_USER_QUICK_LAUNCH: + if (!PathService::Get(base::DIR_ROAMING_APP_DATA, &cur)) + return false; + // According to various sources, appending + // "Microsoft\Internet Explorer\Quick Launch" to %appdata% is the only + // reliable way to get the quick launch folder across all versions of + // Windows. + // http://stackoverflow.com/questions/76080/how-do-you-reliably-get-the-quick- + // http://www.microsoft.com/technet/scriptcenter/resources/qanda/sept05/hey0901.mspx + cur = cur.Append(FILE_PATH_LITERAL("Microsoft")) + .Append(FILE_PATH_LITERAL("Internet Explorer")) + .Append(FILE_PATH_LITERAL("Quick Launch")); + break; + case base::DIR_TASKBAR_PINS: { + if (!PathService::Get(base::DIR_USER_QUICK_LAUNCH, &cur)) + return false; + cur = cur.Append(FILE_PATH_LITERAL("User Pinned")) + .Append(FILE_PATH_LITERAL("TaskBar")); + break; + } + case base::DIR_IMPLICIT_APP_SHORTCUTS: + if (!PathService::Get(base::DIR_USER_QUICK_LAUNCH, &cur)) + return false; + cur = cur.Append(FILE_PATH_LITERAL("User Pinned")) + .Append(FILE_PATH_LITERAL("ImplicitAppShortcuts")); + break; + case base::DIR_WINDOWS_FONTS: + if (FAILED(SHGetFolderPath(NULL, CSIDL_FONTS, NULL, SHGFP_TYPE_CURRENT, + system_buffer))) { + return false; + } + cur = FilePath(system_buffer); + break; + default: + return false; + } + + *result = cur; + return true; +} + +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/base_paths_win.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_win.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/base_paths_win.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/base_paths_win.h 2025-12-01 18:15:47.000000000 +0000 @@ -0,0 +1,66 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_BASE_PATHS_WIN_H_ +#define BASE_BASE_PATHS_WIN_H_ + +// This file declares windows-specific path keys for the base module. +// These can be used with the PathService to access various special +// directories and files. + +namespace base { + +enum { + PATH_WIN_START = 100, + + DIR_WINDOWS, // Windows directory, usually "c:\windows" + DIR_SYSTEM, // Usually c:\windows\system32" + // 32-bit 32-bit on 64-bit 64-bit on 64-bit + // DIR_PROGRAM_FILES 1 2 1 + // DIR_PROGRAM_FILESX86 1 2 2 + // DIR_PROGRAM_FILES6432 1 1 1 + // 1 - C:\Program Files 2 - C:\Program Files (x86) + DIR_PROGRAM_FILES, // See table above. +#if !defined(MOZ_ZUCCHINI) + DIR_PROGRAM_FILESX86, // See table above. + DIR_PROGRAM_FILES6432, // See table above. +#endif // !defined(MOZ_ZUCCHINI) + + DIR_IE_INTERNET_CACHE, // Temporary Internet Files directory. + DIR_COMMON_START_MENU, // Usually "C:\ProgramData\Microsoft\Windows\ + // Start Menu\Programs" + DIR_START_MENU, // Usually "C:\Users\\AppData\Roaming\ + // Microsoft\Windows\Start Menu\Programs" + DIR_COMMON_STARTUP, // Usually "C:\ProgramData\Microsoft\Windows\ + // Start Menu\Programs\Startup" + DIR_USER_STARTUP, // Usually "C:\Users\\AppData\Roaming\ + // Microsoft\Windows\Start Menu\Programs\Startup" + DIR_ROAMING_APP_DATA, // Roaming Application Data directory under the + // user profile. + // Usually "C:\Users\\AppData\Roaming". + // Data for specific applications is stored in + // subdirectories. + DIR_LOCAL_APP_DATA, // Local Application Data directory under the + // user profile. + // Usually "C:\Users\\AppData\Local". + // Data for specific applications is stored in + // subdirectories. + DIR_COMMON_APP_DATA, // Usually "C:\ProgramData". Data for specific + // applications is stored in subdirectories. + DIR_APP_SHORTCUTS, // Where tiles on the start screen are stored, + // only for Windows 8. Maps to "Local\AppData\ + // Microsoft\Windows\Application Shortcuts\". + DIR_COMMON_DESKTOP, // Directory for the common desktop (visible + // on all user's Desktop). + DIR_USER_QUICK_LAUNCH, // Directory for the quick launch shortcuts. + DIR_TASKBAR_PINS, // Directory for the shortcuts pinned to taskbar. + DIR_IMPLICIT_APP_SHORTCUTS, // The implicit user pinned shortcut directory. + DIR_WINDOWS_FONTS, // Usually C:\Windows\Fonts. + + PATH_WIN_END +}; + +} // namespace base + +#endif // BASE_BASE_PATHS_WIN_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/bit_cast.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/bit_cast.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/bit_cast.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/bit_cast.h 2025-12-01 18:15:47.000000000 +0000 @@ -0,0 +1,48 @@ +// Copyright 2016 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_BIT_CAST_H_ +#define BASE_BIT_CAST_H_ + +#include + +#include "base/compiler_specific.h" + +#if !HAS_BUILTIN(__builtin_bit_cast) +#include // memcpy +#endif + +namespace base { + +// This is C++20's std::bit_cast<>(). It morally does what +// `*reinterpret_cast(&source)` does, but the cast/deref pair is +// undefined behavior, while bit_cast<>() isn't. +template +#if HAS_BUILTIN(__builtin_bit_cast) +constexpr +#else +inline +#endif + Dest + bit_cast(const Source& source) { +#if HAS_BUILTIN(__builtin_bit_cast) + // TODO(thakis): Keep only this codepath once nacl is gone or updated. + return __builtin_bit_cast(Dest, source); +#else + static_assert(sizeof(Dest) == sizeof(Source), + "bit_cast requires source and destination to be the same size"); + static_assert(std::is_trivially_copyable_v, + "bit_cast requires the destination type to be copyable"); + static_assert(std::is_trivially_copyable_v, + "bit_cast requires the source type to be copyable"); + + Dest dest; + memcpy(&dest, &source, sizeof(dest)); + return dest; +#endif +} + +} // namespace base + +#endif // BASE_BIT_CAST_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/bits.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/bits.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/bits.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/bits.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,142 @@ +// Copyright 2013 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file defines some bit utilities. + +#ifndef BASE_BITS_H_ +#define BASE_BITS_H_ + +#include +#include + +#include + +#include "base/check.h" +#include "base/compiler_specific.h" +#include "build/build_config.h" + +namespace base { +namespace bits { + +// Returns true iff |value| is a power of 2. +// +// TODO(pkasting): When C++20 is available, replace with std::has_single_bit(). +template ::value>> +constexpr bool IsPowerOfTwo(T value) { + // From "Hacker's Delight": Section 2.1 Manipulating Rightmost Bits. + // + // Only positive integers with a single bit set are powers of two. If only one + // bit is set in x (e.g. 0b00000100000000) then |x-1| will have that bit set + // to zero and all bits to its right set to 1 (e.g. 0b00000011111111). Hence + // |x & (x-1)| is 0 iff x is a power of two. + return value > 0 && (value & (value - 1)) == 0; +} + +// Round down |size| to a multiple of alignment, which must be a power of two. +template >> +constexpr T AlignDown(T size, T alignment) { + DCHECK(IsPowerOfTwo(alignment)); + return size & ~(alignment - 1); +} + +// Move |ptr| back to the previous multiple of alignment, which must be a power +// of two. Defined for types where sizeof(T) is one byte. +template ::type> +inline T* AlignDown(T* ptr, uintptr_t alignment) { + return reinterpret_cast( + AlignDown(reinterpret_cast(ptr), alignment)); +} + +// Round up |size| to a multiple of alignment, which must be a power of two. +template >> +constexpr T AlignUp(T size, T alignment) { + DCHECK(IsPowerOfTwo(alignment)); + return (size + alignment - 1) & ~(alignment - 1); +} + +// Advance |ptr| to the next multiple of alignment, which must be a power of +// two. Defined for types where sizeof(T) is one byte. +template ::type> +inline T* AlignUp(T* ptr, uintptr_t alignment) { + return reinterpret_cast( + AlignUp(reinterpret_cast(ptr), alignment)); +} + +// CountLeadingZeroBits(value) returns the number of zero bits following the +// most significant 1 bit in |value| if |value| is non-zero, otherwise it +// returns {sizeof(T) * 8}. +// Example: 00100010 -> 2 +// +// CountTrailingZeroBits(value) returns the number of zero bits preceding the +// least significant 1 bit in |value| if |value| is non-zero, otherwise it +// returns {sizeof(T) * 8}. +// Example: 00100010 -> 1 +// +// C does not have an operator to do this, but fortunately the various +// compilers have built-ins that map to fast underlying processor instructions. +// +// TODO(pkasting): When C++20 is available, replace with std::countl_zero() and +// similar. + +// __builtin_clz has undefined behaviour for an input of 0, even though there's +// clearly a return value that makes sense, and even though some processor clz +// instructions have defined behaviour for 0. We could drop to raw __asm__ to +// do better, but we'll avoid doing that unless we see proof that we need to. +template +ALWAYS_INLINE constexpr + typename std::enable_if::value && sizeof(T) <= 8, + int>::type + CountLeadingZeroBits(T value) { + static_assert(bits > 0, "invalid instantiation"); + return LIKELY(value) + ? bits == 64 + ? __builtin_clzll(static_cast(value)) + : __builtin_clz(static_cast(value)) - (32 - bits) + : bits; +} + +template +ALWAYS_INLINE constexpr + typename std::enable_if::value && sizeof(T) <= 8, + int>::type + CountTrailingZeroBits(T value) { + return LIKELY(value) ? bits == 64 + ? __builtin_ctzll(static_cast(value)) + : __builtin_ctz(static_cast(value)) + : bits; +} + +// Returns the integer i such as 2^i <= n < 2^(i+1). +// +// There is a common `BitLength` function, which returns the number of bits +// required to represent a value. Rather than implement that function, +// use `Log2Floor` and add 1 to the result. +// +// TODO(pkasting): When C++20 is available, replace with std::bit_xxx(). +constexpr int Log2Floor(uint32_t n) { + return 31 - CountLeadingZeroBits(n); +} + +// Returns the integer i such as 2^(i-1) < n <= 2^i. +constexpr int Log2Ceiling(uint32_t n) { + // When n == 0, we want the function to return -1. + // When n == 0, (n - 1) will underflow to 0xFFFFFFFF, which is + // why the statement below starts with (n ? 32 : -1). + return (n ? 32 : -1) - CountLeadingZeroBits(n - 1); +} + +// Returns a value of type T with a single bit set in the left-most position. +// Can be used instead of manually shifting a 1 to the left. +template +constexpr T LeftmostBit() { + static_assert(std::is_integral::value, + "This function can only be used with integral types."); + T one(1u); + return one << (8 * sizeof(T) - 1); +} + +} // namespace bits +} // namespace base + +#endif // BASE_BITS_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/check.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/check.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/check.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/check.cc 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,347 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/check.h" + +#include "base/check_op.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/debug/alias.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/debug/debugging_buildflags.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/debug/dump_without_crashing.h" +#include "base/feature_list.h" +#include "base/features.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/logging.h" +#include "base/thread_annotations.h" +#include "build/build_config.h" + +#if !defined(MOZ_ZUCCHINI) +#if !BUILDFLAG(IS_NACL) +#include "base/debug/crash_logging.h" +#endif // !BUILDFLAG(IS_NACL) +#endif // !defined(MOZ_ZUCCHINI) + +namespace logging { + +namespace { + +#if !defined(MOZ_ZUCCHINI) +void DumpWithoutCrashing(LogMessage* log_message, + const base::Location& location) { + // Copy the LogMessage message to stack memory to make sure it can be + // recovered in crash dumps. This is easier to recover in minidumps than crash + // keys during local debugging. + DEBUG_ALIAS_FOR_CSTR(log_message_str, log_message->BuildCrashString().c_str(), + 1024); + + // Report from the same location at most once every 30 days (unless the + // process has died). This attempts to prevent us from flooding ourselves with + // repeat reports for the same bug. + base::debug::DumpWithoutCrashing(location, base::Days(30)); +} +#endif // !defined(MOZ_ZUCCHINI) + +void NotReachedDumpWithoutCrashing(LogMessage* log_message, + const base::Location& location) { +#if !defined(MOZ_ZUCCHINI) +#if !BUILDFLAG(IS_NACL) + SCOPED_CRASH_KEY_STRING1024("Logging", "NOTREACHED_MESSAGE", + log_message->BuildCrashString()); +#endif // !BUILDFLAG(IS_NACL) + DumpWithoutCrashing(log_message, location); +#endif // !defined(MOZ_ZUCCHINI) +} + +void DCheckDumpWithoutCrashing(LogMessage* log_message, + const base::Location& location) { +#if !defined(MOZ_ZUCCHINI) +#if !BUILDFLAG(IS_NACL) + SCOPED_CRASH_KEY_STRING1024("Logging", "DCHECK_MESSAGE", + log_message->BuildCrashString()); +#endif // !BUILDFLAG(IS_NACL) + DumpWithoutCrashing(log_message, location); +#endif // !defined(MOZ_ZUCCHINI) +} + +void DumpWillBeCheckDumpWithoutCrashing(LogMessage* log_message, + const base::Location& location) { +#if !defined(MOZ_ZUCCHINI) +#if !BUILDFLAG(IS_NACL) + SCOPED_CRASH_KEY_STRING1024("Logging", "DUMP_WILL_BE_CHECK_MESSAGE", + log_message->BuildCrashString()); +#endif // !BUILDFLAG(IS_NACL) + DumpWithoutCrashing(log_message, location); +#endif // !defined(MOZ_ZUCCHINI) +} + +class NotReachedLogMessage : public LogMessage { + public: + NotReachedLogMessage(const base::Location& location, LogSeverity severity) + : LogMessage(location.file_name(), location.line_number(), severity), + location_(location) {} + ~NotReachedLogMessage() override { + if (severity() != logging::LOGGING_FATAL) { + NotReachedDumpWithoutCrashing(this, location_); + } + } + + private: + const base::Location location_; +}; + +class DCheckLogMessage : public LogMessage { + public: + using LogMessage::LogMessage; + DCheckLogMessage(const base::Location& location, LogSeverity severity) + : LogMessage(location.file_name(), location.line_number(), severity), + location_(location) {} + ~DCheckLogMessage() override { + if (severity() != logging::LOGGING_FATAL) { + DCheckDumpWithoutCrashing(this, location_); + } + } + + private: + const base::Location location_; +}; + +class DumpWillBeCheckLogMessage : public LogMessage { + public: + using LogMessage::LogMessage; + DumpWillBeCheckLogMessage(const base::Location& location, + LogSeverity severity) + : LogMessage(location.file_name(), location.line_number(), severity), + location_(location) {} + ~DumpWillBeCheckLogMessage() override { + if (severity() != logging::LOGGING_FATAL) { + DumpWillBeCheckDumpWithoutCrashing(this, location_); + } + } + + private: + const base::Location location_; +}; + +#if BUILDFLAG(IS_WIN) +class DCheckWin32ErrorLogMessage : public Win32ErrorLogMessage { + public: + DCheckWin32ErrorLogMessage(const base::Location& location, + LogSeverity severity, + SystemErrorCode err) + : Win32ErrorLogMessage(location.file_name(), + location.line_number(), + severity, + err), + location_(location) {} + ~DCheckWin32ErrorLogMessage() override { + if (severity() != logging::LOGGING_FATAL) { + DCheckDumpWithoutCrashing(this, location_); + } + } + + private: + const base::Location location_; +}; +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +class DCheckErrnoLogMessage : public ErrnoLogMessage { + public: + DCheckErrnoLogMessage(const base::Location& location, + LogSeverity severity, + SystemErrorCode err) + : ErrnoLogMessage(location.file_name(), + location.line_number(), + severity, + err), + location_(location) {} + ~DCheckErrnoLogMessage() override { + if (severity() != logging::LOGGING_FATAL) { + DCheckDumpWithoutCrashing(this, location_); + } + } + + private: + const base::Location location_; +}; +#endif // BUILDFLAG(IS_WIN) + +} // namespace + +CheckError CheckError::Check(const char* condition, + const base::Location& location) { + auto* const log_message = new LogMessage( + location.file_name(), location.line_number(), LOGGING_FATAL); + log_message->stream() << "Check failed: " << condition << ". "; + return CheckError(log_message); +} + +CheckError CheckError::CheckOp(char* log_message_str, + const base::Location& location) { + auto* const log_message = new LogMessage( + location.file_name(), location.line_number(), LOGGING_FATAL); + log_message->stream() << log_message_str; + free(log_message_str); + return CheckError(log_message); +} + +CheckError CheckError::DCheck(const char* condition, + const base::Location& location) { + auto* const log_message = new DCheckLogMessage(location, LOGGING_DCHECK); + log_message->stream() << "Check failed: " << condition << ". "; + return CheckError(log_message); +} + +CheckError CheckError::DCheckOp(char* log_message_str, + const base::Location& location) { + auto* const log_message = new DCheckLogMessage( + location.file_name(), location.line_number(), LOGGING_DCHECK); + log_message->stream() << log_message_str; + free(log_message_str); + return CheckError(log_message); +} + +CheckError CheckError::DumpWillBeCheck(const char* condition, + const base::Location& location) { + auto* const log_message = new DumpWillBeCheckLogMessage( + location, DCHECK_IS_ON() ? LOGGING_DCHECK : LOGGING_ERROR); + log_message->stream() << "Check failed: " << condition << ". "; + return CheckError(log_message); +} + +CheckError CheckError::DumpWillBeCheckOp(char* log_message_str, + const base::Location& location) { + auto* const log_message = new DumpWillBeCheckLogMessage( + location, DCHECK_IS_ON() ? LOGGING_DCHECK : LOGGING_ERROR); + log_message->stream() << log_message_str; + free(log_message_str); + return CheckError(log_message); +} + +CheckError CheckError::PCheck(const char* condition, + const base::Location& location) { + SystemErrorCode err_code = logging::GetLastSystemErrorCode(); +#if BUILDFLAG(IS_WIN) + auto* const log_message = new Win32ErrorLogMessage( + location.file_name(), location.line_number(), LOGGING_FATAL, err_code); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + auto* const log_message = new ErrnoLogMessage( + location.file_name(), location.line_number(), LOGGING_FATAL, err_code); +#endif + log_message->stream() << "Check failed: " << condition << ". "; + return CheckError(log_message); +} + +CheckError CheckError::PCheck(const base::Location& location) { + return PCheck("", location); +} + +CheckError CheckError::DPCheck(const char* condition, + const base::Location& location) { + SystemErrorCode err_code = logging::GetLastSystemErrorCode(); +#if BUILDFLAG(IS_WIN) + auto* const log_message = + new DCheckWin32ErrorLogMessage(location, LOGGING_DCHECK, err_code); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + auto* const log_message = + new DCheckErrnoLogMessage(location, LOGGING_DCHECK, err_code); +#endif + log_message->stream() << "Check failed: " << condition << ". "; + return CheckError(log_message); +} + +CheckError CheckError::DumpWillBeNotReachedNoreturn( + const base::Location& location) { + auto* const log_message = new DumpWillBeCheckLogMessage( + location, DCHECK_IS_ON() ? LOGGING_DCHECK : LOGGING_ERROR); + log_message->stream() << "NOTREACHED hit. "; + return CheckError(log_message); +} + +CheckError CheckError::NotImplemented(const char* function, + const base::Location& location) { + auto* const log_message = new LogMessage( + location.file_name(), location.line_number(), LOGGING_ERROR); + log_message->stream() << "Not implemented reached in " << function; + return CheckError(log_message); +} + +std::ostream& CheckError::stream() { + return log_message_->stream(); +} + +CheckError::~CheckError() { + // TODO(crbug.com/1409729): Consider splitting out CHECK from DCHECK so that + // the destructor can be marked [[noreturn]] and we don't need to check + // severity in the destructor. + const bool is_fatal = log_message_->severity() == LOGGING_FATAL; + // Note: This function ends up in crash stack traces. If its full name + // changes, the crash server's magic signature logic needs to be updated. + // See cl/306632920. + delete log_message_; + + // Make sure we crash even if LOG(FATAL) has been overridden. + // TODO(crbug.com/1409729): Remove severity checking in the destructor when + // LOG(FATAL) is [[noreturn]] and can't be overridden. + if (is_fatal) { + base::ImmediateCrash(); + } +} + +NotReachedError NotReachedError::NotReached(const base::Location& location) { + const LogSeverity severity = []() { + // NOTREACHED() instances may be hit before base::FeatureList is enabled. +#if !defined(MOZ_ZUCCHINI) + if (base::FeatureList::GetInstance() && + base::FeatureList::IsEnabled(base::features::kNotReachedIsFatal)) { + return LOGGING_FATAL; + } +#endif // !defined(MOZ_ZUCCHINI) + return DCHECK_IS_ON() ? LOGGING_DCHECK : LOGGING_ERROR; + }(); + auto* const log_message = new NotReachedLogMessage(location, severity); + + // TODO(pbos): Consider a better message for NotReached(), this is here to + // match existing behavior + test expectations. + log_message->stream() << "Check failed: false. "; + return NotReachedError(log_message); +} + +void NotReachedError::TriggerNotReached() { + // This triggers a NOTREACHED() error as the returned NotReachedError goes out + // of scope. + NotReached() + << "NOTREACHED log messages are omitted in official builds. Sorry!"; +} + +NotReachedError::~NotReachedError() = default; + +NotReachedNoreturnError::NotReachedNoreturnError(const base::Location& location) + : CheckError([location]() { + auto* const log_message = new LogMessage( + location.file_name(), location.line_number(), LOGGING_FATAL); + log_message->stream() << "NOTREACHED hit. "; + return log_message; + }()) {} + +// Note: This function ends up in crash stack traces. If its full name changes, +// the crash server's magic signature logic needs to be updated. See +// cl/306632920. +NotReachedNoreturnError::~NotReachedNoreturnError() { + delete log_message_; + + // Make sure we die if we haven't. + // TODO(crbug.com/1409729): Replace this with NOTREACHED_NORETURN() once + // LOG(FATAL) is [[noreturn]]. + base::ImmediateCrash(); +} + +#if !defined(MOZ_ZUCCHINI) +void RawCheckFailure(const char* message) { + RawLog(LOGGING_FATAL, message); + __builtin_unreachable(); +} +#endif // !defined(MOZ_ZUCCHINI) + +} // namespace logging diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/check.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/check.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/check.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/check.h 2025-12-01 18:15:47.000000000 +0000 @@ -0,0 +1,279 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CHECK_H_ +#define BASE_CHECK_H_ + +#include + +#include "base/base_export.h" +#include "base/compiler_specific.h" +#include "base/dcheck_is_on.h" +#include "base/debug/debugging_buildflags.h" +#include "base/immediate_crash.h" +#include "base/location.h" + +// This header defines the CHECK, DCHECK, and DPCHECK macros. +// +// CHECK dies with a fatal error if its condition is not true. It is not +// controlled by NDEBUG, so the check will be executed regardless of compilation +// mode. +// +// DCHECK, the "debug mode" check, is enabled depending on NDEBUG and +// DCHECK_ALWAYS_ON, and its severity depends on DCHECK_IS_CONFIGURABLE. +// +// (D)PCHECK is like (D)CHECK, but includes the system error code (c.f. +// perror(3)). +// +// Additional information can be streamed to these macros and will be included +// in the log output if the condition doesn't hold (you may need to include +// ): +// +// CHECK(condition) << "Additional info."; +// +// The condition is evaluated exactly once. Even in build modes where e.g. +// DCHECK is disabled, the condition and any stream arguments are still +// referenced to avoid warnings about unused variables and functions. +// +// For the (D)CHECK_EQ, etc. macros, see base/check_op.h. However, that header +// is *significantly* larger than check.h, so try to avoid including it in +// header files. + +namespace logging { + +// Class used to explicitly ignore an ostream, and optionally a boolean value. +class VoidifyStream { + public: + VoidifyStream() = default; + explicit VoidifyStream(bool) {} + + // This operator has lower precedence than << but higher than ?: + void operator&(std::ostream&) {} +}; + +// Macro which uses but does not evaluate expr and any stream parameters. +#define EAT_CHECK_STREAM_PARAMS(expr) \ + true ? (void)0 \ + : ::logging::VoidifyStream(expr) & (*::logging::g_swallow_stream) +BASE_EXPORT extern std::ostream* g_swallow_stream; + +class LogMessage; + +// Class used for raising a check error upon destruction. +class BASE_EXPORT CheckError { + public: + static CheckError Check( + const char* condition, + const base::Location& location = base::Location::Current()); + // Takes ownership over (free()s after using) `log_message_str`, for use with + // CHECK_op macros. + static CheckError CheckOp( + char* log_message_str, + const base::Location& location = base::Location::Current()); + + static CheckError DCheck( + const char* condition, + const base::Location& location = base::Location::Current()); + // Takes ownership over (free()s after using) `log_message_str`, for use with + // DCHECK_op macros. + static CheckError DCheckOp( + char* log_message_str, + const base::Location& location = base::Location::Current()); + + static CheckError DumpWillBeCheck( + const char* condition, + const base::Location& location = base::Location::Current()); + // Takes ownership over (free()s after using) `log_message_str`, for use with + // DUMP_WILL_BE_CHECK_op macros. + static CheckError DumpWillBeCheckOp( + char* log_message_str, + const base::Location& location = base::Location::Current()); + + static CheckError PCheck( + const char* condition, + const base::Location& location = base::Location::Current()); + static CheckError PCheck( + const base::Location& location = base::Location::Current()); + + static CheckError DPCheck( + const char* condition, + const base::Location& location = base::Location::Current()); + + static CheckError DumpWillBeNotReachedNoreturn( + const base::Location& location = base::Location::Current()); + + static CheckError NotImplemented( + const char* function, + const base::Location& location = base::Location::Current()); + + // Stream for adding optional details to the error message. + std::ostream& stream(); + + // Try really hard to get the call site and callee as separate stack frames in + // crash reports. + NOMERGE NOINLINE NOT_TAIL_CALLED ~CheckError(); + + CheckError(const CheckError&) = delete; + CheckError& operator=(const CheckError&) = delete; + + template + std::ostream& operator<<(T&& streamed_type) { + return stream() << streamed_type; + } + + protected: + // Takes ownership of `log_message`. + explicit CheckError(LogMessage* log_message) : log_message_(log_message) {} + + LogMessage* const log_message_; +}; + +class BASE_EXPORT NotReachedError : public CheckError { + public: + static NotReachedError NotReached( + const base::Location& location = base::Location::Current()); + + // Used to trigger a NOTREACHED() without providing file or line while also + // discarding log-stream arguments. See base/notreached.h. + NOMERGE NOINLINE NOT_TAIL_CALLED static void TriggerNotReached(); + + // TODO(crbug.com/851128): Mark [[noreturn]] once this is CHECK-fatal on all + // builds. + NOMERGE NOINLINE NOT_TAIL_CALLED ~NotReachedError(); + + private: + using CheckError::CheckError; +}; + +// TODO(crbug.com/851128): This should take the name of the above class once all +// callers of NOTREACHED() have migrated to the CHECK-fatal version. +class BASE_EXPORT NotReachedNoreturnError : public CheckError { + public: + explicit NotReachedNoreturnError( + const base::Location& location = base::Location::Current()); + + [[noreturn]] NOMERGE NOINLINE NOT_TAIL_CALLED ~NotReachedNoreturnError(); +}; + +// A helper macro for checks that log to streams that makes it easier for the +// compiler to identify and warn about dead code, e.g.: +// +// return 2; +// NOTREACHED(); +// +// The 'switch' is used to prevent the 'else' from being ambiguous when the +// macro is used in an 'if' clause such as: +// if (a == 1) +// CHECK(Foo()); +// +// TODO(crbug.com/1380930): Remove the const bool when the blink-gc plugin has +// been updated to accept `if (LIKELY(!field_))` as well as `if (!field_)`. +#define LOGGING_CHECK_FUNCTION_IMPL(check_stream, condition) \ + switch (0) \ + case 0: \ + default: \ + /* Hint to the optimizer that `condition` is unlikely to be false. */ \ + /* The optimizer can use this as a hint to place the failure path */ \ + /* out-of-line, e.g. at the tail of the function. */ \ + if (const bool probably_true = static_cast(condition); \ + LIKELY(ANALYZER_ASSUME_TRUE(probably_true))) \ + ; \ + else \ + (check_stream) + +#if defined(OFFICIAL_BUILD) && !defined(NDEBUG) +#error "Debug builds are not expected to be optimized as official builds." +#endif // defined(OFFICIAL_BUILD) && !defined(NDEBUG) + +#if defined(OFFICIAL_BUILD) && !DCHECK_IS_ON() +// Note that this uses IMMEDIATE_CRASH_ALWAYS_INLINE to force-inline in debug +// mode as well. See LoggingTest.CheckCausesDistinctBreakpoints. +[[noreturn]] IMMEDIATE_CRASH_ALWAYS_INLINE void CheckFailure() { + base::ImmediateCrash(); +} + +// Discard log strings to reduce code bloat. +// +// This is not calling BreakDebugger since this is called frequently, and +// calling an out-of-line function instead of a noreturn inline macro prevents +// compiler optimizations. Unlike the other check macros, this one does not use +// LOGGING_CHECK_FUNCTION_IMPL(), since it is incompatible with +// EAT_CHECK_STREAM_PARAMETERS(). +#define CHECK(condition) \ + UNLIKELY(!(condition)) ? logging::CheckFailure() : EAT_CHECK_STREAM_PARAMS() + +#define CHECK_WILL_STREAM() false + +// Strip the conditional string from official builds. +#define PCHECK(condition) \ + LOGGING_CHECK_FUNCTION_IMPL(::logging::CheckError::PCheck(), condition) + +#else + +#define CHECK_WILL_STREAM() true + +#define CHECK(condition) \ + LOGGING_CHECK_FUNCTION_IMPL(::logging::CheckError::Check(#condition), \ + condition) + +#define PCHECK(condition) \ + LOGGING_CHECK_FUNCTION_IMPL(::logging::CheckError::PCheck(#condition), \ + condition) + +#endif + +#if DCHECK_IS_ON() + +#define DCHECK(condition) \ + LOGGING_CHECK_FUNCTION_IMPL(::logging::CheckError::DCheck(#condition), \ + condition) +#define DPCHECK(condition) \ + LOGGING_CHECK_FUNCTION_IMPL(::logging::CheckError::DPCheck(#condition), \ + condition) + +#else + +#define DCHECK(condition) EAT_CHECK_STREAM_PARAMS(!(condition)) +#define DPCHECK(condition) EAT_CHECK_STREAM_PARAMS(!(condition)) + +#endif // DCHECK_IS_ON() + +// The DUMP_WILL_BE_CHECK() macro provides a convenient way to non-fatally dump +// in official builds if a condition is false. This is used to more cautiously +// roll out a new CHECK() (or upgrade a DCHECK) where the caller isn't entirely +// sure that something holds true in practice (but asserts that it should). This +// is especially useful for platforms that have a low pre-stable population and +// code areas that are rarely exercised. +// +// On DCHECK builds this macro matches DCHECK behavior. +// +// This macro isn't optimized (preserves filename, line number and log messages +// in official builds), as they are expected to be in product temporarily. When +// using this macro, leave a TODO(crbug.com/nnnn) entry referring to a bug +// related to its rollout. Then put a NextAction on the bug to come back and +// clean this up (replace with a CHECK). A DUMP_WILL_BE_CHECK() that's been left +// untouched for a long time without bug updates suggests that issues that +// would've prevented enabling this CHECK have either not been discovered or +// have been resolved. +// +// Using this macro is preferred over direct base::debug::DumpWithoutCrashing() +// invocations as it communicates intent to eventually end up as a CHECK. It +// also preserves the log message so setting crash keys to get additional debug +// info isn't required as often. +#define DUMP_WILL_BE_CHECK(condition) \ + LOGGING_CHECK_FUNCTION_IMPL( \ + ::logging::CheckError::DumpWillBeCheck(#condition), condition) + +// Async signal safe checking mechanism. +[[noreturn]] BASE_EXPORT void RawCheckFailure(const char* message); +#define RAW_CHECK(condition) \ + do { \ + if (UNLIKELY(!(condition))) { \ + ::logging::RawCheckFailure("Check failed: " #condition "\n"); \ + } \ + } while (0) + +} // namespace logging + +#endif // BASE_CHECK_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/check_op.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/check_op.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/check_op.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/check_op.cc 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,101 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/check_op.h" + +#include + +#include +#include +#include + +#include "base/logging.h" + +namespace logging { + +char* CheckOpValueStr(int v) { + char buf[50]; + snprintf(buf, sizeof(buf), "%d", v); + return strdup(buf); +} + +char* CheckOpValueStr(unsigned v) { + char buf[50]; + snprintf(buf, sizeof(buf), "%u", v); + return strdup(buf); +} + +char* CheckOpValueStr(long v) { + char buf[50]; + snprintf(buf, sizeof(buf), "%ld", v); + return strdup(buf); +} + +char* CheckOpValueStr(unsigned long v) { + char buf[50]; + snprintf(buf, sizeof(buf), "%lu", v); + return strdup(buf); +} + +char* CheckOpValueStr(long long v) { + char buf[50]; + snprintf(buf, sizeof(buf), "%lld", v); + return strdup(buf); +} + +char* CheckOpValueStr(unsigned long long v) { + char buf[50]; + snprintf(buf, sizeof(buf), "%llu", v); + return strdup(buf); +} + +char* CheckOpValueStr(const void* v) { + char buf[50]; + snprintf(buf, sizeof(buf), "%p", v); + return strdup(buf); +} + +char* CheckOpValueStr(std::nullptr_t v) { + return strdup("nullptr"); +} + +char* CheckOpValueStr(const std::string& v) { + return strdup(v.c_str()); +} + +char* CheckOpValueStr(std::string_view v) { + // Ideally this would be `strndup`, but `strndup` is not portable. + char* ret = static_cast(malloc(v.size() + 1)); + if (ret) { + std::copy(v.begin(), v.end(), ret); + ret[v.size()] = 0; + } + return ret; +} + +char* CheckOpValueStr(double v) { + char buf[50]; + snprintf(buf, sizeof(buf), "%.6lf", v); + return strdup(buf); +} + +char* StreamValToStr(const void* v, + void (*stream_func)(std::ostream&, const void*)) { + std::stringstream ss; + stream_func(ss, v); + return strdup(ss.str().c_str()); +} + +char* CreateCheckOpLogMessageString(const char* expr_str, + char* v1_str, + char* v2_str) { + std::stringstream ss; + ss << "Check failed: " << expr_str << " (" << v1_str << " vs. " << v2_str + << ")"; + free(v1_str); + free(v2_str); + return strdup(ss.str().c_str()); +} + +} // namespace logging diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/check_op.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/check_op.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/check_op.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/check_op.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,254 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CHECK_OP_H_ +#define BASE_CHECK_OP_H_ + +#include +#include +#include +#include + +#include "base/base_export.h" +#include "base/check.h" +#include "base/dcheck_is_on.h" +#include "base/debug/debugging_buildflags.h" +#include "base/memory/raw_ptr_exclusion.h" +#include "base/strings/to_string.h" +#include "base/types/supports_ostream_operator.h" + +// This header defines the (DP)CHECK_EQ etc. macros. +// +// (DP)CHECK_EQ(x, y) is similar to (DP)CHECK(x == y) but will also log the +// values of x and y if the condition doesn't hold. This works for basic types +// and types with an operator<< or .ToString() method. +// +// The operands are evaluated exactly once, and even in build modes where e.g. +// DCHECK is disabled, the operands and their stringification methods are still +// referenced to avoid warnings about unused variables or functions. +// +// To support the stringification of the check operands, this header is +// *significantly* larger than base/check.h, so it should be avoided in common +// headers. +// +// This header also provides the (DP)CHECK macros (by including check.h), so if +// you use e.g. both CHECK_EQ and CHECK, including this header is enough. If you +// only use CHECK however, please include the smaller check.h instead. + +namespace logging { + +// Functions for turning check operand values into NUL-terminated C strings. +// Caller takes ownership of the result and must release it with `free`. +// This would normally be defined by , but this header tries to avoid +// including to reduce compile-time. See https://crrev.com/c/2128112. +BASE_EXPORT char* CheckOpValueStr(int v); +BASE_EXPORT char* CheckOpValueStr(unsigned v); +BASE_EXPORT char* CheckOpValueStr(long v); +BASE_EXPORT char* CheckOpValueStr(unsigned long v); +BASE_EXPORT char* CheckOpValueStr(long long v); +BASE_EXPORT char* CheckOpValueStr(unsigned long long v); +BASE_EXPORT char* CheckOpValueStr(const void* v); +BASE_EXPORT char* CheckOpValueStr(std::nullptr_t v); +BASE_EXPORT char* CheckOpValueStr(double v); +// Although the standard defines operator<< for std::string and std::string_view +// in their respective headers, libc++ requires for them. See +// https://github.com/llvm/llvm-project/issues/61070. So we define non- +// versions here too. +BASE_EXPORT char* CheckOpValueStr(const std::string& v); +BASE_EXPORT char* CheckOpValueStr(std::string_view v); + +// Convert a streamable value to string out-of-line to avoid . +BASE_EXPORT char* StreamValToStr(const void* v, + void (*stream_func)(std::ostream&, + const void*)); + +#ifdef __has_builtin +#define SUPPORTS_BUILTIN_ADDRESSOF (__has_builtin(__builtin_addressof)) +#else +#define SUPPORTS_BUILTIN_ADDRESSOF 0 +#endif + +template +inline typename std::enable_if< + base::internal::SupportsOstreamOperator::value && + !std::is_function::type>::value, + char*>::type +CheckOpValueStr(const T& v) { + auto f = [](std::ostream& s, const void* p) { + s << *reinterpret_cast(p); + }; + + // operator& might be overloaded, so do the std::addressof dance. + // __builtin_addressof is preferred since it also handles Obj-C ARC pointers. + // Some casting is still needed, because T might be volatile. +#if SUPPORTS_BUILTIN_ADDRESSOF + const void* vp = const_cast( + reinterpret_cast(__builtin_addressof(v))); +#else + const void* vp = reinterpret_cast( + const_cast(&reinterpret_cast(v))); +#endif + return StreamValToStr(vp, f); +} + +#undef SUPPORTS_BUILTIN_ADDRESSOF + +// Overload for types that have no operator<< but do have .ToString() defined. +template +inline typename std::enable_if< + !base::internal::SupportsOstreamOperator::value && + base::internal::SupportsToString::value, + char*>::type +CheckOpValueStr(const T& v) { + // .ToString() may not return a std::string, e.g. blink::WTF::String. + return CheckOpValueStr(v.ToString()); +} + +// Provide an overload for functions and function pointers. Function pointers +// don't implicitly convert to void* but do implicitly convert to bool, so +// without this function pointers are always printed as 1 or 0. (MSVC isn't +// standards-conforming here and converts function pointers to regular +// pointers, so this is a no-op for MSVC.) +template +inline typename std::enable_if< + std::is_function::type>::value, + char*>::type +CheckOpValueStr(const T& v) { + return CheckOpValueStr(reinterpret_cast(v)); +} + +// We need overloads for enums that don't support operator<<. +// (i.e. scoped enums where no operator<< overload was declared). +template +inline typename std::enable_if< + !base::internal::SupportsOstreamOperator::value && + std::is_enum::value, + char*>::type +CheckOpValueStr(const T& v) { + return CheckOpValueStr( + static_cast::type>(v)); +} + +// Takes ownership of `v1_str` and `v2_str`, destroying them with free(). For +// use with CheckOpValueStr() which allocates these strings using strdup(). +// Returns allocated string (with strdup) for passing into +// ::logging::CheckError::(D)CheckOp methods. +// TODO(pbos): Annotate this ABSL_ATTRIBUTE_RETURNS_NONNULL after solving +// compile failure. +BASE_EXPORT char* CreateCheckOpLogMessageString(const char* expr_str, + char* v1_str, + char* v2_str); + +// Helper macro for binary operators. +// The 'switch' is used to prevent the 'else' from being ambiguous when the +// macro is used in an 'if' clause such as: +// if (a == 1) +// CHECK_EQ(2, a); +#define CHECK_OP_FUNCTION_IMPL(check_failure_function, name, op, val1, val2) \ + switch (0) \ + case 0: \ + default: \ + if (char* const message_on_fail = ::logging::Check##name##Impl( \ + (val1), (val2), #val1 " " #op " " #val2); \ + !message_on_fail) \ + ; \ + else \ + check_failure_function(message_on_fail) + +#if !CHECK_WILL_STREAM() + +// Discard log strings to reduce code bloat. +#define CHECK_OP(name, op, val1, val2) CHECK((val1)op(val2)) + +#else + +#define CHECK_OP(name, op, val1, val2) \ + CHECK_OP_FUNCTION_IMPL(::logging::CheckError::CheckOp, name, op, val1, val2) + +#endif + +// The second overload avoids address-taking of static members for +// fundamental types. +#define DEFINE_CHECK_OP_IMPL(name, op) \ + template ::value || \ + !std::is_fundamental::value, \ + int> = 0> \ + constexpr char* Check##name##Impl(const T& v1, const U& v2, \ + const char* expr_str) { \ + if (LIKELY(ANALYZER_ASSUME_TRUE(v1 op v2))) \ + return nullptr; \ + return CreateCheckOpLogMessageString(expr_str, CheckOpValueStr(v1), \ + CheckOpValueStr(v2)); \ + } \ + template ::value && \ + std::is_fundamental::value, \ + int> = 0> \ + constexpr char* Check##name##Impl(T v1, U v2, const char* expr_str) { \ + if (LIKELY(ANALYZER_ASSUME_TRUE(v1 op v2))) \ + return nullptr; \ + return CreateCheckOpLogMessageString(expr_str, CheckOpValueStr(v1), \ + CheckOpValueStr(v2)); \ + } + +// clang-format off +DEFINE_CHECK_OP_IMPL(EQ, ==) +DEFINE_CHECK_OP_IMPL(NE, !=) +DEFINE_CHECK_OP_IMPL(LE, <=) +DEFINE_CHECK_OP_IMPL(LT, < ) +DEFINE_CHECK_OP_IMPL(GE, >=) +DEFINE_CHECK_OP_IMPL(GT, > ) +#undef DEFINE_CHECK_OP_IMPL +#define CHECK_EQ(val1, val2) CHECK_OP(EQ, ==, val1, val2) +#define CHECK_NE(val1, val2) CHECK_OP(NE, !=, val1, val2) +#define CHECK_LE(val1, val2) CHECK_OP(LE, <=, val1, val2) +#define CHECK_LT(val1, val2) CHECK_OP(LT, < , val1, val2) +#define CHECK_GE(val1, val2) CHECK_OP(GE, >=, val1, val2) +#define CHECK_GT(val1, val2) CHECK_OP(GT, > , val1, val2) +// clang-format on + +#if DCHECK_IS_ON() + +#define DCHECK_OP(name, op, val1, val2) \ + CHECK_OP_FUNCTION_IMPL(::logging::CheckError::DCheckOp, name, op, val1, val2) + +#else + +// Don't do any evaluation but still reference the same stuff as when enabled. +#define DCHECK_OP(name, op, val1, val2) \ + EAT_CHECK_STREAM_PARAMS((::logging::CheckOpValueStr(val1), \ + ::logging::CheckOpValueStr(val2), (val1)op(val2))) + +#endif + +// clang-format off +#define DCHECK_EQ(val1, val2) DCHECK_OP(EQ, ==, val1, val2) +#define DCHECK_NE(val1, val2) DCHECK_OP(NE, !=, val1, val2) +#define DCHECK_LE(val1, val2) DCHECK_OP(LE, <=, val1, val2) +#define DCHECK_LT(val1, val2) DCHECK_OP(LT, < , val1, val2) +#define DCHECK_GE(val1, val2) DCHECK_OP(GE, >=, val1, val2) +#define DCHECK_GT(val1, val2) DCHECK_OP(GT, > , val1, val2) +// clang-format on + +#define DUMP_WILL_BE_CHECK_OP(name, op, val1, val2) \ + CHECK_OP_FUNCTION_IMPL(::logging::CheckError::DumpWillBeCheckOp, name, op, \ + val1, val2) + +#define DUMP_WILL_BE_CHECK_EQ(val1, val2) \ + DUMP_WILL_BE_CHECK_OP(EQ, ==, val1, val2) +#define DUMP_WILL_BE_CHECK_NE(val1, val2) \ + DUMP_WILL_BE_CHECK_OP(NE, !=, val1, val2) +#define DUMP_WILL_BE_CHECK_LE(val1, val2) \ + DUMP_WILL_BE_CHECK_OP(LE, <=, val1, val2) +#define DUMP_WILL_BE_CHECK_LT(val1, val2) \ + DUMP_WILL_BE_CHECK_OP(LT, <, val1, val2) +#define DUMP_WILL_BE_CHECK_GE(val1, val2) \ + DUMP_WILL_BE_CHECK_OP(GE, >=, val1, val2) +#define DUMP_WILL_BE_CHECK_GT(val1, val2) \ + DUMP_WILL_BE_CHECK_OP(GT, >, val1, val2) + +} // namespace logging + +#endif // BASE_CHECK_OP_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/command_line.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/command_line.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/command_line.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/command_line.cc 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,706 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/command_line.h" + +#include + +#include "base/check_op.h" +#include "base/containers/contains.h" +#include "base/containers/span.h" +#include "base/debug/debugging_buildflags.h" +#include "base/files/file_path.h" +#include "base/logging.h" +#include "base/notreached.h" +#include "base/numerics/checked_math.h" +#include "base/ranges/algorithm.h" +#include "base/strings/strcat.h" +#include "base/strings/string_piece.h" +#include "base/strings/string_split.h" +#include "base/strings/string_tokenizer.h" +#include "base/strings/string_util.h" +#include "base/strings/utf_string_conversions.h" +#include "build/build_config.h" + +#if BUILDFLAG(IS_WIN) +#include + +#include + +#include "base/strings/string_util_win.h" +#endif // BUILDFLAG(IS_WIN) + +namespace base { + +CommandLine* CommandLine::current_process_commandline_ = nullptr; + +namespace { + +DuplicateSwitchHandler* g_duplicate_switch_handler = nullptr; + +constexpr CommandLine::CharType kSwitchTerminator[] = FILE_PATH_LITERAL("--"); +constexpr CommandLine::CharType kSwitchValueSeparator[] = + FILE_PATH_LITERAL("="); + +// Since we use a lazy match, make sure that longer versions (like "--") are +// listed before shorter versions (like "-") of similar prefixes. +#if BUILDFLAG(IS_WIN) +// By putting slash last, we can control whether it is treaded as a switch +// value by changing the value of switch_prefix_count to be one less than +// the array size. +constexpr CommandLine::StringPieceType kSwitchPrefixes[] = {L"--", L"-", L"/"}; +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +// Unixes don't use slash as a switch. +constexpr CommandLine::StringPieceType kSwitchPrefixes[] = {"--", "-"}; +#endif +size_t switch_prefix_count = std::size(kSwitchPrefixes); + +#if BUILDFLAG(IS_WIN) +// Switch string that specifies the single argument to the command line. +// If present, everything after this switch is interpreted as a single +// argument regardless of whitespace, quotes, etc. Used for launches from the +// Windows shell, which may have arguments with unencoded quotes that could +// otherwise unexpectedly be split into multiple arguments +// (https://crbug.com/937179). +constexpr CommandLine::CharType kSingleArgument[] = + FILE_PATH_LITERAL("single-argument"); +#endif // BUILDFLAG(IS_WIN) + +size_t GetSwitchPrefixLength(CommandLine::StringPieceType string) { + for (size_t i = 0; i < switch_prefix_count; ++i) { + CommandLine::StringType prefix(kSwitchPrefixes[i]); + if (string.substr(0, prefix.length()) == prefix) + return prefix.length(); + } + return 0; +} + +// Fills in |switch_string| and |switch_value| if |string| is a switch. +// This will preserve the input switch prefix in the output |switch_string|. +bool IsSwitch(const CommandLine::StringType& string, + CommandLine::StringType* switch_string, + CommandLine::StringType* switch_value) { + switch_string->clear(); + switch_value->clear(); + size_t prefix_length = GetSwitchPrefixLength(string); + if (prefix_length == 0 || prefix_length == string.length()) + return false; + + const size_t equals_position = string.find(kSwitchValueSeparator); + *switch_string = string.substr(0, equals_position); + if (equals_position != CommandLine::StringType::npos) + *switch_value = string.substr(equals_position + 1); + return true; +} + +// Returns true iff |string| represents a switch with key +// |switch_key_without_prefix|, regardless of value. +bool IsSwitchWithKey(CommandLine::StringPieceType string, + CommandLine::StringPieceType switch_key_without_prefix) { + size_t prefix_length = GetSwitchPrefixLength(string); + if (prefix_length == 0 || prefix_length == string.length()) + return false; + + const size_t equals_position = string.find(kSwitchValueSeparator); + return string.substr(prefix_length, equals_position - prefix_length) == + switch_key_without_prefix; +} + +#if BUILDFLAG(IS_WIN) +// Quotes a string as necessary for CommandLineToArgvW compatibility *on +// Windows*. +// http://msdn.microsoft.com/en-us/library/17w5ykft.aspx#parsing-c-command-line-arguments. +std::wstring QuoteForCommandLineToArgvWInternal( + const std::wstring& arg, + bool allow_unsafe_insert_sequences) { + // Ensures that GetCommandLineString isn't used to generate command-line + // strings for the Windows shell by checking for Windows insert sequences like + // "%1". GetCommandLineStringForShell should be used instead to get a string + // with the correct placeholder format for the shell. + DCHECK(arg.size() != 2 || arg[0] != L'%' || allow_unsafe_insert_sequences); + + constexpr wchar_t kQuotableCharacters[] = L" \t\\\""; + if (arg.find_first_of(kQuotableCharacters) == std::wstring::npos) { + return arg; + } + + std::wstring out(1, L'"'); + for (size_t i = 0; i < arg.size(); ++i) { + if (arg[i] == L'\\') { + // Finds the extent of this run of backslashes. + size_t end = i + 1; + while (end < arg.size() && arg[end] == L'\\') { + ++end; + } + + const size_t backslash_count = end - i; + + // Backslashes are escaped only if the run is followed by a double quote. + // Since we also will end the string with a double quote, we escape for + // either a double quote or the end of the string. + const size_t backslash_multiplier = + (end == arg.size() || arg[end] == L'"') ? 2 : 1; + + out.append(std::wstring(backslash_count * backslash_multiplier, L'\\')); + + // Advances `i` to one before `end` to balance `++i` in loop. + i = end - 1; + } else if (arg[i] == L'"') { + out.append(LR"(\")"); + } else { + out.push_back(arg[i]); + } + } + + out.push_back(L'"'); + + return out; +} +#endif // BUILDFLAG(IS_WIN) + +} // namespace + +// static +void CommandLine::SetDuplicateSwitchHandler( + std::unique_ptr new_duplicate_switch_handler) { + delete g_duplicate_switch_handler; + g_duplicate_switch_handler = new_duplicate_switch_handler.release(); +} + +CommandLine::CommandLine(NoProgram no_program) : argv_(1), begin_args_(1) {} + +CommandLine::CommandLine(const FilePath& program) + : argv_(1), + begin_args_(1) { + SetProgram(program); +} + +CommandLine::CommandLine(int argc, const CommandLine::CharType* const* argv) + : argv_(1), begin_args_(1) { + InitFromArgv(argc, argv); +} + +CommandLine::CommandLine(const StringVector& argv) + : argv_(1), + begin_args_(1) { + InitFromArgv(argv); +} + +CommandLine::CommandLine(const CommandLine& other) = default; + +CommandLine& CommandLine::operator=(const CommandLine& other) = default; + +CommandLine::~CommandLine() = default; + +#if BUILDFLAG(IS_WIN) +// static +void CommandLine::set_slash_is_not_a_switch() { + // The last switch prefix should be slash, so adjust the size to skip it. + static_assert(base::make_span(kSwitchPrefixes).back() == L"/", + "Error: Last switch prefix is not a slash."); + switch_prefix_count = std::size(kSwitchPrefixes) - 1; +} + +// static +void CommandLine::InitUsingArgvForTesting(int argc, const char* const* argv) { + DCHECK(!current_process_commandline_); + current_process_commandline_ = new CommandLine(NO_PROGRAM); + // On Windows we need to convert the command line arguments to std::wstring. + CommandLine::StringVector argv_vector; + for (int i = 0; i < argc; ++i) + argv_vector.push_back(UTF8ToWide(argv[i])); + current_process_commandline_->InitFromArgv(argv_vector); +} +#endif // BUILDFLAG(IS_WIN) + +// static +bool CommandLine::Init(int argc, const char* const* argv) { + if (current_process_commandline_) { + // If this is intentional, Reset() must be called first. If we are using + // the shared build mode, we have to share a single object across multiple + // shared libraries. + return false; + } + + current_process_commandline_ = new CommandLine(NO_PROGRAM); +#if BUILDFLAG(IS_WIN) + current_process_commandline_->ParseFromString(::GetCommandLineW()); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + current_process_commandline_->InitFromArgv(argc, argv); +#else +#error Unsupported platform +#endif + + return true; +} + +// static +void CommandLine::Reset() { + DCHECK(current_process_commandline_); + delete current_process_commandline_; + current_process_commandline_ = nullptr; +} + +// static +CommandLine* CommandLine::ForCurrentProcess() { + DCHECK(current_process_commandline_); + return current_process_commandline_; +} + +// static +bool CommandLine::InitializedForCurrentProcess() { + return !!current_process_commandline_; +} + +#if BUILDFLAG(IS_WIN) +// static +CommandLine CommandLine::FromString(StringPieceType command_line) { + CommandLine cmd(NO_PROGRAM); + cmd.ParseFromString(command_line); + return cmd; +} +#endif // BUILDFLAG(IS_WIN) + +void CommandLine::InitFromArgv(int argc, + const CommandLine::CharType* const* argv) { + StringVector new_argv; + for (int i = 0; i < argc; ++i) + new_argv.push_back(argv[i]); + InitFromArgv(new_argv); +} + +void CommandLine::InitFromArgv(const StringVector& argv) { + argv_ = StringVector(1); + switches_.clear(); + begin_args_ = 1; + SetProgram(argv.empty() ? FilePath() : FilePath(argv[0])); + AppendSwitchesAndArguments(argv); +} + +FilePath CommandLine::GetProgram() const { + return FilePath(argv_[0]); +} + +void CommandLine::SetProgram(const FilePath& program) { +#if BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) + sequence_checker_.Check(); +#endif +#if BUILDFLAG(IS_WIN) + argv_[0] = StringType(TrimWhitespace(program.value(), TRIM_ALL)); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + TrimWhitespaceASCII(program.value(), TRIM_ALL, &argv_[0]); +#else +#error Unsupported platform +#endif +} + +bool CommandLine::HasSwitch(StringPiece switch_string) const { + DCHECK_EQ(ToLowerASCII(switch_string), switch_string); + return Contains(switches_, switch_string); +} + +bool CommandLine::HasSwitch(const char switch_constant[]) const { + return HasSwitch(StringPiece(switch_constant)); +} + +std::string CommandLine::GetSwitchValueASCII(StringPiece switch_string) const { + StringType value = GetSwitchValueNative(switch_string); +#if BUILDFLAG(IS_WIN) + if (!IsStringASCII(base::AsStringPiece16(value))) { +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + if (!IsStringASCII(value)) { +#endif + DLOG(WARNING) << "Value of switch (" << switch_string << ") must be ASCII."; + return std::string(); + } +#if BUILDFLAG(IS_WIN) + return WideToUTF8(value); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + return value; +#endif +} + +FilePath CommandLine::GetSwitchValuePath(StringPiece switch_string) const { + return FilePath(GetSwitchValueNative(switch_string)); +} + +CommandLine::StringType CommandLine::GetSwitchValueNative( + StringPiece switch_string) const { + DCHECK_EQ(ToLowerASCII(switch_string), switch_string); + auto result = switches_.find(switch_string); + return result == switches_.end() ? StringType() : result->second; +} + +void CommandLine::AppendSwitch(StringPiece switch_string) { + AppendSwitchNative(switch_string, StringType()); +} + +void CommandLine::AppendSwitchPath(StringPiece switch_string, + const FilePath& path) { + AppendSwitchNative(switch_string, path.value()); +} + +void CommandLine::AppendSwitchNative(StringPiece switch_string, + CommandLine::StringPieceType value) { +#if BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) + sequence_checker_.Check(); +#endif +#if BUILDFLAG(IS_WIN) + const std::string switch_key = ToLowerASCII(switch_string); + StringType combined_switch_string(UTF8ToWide(switch_key)); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + StringPiece switch_key = switch_string; + StringType combined_switch_string(switch_key); +#endif + size_t prefix_length = GetSwitchPrefixLength(combined_switch_string); + auto key = switch_key.substr(prefix_length); + if (g_duplicate_switch_handler) { + g_duplicate_switch_handler->ResolveDuplicate(key, value, + switches_[std::string(key)]); + } else { + switches_[std::string(key)] = StringType(value); + } + + // Preserve existing switch prefixes in |argv_|; only append one if necessary. + if (prefix_length == 0) { + combined_switch_string.insert(0, kSwitchPrefixes[0].data(), + kSwitchPrefixes[0].size()); + } + if (!value.empty()) + base::StrAppend(&combined_switch_string, {kSwitchValueSeparator, value}); + // Append the switch and update the switches/arguments divider |begin_args_|. + argv_.insert(argv_.begin() + begin_args_, combined_switch_string); + begin_args_ = (CheckedNumeric(begin_args_) + 1).ValueOrDie(); +} + +void CommandLine::AppendSwitchASCII(StringPiece switch_string, + StringPiece value_string) { +#if BUILDFLAG(IS_WIN) + AppendSwitchNative(switch_string, UTF8ToWide(value_string)); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + AppendSwitchNative(switch_string, value_string); +#else +#error Unsupported platform +#endif +} + +void CommandLine::RemoveSwitch(base::StringPiece switch_key_without_prefix) { +#if BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) + sequence_checker_.Check(); +#endif +#if BUILDFLAG(IS_WIN) + StringType switch_key_native = UTF8ToWide(switch_key_without_prefix); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + StringType switch_key_native(switch_key_without_prefix); +#endif + + DCHECK_EQ(ToLowerASCII(switch_key_without_prefix), switch_key_without_prefix); + DCHECK_EQ(0u, GetSwitchPrefixLength(switch_key_native)); + auto it = switches_.find(switch_key_without_prefix); + if (it == switches_.end()) + return; + switches_.erase(it); + // Also erase from the switches section of |argv_| and update |begin_args_| + // accordingly. + // Switches in |argv_| have indices [1, begin_args_). + auto argv_switches_begin = argv_.begin() + 1; + auto argv_switches_end = argv_.begin() + begin_args_; + DCHECK(argv_switches_begin <= argv_switches_end); + DCHECK(argv_switches_end <= argv_.end()); + auto expell = std::remove_if(argv_switches_begin, argv_switches_end, + [&switch_key_native](const StringType& arg) { + return IsSwitchWithKey(arg, switch_key_native); + }); + if (expell == argv_switches_end) { + NOTREACHED(); + return; + } + begin_args_ -= argv_switches_end - expell; + argv_.erase(expell, argv_switches_end); +} + +void CommandLine::CopySwitchesFrom(const CommandLine& source, + span switches) { + for (const char* entry : switches) { + if (source.HasSwitch(entry)) { + AppendSwitchNative(entry, source.GetSwitchValueNative(entry)); + } + } +} + +CommandLine::StringVector CommandLine::GetArgs() const { + // Gather all arguments after the last switch (may include kSwitchTerminator). + StringVector args(argv_.begin() + begin_args_, argv_.end()); + // Erase only the first kSwitchTerminator (maybe "--" is a legitimate page?) + auto switch_terminator = ranges::find(args, kSwitchTerminator); + if (switch_terminator != args.end()) + args.erase(switch_terminator); + return args; +} + +void CommandLine::AppendArg(StringPiece value) { +#if BUILDFLAG(IS_WIN) + DCHECK(IsStringUTF8(value)); + AppendArgNative(UTF8ToWide(value)); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + AppendArgNative(value); +#else +#error Unsupported platform +#endif +} + +void CommandLine::AppendArgPath(const FilePath& path) { + AppendArgNative(path.value()); +} + +void CommandLine::AppendArgNative(StringPieceType value) { +#if BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) + sequence_checker_.Check(); +#endif + argv_.push_back(StringType(value)); +} + +void CommandLine::AppendArguments(const CommandLine& other, + bool include_program) { + if (include_program) + SetProgram(other.GetProgram()); + AppendSwitchesAndArguments(other.argv()); +} + +void CommandLine::PrependWrapper(StringPieceType wrapper) { +#if BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) + sequence_checker_.Check(); +#endif + if (wrapper.empty()) + return; + // Split the wrapper command based on whitespace (with quoting). + // StringPieceType does not currently work directly with StringTokenizerT. + using CommandLineTokenizer = + StringTokenizerT; + StringType wrapper_string(wrapper); + CommandLineTokenizer tokenizer(wrapper_string, FILE_PATH_LITERAL(" ")); + tokenizer.set_quote_chars(FILE_PATH_LITERAL("'\"")); + std::vector wrapper_argv; + while (tokenizer.GetNext()) + wrapper_argv.emplace_back(tokenizer.token()); + + // Prepend the wrapper and update the switches/arguments |begin_args_|. + argv_.insert(argv_.begin(), wrapper_argv.begin(), wrapper_argv.end()); + begin_args_ += wrapper_argv.size(); +} + +#if BUILDFLAG(IS_WIN) +void CommandLine::ParseFromString(StringPieceType command_line) { + command_line = TrimWhitespace(command_line, TRIM_ALL); + if (command_line.empty()) + return; + raw_command_line_string_ = command_line; + + int num_args = 0; + wchar_t** args = NULL; + // When calling CommandLineToArgvW, use the apiset if available. + // Doing so will bypass loading shell32.dll on Windows. + HMODULE downlevel_shell32_dll = + ::LoadLibraryEx(L"api-ms-win-downlevel-shell32-l1-1-0.dll", nullptr, + LOAD_LIBRARY_SEARCH_SYSTEM32); + if (downlevel_shell32_dll) { + auto command_line_to_argv_w_proc = + reinterpret_cast( + ::GetProcAddress(downlevel_shell32_dll, "CommandLineToArgvW")); + if (command_line_to_argv_w_proc) + args = command_line_to_argv_w_proc(command_line.data(), &num_args); + } else { + // Since the apiset is not available, allow the delayload of shell32.dll + // to take place. + args = ::CommandLineToArgvW(command_line.data(), &num_args); + } + + DPLOG_IF(FATAL, !args) << "CommandLineToArgvW failed on command line: " + << command_line; + StringVector argv(args, args + num_args); + InitFromArgv(argv); + raw_command_line_string_ = StringPieceType(); + LocalFree(args); + + if (downlevel_shell32_dll) + ::FreeLibrary(downlevel_shell32_dll); +} + +#endif // BUILDFLAG(IS_WIN) + +void CommandLine::AppendSwitchesAndArguments( + const CommandLine::StringVector& argv) { + bool parse_switches = true; +#if BUILDFLAG(IS_WIN) + const bool is_parsed_from_string = !raw_command_line_string_.empty(); +#endif + for (size_t i = 1; i < argv.size(); ++i) { + CommandLine::StringType arg = argv[i]; +#if BUILDFLAG(IS_WIN) + arg = CommandLine::StringType(TrimWhitespace(arg, TRIM_ALL)); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + TrimWhitespaceASCII(arg, TRIM_ALL, &arg); +#endif + + CommandLine::StringType switch_string; + CommandLine::StringType switch_value; + parse_switches &= (arg != kSwitchTerminator); + if (parse_switches && IsSwitch(arg, &switch_string, &switch_value)) { +#if BUILDFLAG(IS_WIN) + if (is_parsed_from_string && + IsSwitchWithKey(switch_string, kSingleArgument)) { + ParseAsSingleArgument(switch_string); + return; + } + AppendSwitchNative(WideToUTF8(switch_string), switch_value); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + AppendSwitchNative(switch_string, switch_value); +#else +#error Unsupported platform +#endif + } else { + AppendArgNative(arg); + } + } +} + +CommandLine::StringType CommandLine::GetArgumentsStringInternal( + bool allow_unsafe_insert_sequences) const { + StringType params; + // Append switches and arguments. + bool parse_switches = true; +#if BUILDFLAG(IS_WIN) + bool appended_single_argument_switch = false; +#endif + + for (size_t i = 1; i < argv_.size(); ++i) { + StringType arg = argv_[i]; + StringType switch_string; + StringType switch_value; + parse_switches &= arg != kSwitchTerminator; + if (i > 1) + params.append(FILE_PATH_LITERAL(" ")); + if (parse_switches && IsSwitch(arg, &switch_string, &switch_value)) { + params.append(switch_string); + if (!switch_value.empty()) { +#if BUILDFLAG(IS_WIN) + switch_value = QuoteForCommandLineToArgvWInternal( + switch_value, allow_unsafe_insert_sequences); +#endif + params.append(kSwitchValueSeparator + switch_value); + } + } else { +#if BUILDFLAG(IS_WIN) + if (has_single_argument_switch_) { + // Check that we don't have multiple arguments when + // `has_single_argument_switch_` is true. + DCHECK(!appended_single_argument_switch); + appended_single_argument_switch = true; + params.append(base::StrCat( + {kSwitchPrefixes[0], kSingleArgument, FILE_PATH_LITERAL(" ")})); + } else { + arg = QuoteForCommandLineToArgvWInternal(arg, + allow_unsafe_insert_sequences); + } +#endif + params.append(arg); + } + } + return params; +} + +CommandLine::StringType CommandLine::GetCommandLineString() const { + StringType string(argv_[0]); +#if BUILDFLAG(IS_WIN) + string = QuoteForCommandLineToArgvWInternal( + string, + /*allow_unsafe_insert_sequences=*/false); +#endif + StringType params(GetArgumentsString()); + if (!params.empty()) { + string.append(FILE_PATH_LITERAL(" ")); + string.append(params); + } + return string; +} + +#if BUILDFLAG(IS_WIN) +// static +std::wstring CommandLine::QuoteForCommandLineToArgvW(const std::wstring& arg) { + return QuoteForCommandLineToArgvWInternal( + arg, /*allow_unsafe_insert_sequences=*/false); +} + +// NOTE: this function is used to set Chrome's open command in the registry +// during update. Any change to the syntax must be compatible with the prior +// version (i.e., any new syntax must be understood by older browsers expecting +// the old syntax, and the new browser must still handle the old syntax), as +// old versions are likely to persist, e.g., immediately after background +// update, when parsing command lines for other channels, when uninstalling web +// applications installed using the old syntax, etc. +CommandLine::StringType CommandLine::GetCommandLineStringForShell() const { + DCHECK(GetArgs().empty()); + StringType command_line_string = GetCommandLineString(); + return command_line_string + FILE_PATH_LITERAL(" ") + + StringType(kSwitchPrefixes[0]) + kSingleArgument + + FILE_PATH_LITERAL(" %1"); +} + +CommandLine::StringType +CommandLine::GetCommandLineStringWithUnsafeInsertSequences() const { + StringType string(argv_[0]); + string = QuoteForCommandLineToArgvWInternal( + string, + /*allow_unsafe_insert_sequences=*/true); + StringType params( + GetArgumentsStringInternal(/*allow_unsafe_insert_sequences=*/true)); + if (!params.empty()) { + string.append(FILE_PATH_LITERAL(" ")); + string.append(params); + } + return string; +} +#endif // BUILDFLAG(IS_WIN) + +CommandLine::StringType CommandLine::GetArgumentsString() const { + return GetArgumentsStringInternal(/*allow_unsafe_insert_sequences=*/false); +} + +#if BUILDFLAG(IS_WIN) +void CommandLine::ParseAsSingleArgument( + const CommandLine::StringType& single_arg_switch) { + DCHECK(!raw_command_line_string_.empty()); + + // Remove any previously parsed arguments. + argv_.resize(static_cast(begin_args_)); + + // Locate "--single-argument" in the process's raw command line. Results are + // unpredictable if "--single-argument" appears as part of a previous + // argument or switch. + const size_t single_arg_switch_position = + raw_command_line_string_.find(single_arg_switch); + DCHECK_NE(single_arg_switch_position, StringType::npos); + + // Append the portion of the raw command line that starts one character past + // "--single-argument" as the one and only argument, or return if no + // argument is present. + const size_t arg_position = + single_arg_switch_position + single_arg_switch.length() + 1; + if (arg_position >= raw_command_line_string_.length()) + return; + has_single_argument_switch_ = true; + const StringPieceType arg = raw_command_line_string_.substr(arg_position); + if (!arg.empty()) { + AppendArgNative(arg); + } +} +#endif // BUILDFLAG(IS_WIN) + +void CommandLine::DetachFromCurrentSequence() { +#if BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) + sequence_checker_.Detach(); +#endif // BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) +} + +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/command_line.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/command_line.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/command_line.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/command_line.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,342 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This class works with command lines: building and parsing. +// Arguments with prefixes ('--', '-', and on Windows, '/') are switches. +// Switches will precede all other arguments without switch prefixes. +// Switches can optionally have values, delimited by '=', e.g., "-switch=value". +// If a switch is specified multiple times, only the last value is used. +// An argument of "--" will terminate switch parsing during initialization, +// interpreting subsequent tokens as non-switch arguments, regardless of prefix. + +// There is a singleton read-only CommandLine that represents the command line +// that the current process was started with. It must be initialized in main(). + +#ifndef BASE_COMMAND_LINE_H_ +#define BASE_COMMAND_LINE_H_ + +#include +#include +#include +#include +#include +#include + +#include "base/base_export.h" +#include "base/containers/span.h" +#include "base/debug/debugging_buildflags.h" +#include "base/strings/string_piece.h" +#include "build/build_config.h" + +#if BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) +#include "base/sequence_checker.h" +#endif // BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) + +namespace base { + +class DuplicateSwitchHandler; +class FilePath; + +class BASE_EXPORT CommandLine { + public: +#if BUILDFLAG(IS_WIN) + // The native command line string type. + using StringType = std::wstring; +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + using StringType = std::string; +#endif + + using CharType = StringType::value_type; + using StringPieceType = base::BasicStringPiece; + using StringVector = std::vector; + using SwitchMap = std::map>; + + // A constructor for CommandLines that only carry switches and arguments. + enum NoProgram { NO_PROGRAM }; + explicit CommandLine(NoProgram no_program); + + // Construct a new command line with |program| as argv[0]. + explicit CommandLine(const FilePath& program); + + // Construct a new command line from an argument list. + CommandLine(int argc, const CharType* const* argv); + explicit CommandLine(const StringVector& argv); + + // Allow the copy constructor. A common pattern is to copy of the current + // process's command line and then add some flags to it. For example: + // CommandLine cl(*CommandLine::ForCurrentProcess()); + // cl.AppendSwitch(...); + CommandLine(const CommandLine& other); + CommandLine& operator=(const CommandLine& other); + + ~CommandLine(); + +#if BUILDFLAG(IS_WIN) + // By default this class will treat command-line arguments beginning with + // slashes as switches on Windows, but not other platforms. + // + // If this behavior is inappropriate for your application, you can call this + // function BEFORE initializing the current process' global command line + // object and the behavior will be the same as Posix systems (only hyphens + // begin switches, everything else will be an arg). + static void set_slash_is_not_a_switch(); + + // Normally when the CommandLine singleton is initialized it gets the command + // line via the GetCommandLineW API and then uses the shell32 API + // CommandLineToArgvW to parse the command line and convert it back to + // argc and argv. Tests who don't want this dependency on shell32 and need + // to honor the arguments passed in should use this function. + static void InitUsingArgvForTesting(int argc, const char* const* argv); +#endif + + // Initialize the current process CommandLine singleton. On Windows, ignores + // its arguments (we instead parse GetCommandLineW() directly) because we + // don't trust the CRT's parsing of the command line, but it still must be + // called to set up the command line. Returns false if initialization has + // already occurred, and true otherwise. Only the caller receiving a 'true' + // return value should take responsibility for calling Reset. + static bool Init(int argc, const char* const* argv); + + // Destroys the current process CommandLine singleton. This is necessary if + // you want to reset the base library to its initial state (for example, in an + // outer library that needs to be able to terminate, and be re-initialized). + // If Init is called only once, as in main(), Reset() is not necessary. + // Do not call this in tests. Use base::test::ScopedCommandLine instead. + static void Reset(); + + // Get the singleton CommandLine representing the current process's + // command line. Note: returned value is mutable, but not thread safe; + // only mutate if you know what you're doing! + static CommandLine* ForCurrentProcess(); + + // Returns true if the CommandLine has been initialized for the given process. + static bool InitializedForCurrentProcess(); + +#if BUILDFLAG(IS_WIN) + static CommandLine FromString(StringPieceType command_line); +#endif + + // Initialize from an argv vector. + void InitFromArgv(int argc, const CharType* const* argv); + void InitFromArgv(const StringVector& argv); + + // Constructs and returns the represented command line string. + // CAUTION! This should be avoided on POSIX because quoting behavior is + // unclear. + // CAUTION! If writing a command line to the Windows registry, use + // GetCommandLineStringForShell() instead. + StringType GetCommandLineString() const; + +#if BUILDFLAG(IS_WIN) + // Quotes and escapes `arg` if necessary so that it will be interpreted as a + // single command-line parameter according to the following rules in line with + // `::CommandLineToArgvW` and C++ `main`: + // * Returns `arg` unchanged if `arg` does not include any characters that may + // need encoding, which is spaces, tabs, backslashes, and double-quotes. + // * Otherwise, double-quotes `arg` and in addition: + // * Escapes any double-quotes in `arg` with backslashes. + // * Escapes backslashes in `arg` if: + // * `arg` ends with backslashes , or + // * the backslashes end in a pre-existing double quote. + // + // https://learn.microsoft.com/en-us/search/?terms=CommandLineToArgvW and + // http://msdn.microsoft.com/en-us/library/17w5ykft.aspx#parsing-c-command-line-arguments. + static std::wstring QuoteForCommandLineToArgvW(const std::wstring& arg); + + // Returns the command-line string in the proper format for the Windows shell, + // ending with the argument placeholder "--single-argument %1". The single- + // argument switch prevents unexpected parsing of arguments from other + // software that cannot be trusted to escape double quotes when substituting + // into a placeholder (e.g., "%1" insert sequences populated by the Windows + // shell). + // NOTE: this must be used to generate the command-line string for the shell + // even if this command line was parsed from a string with the proper syntax, + // because the --single-argument switch is not preserved during parsing. + StringType GetCommandLineStringForShell() const; + + // Returns the represented command-line string. Allows the use of unsafe + // Windows insert sequences like "%1". Only use this method if + // GetCommandLineStringForShell() is not adequate AND the processor inserting + // the arguments is known to do so securely (i.e., is not the Windows shell). + // If in doubt, do not use. + StringType GetCommandLineStringWithUnsafeInsertSequences() const; +#endif + + // Constructs and returns the represented arguments string. + // CAUTION! This should be avoided on POSIX because quoting behavior is + // unclear. + StringType GetArgumentsString() const; + + // Returns the original command line string as a vector of strings. + const StringVector& argv() const { return argv_; } + + // Get and Set the program part of the command line string (the first item). + FilePath GetProgram() const; + void SetProgram(const FilePath& program); + + // Returns true if this command line contains the given switch. + // Switch names must be lowercase. + // The second override provides an optimized version to avoid inlining codegen + // at every callsite to find the length of the constant and construct a + // StringPiece. + bool HasSwitch(StringPiece switch_string) const; + bool HasSwitch(const char switch_constant[]) const; + + // Returns the value associated with the given switch. If the switch has no + // value or isn't present, this method returns the empty string. + // Switch names must be lowercase. + std::string GetSwitchValueASCII(StringPiece switch_string) const; + FilePath GetSwitchValuePath(StringPiece switch_string) const; + StringType GetSwitchValueNative(StringPiece switch_string) const; + + // Get a copy of all switches, along with their values. + const SwitchMap& GetSwitches() const { return switches_; } + + // Append a switch [with optional value] to the command line. + // Note: Switches will precede arguments regardless of appending order. + void AppendSwitch(StringPiece switch_string); + void AppendSwitchPath(StringPiece switch_string, const FilePath& path); + void AppendSwitchNative(StringPiece switch_string, StringPieceType value); + void AppendSwitchASCII(StringPiece switch_string, StringPiece value); + + // Removes the switch that matches |switch_key_without_prefix|, regardless of + // prefix and value. If no such switch is present, this has no effect. + void RemoveSwitch(const base::StringPiece switch_key_without_prefix); + + // Copies a set of switches (and any values) from another command line. + // Commonly used when launching a subprocess. + // If an entry in `switches` does not exist in `source`, then it is ignored. + void CopySwitchesFrom(const CommandLine& source, + span switches); + + // Get the remaining arguments to the command. + StringVector GetArgs() const; + + // Append an argument to the command line. Note that the argument is quoted + // properly such that it is interpreted as one argument to the target command. + // AppendArg is primarily for ASCII; non-ASCII input is interpreted as UTF-8. + // Note: Switches will precede arguments regardless of appending order. + void AppendArg(StringPiece value); + void AppendArgPath(const FilePath& value); + void AppendArgNative(StringPieceType value); + + // Append the switches and arguments from another command line to this one. + // If |include_program| is true, include |other|'s program as well. + void AppendArguments(const CommandLine& other, bool include_program); + + // Insert a command before the current command. + // Common for debuggers, like "gdb --args". + void PrependWrapper(StringPieceType wrapper); + +#if BUILDFLAG(IS_WIN) + // Initialize by parsing the given command line string. + // The program name is assumed to be the first item in the string. + void ParseFromString(StringPieceType command_line); + + // Returns true if the command line had the --single-argument switch, and + // thus likely came from a Windows shell registration. This is only set if the + // command line is parsed, and is not changed after it is parsed. + bool HasSingleArgumentSwitch() const { return has_single_argument_switch_; } +#endif + + // Detaches this object from the current sequence in preparation for a move to + // a different sequence. + void DetachFromCurrentSequence(); + + // Sets a delegate that's called when we encounter a duplicate switch + static void SetDuplicateSwitchHandler( + std::unique_ptr); + + private: +#if BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) + // A helper class that encapsulates a SEQUENCE_CHECKER but allows copy. + // Copying this class will detach the sequence checker from the owning object. + class InstanceBoundSequenceChecker { + public: + InstanceBoundSequenceChecker() = default; + + InstanceBoundSequenceChecker(const InstanceBoundSequenceChecker& other) {} + + InstanceBoundSequenceChecker& operator=( + const InstanceBoundSequenceChecker& other) { + return *this; + } + + // Disallow move. + InstanceBoundSequenceChecker(InstanceBoundSequenceChecker&&) = delete; + InstanceBoundSequenceChecker& operator=(InstanceBoundSequenceChecker&&) = + delete; + + void Detach() { DETACH_FROM_SEQUENCE(sequence_checker_); } + void Check() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); } + + private: + SEQUENCE_CHECKER(sequence_checker_); + }; +#endif // BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) + + // Disallow default constructor; a program name must be explicitly specified. + CommandLine() = delete; + + // Append switches and arguments, keeping switches before arguments. + void AppendSwitchesAndArguments(const StringVector& argv); + + // Internal version of GetArgumentsString to support allowing unsafe insert + // sequences in rare cases (see + // GetCommandLineStringWithUnsafeInsertSequences). + StringType GetArgumentsStringInternal( + bool allow_unsafe_insert_sequences) const; + +#if BUILDFLAG(IS_WIN) + // Initializes by parsing |raw_command_line_string_|, treating everything + // after |single_arg_switch_string| + as the command + // line's single argument, and dropping any arguments previously parsed. The + // command line must contain |single_arg_switch_string|, and the argument, if + // present, must be separated from |single_arg_switch_string| by one + // character. + // NOTE: the single-argument switch is not preserved after parsing; + // GetCommandLineStringForShell() must be used to reproduce the original + // command-line string with single-argument switch. + void ParseAsSingleArgument(const StringType& single_arg_switch_string); + + // The string returned by GetCommandLineW(), to be parsed via + // ParseFromString(). Empty if this command line was not parsed from a string, + // or if ParseFromString() has finished executing. + StringPieceType raw_command_line_string_; + + // Set to true if the command line had --single-argument when initially + // parsed. It does not change if the command line mutates after initial + // parsing. + bool has_single_argument_switch_ = false; +#endif + + // The singleton CommandLine representing the current process's command line. + static CommandLine* current_process_commandline_; + + // The argv array: { program, [(--|-|/)switch[=value]]*, [--], [argument]* } + StringVector argv_; + + // Parsed-out switch keys and values. + SwitchMap switches_; + + // The index after the program and switches, any arguments start here. + ptrdiff_t begin_args_; + +#if BUILDFLAG(ENABLE_COMMANDLINE_SEQUENCE_CHECKS) + InstanceBoundSequenceChecker sequence_checker_; +#endif +}; + +class BASE_EXPORT DuplicateSwitchHandler { + public: + // out_value contains the existing value of the switch + virtual void ResolveDuplicate(base::StringPiece key, + CommandLine::StringPieceType new_value, + CommandLine::StringType& out_value) = 0; + virtual ~DuplicateSwitchHandler() = default; +}; + +} // namespace base + +#endif // BASE_COMMAND_LINE_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/compiler_specific.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/compiler_specific.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/compiler_specific.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/compiler_specific.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,441 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_COMPILER_SPECIFIC_H_ +#define BASE_COMPILER_SPECIFIC_H_ + +#include "build/build_config.h" + +#if defined(COMPILER_MSVC) && !defined(__clang__) +#error "Only clang-cl is supported on Windows, see https://crbug.com/988071" +#endif + +// This is a wrapper around `__has_cpp_attribute`, which can be used to test for +// the presence of an attribute. In case the compiler does not support this +// macro it will simply evaluate to 0. +// +// References: +// https://wg21.link/sd6#testing-for-the-presence-of-an-attribute-__has_cpp_attribute +// https://wg21.link/cpp.cond#:__has_cpp_attribute +#if defined(__has_cpp_attribute) +#define HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x) +#else +#define HAS_CPP_ATTRIBUTE(x) 0 +#endif + +// A wrapper around `__has_attribute`, similar to HAS_CPP_ATTRIBUTE. +#if defined(__has_attribute) +#define HAS_ATTRIBUTE(x) __has_attribute(x) +#else +#define HAS_ATTRIBUTE(x) 0 +#endif + +// A wrapper around `__has_builtin`, similar to HAS_CPP_ATTRIBUTE. +#if defined(__has_builtin) +#define HAS_BUILTIN(x) __has_builtin(x) +#else +#define HAS_BUILTIN(x) 0 +#endif + +// Annotate a function indicating it should not be inlined. +// Use like: +// NOINLINE void DoStuff() { ... } +#if defined(__clang__) && HAS_ATTRIBUTE(noinline) && \ + (!defined(MOZ_ZUCCHINI) || __clang_major__ >= 15) +#define NOINLINE [[clang::noinline]] +#elif defined(COMPILER_GCC) && HAS_ATTRIBUTE(noinline) +#define NOINLINE __attribute__((noinline)) +#elif defined(COMPILER_MSVC) +#define NOINLINE __declspec(noinline) +#else +#define NOINLINE +#endif + +#if defined(__clang__) && defined(NDEBUG) && HAS_ATTRIBUTE(always_inline) && \ + (!defined(MOZ_ZUCCHINI) || __clang_major__ >= 15) +#define ALWAYS_INLINE [[clang::always_inline]] inline +#elif defined(COMPILER_GCC) && defined(NDEBUG) && HAS_ATTRIBUTE(always_inline) +#define ALWAYS_INLINE inline __attribute__((__always_inline__)) +#elif defined(COMPILER_MSVC) && defined(NDEBUG) +#define ALWAYS_INLINE __forceinline +#else +#define ALWAYS_INLINE inline +#endif + +// Annotate a function indicating it should never be tail called. Useful to make +// sure callers of the annotated function are never omitted from call-stacks. +// To provide the complementary behavior (prevent the annotated function from +// being omitted) look at NOINLINE. Also note that this doesn't prevent code +// folding of multiple identical caller functions into a single signature. To +// prevent code folding, see NO_CODE_FOLDING() in base/debug/alias.h. +// Use like: +// NOT_TAIL_CALLED void FooBar(); +#if defined(__clang__) && HAS_ATTRIBUTE(not_tail_called) && \ + (!defined(MOZ_ZUCCHINI) || __clang_major__ >= 15) +#define NOT_TAIL_CALLED [[clang::not_tail_called]] +#else +#define NOT_TAIL_CALLED +#endif + +// Specify memory alignment for structs, classes, etc. +// Use like: +// class ALIGNAS(16) MyClass { ... } +// ALIGNAS(16) int array[4]; +// +// In most places you can use the C++11 keyword "alignas", which is preferred. +// +// Historically, compilers had trouble mixing __attribute__((...)) syntax with +// alignas(...) syntax. However, at least Clang is very accepting nowadays. It +// may be that this macro can be removed entirely. +#if defined(__clang__) +#define ALIGNAS(byte_alignment) alignas(byte_alignment) +#elif defined(COMPILER_MSVC) +#define ALIGNAS(byte_alignment) __declspec(align(byte_alignment)) +#elif defined(COMPILER_GCC) && HAS_ATTRIBUTE(aligned) +#define ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment))) +#endif + +// In case the compiler supports it NO_UNIQUE_ADDRESS evaluates to the C++20 +// attribute [[no_unique_address]]. This allows annotating data members so that +// they need not have an address distinct from all other non-static data members +// of its class. +// +// References: +// * https://en.cppreference.com/w/cpp/language/attributes/no_unique_address +// * https://wg21.link/dcl.attr.nouniqueaddr +#if HAS_CPP_ATTRIBUTE(no_unique_address) +#define NO_UNIQUE_ADDRESS [[no_unique_address]] +#else +#define NO_UNIQUE_ADDRESS +#endif + +// Tells the compiler a function is using a printf-style format string. +// |format_param| is the one-based index of the format string parameter; +// |dots_param| is the one-based index of the "..." parameter. +// For v*printf functions (which take a va_list), pass 0 for dots_param. +// (This is undocumented but matches what the system C headers do.) +// For member functions, the implicit this parameter counts as index 1. +#if (defined(COMPILER_GCC) || defined(__clang__)) && HAS_ATTRIBUTE(format) +#define PRINTF_FORMAT(format_param, dots_param) \ + __attribute__((format(printf, format_param, dots_param))) +#else +#define PRINTF_FORMAT(format_param, dots_param) +#endif + +// WPRINTF_FORMAT is the same, but for wide format strings. +// This doesn't appear to yet be implemented in any compiler. +// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38308 . +#define WPRINTF_FORMAT(format_param, dots_param) +// If available, it would look like: +// __attribute__((format(wprintf, format_param, dots_param))) + +// Sanitizers annotations. +#if HAS_ATTRIBUTE(no_sanitize) +#define NO_SANITIZE(what) __attribute__((no_sanitize(what))) +#endif +#if !defined(NO_SANITIZE) +#define NO_SANITIZE(what) +#endif + +// MemorySanitizer annotations. +#if defined(MEMORY_SANITIZER) && !BUILDFLAG(IS_NACL) +#include + +// Mark a memory region fully initialized. +// Use this to annotate code that deliberately reads uninitialized data, for +// example a GC scavenging root set pointers from the stack. +#define MSAN_UNPOISON(p, size) __msan_unpoison(p, size) + +// Check a memory region for initializedness, as if it was being used here. +// If any bits are uninitialized, crash with an MSan report. +// Use this to sanitize data which MSan won't be able to track, e.g. before +// passing data to another process via shared memory. +#define MSAN_CHECK_MEM_IS_INITIALIZED(p, size) \ + __msan_check_mem_is_initialized(p, size) +#else // MEMORY_SANITIZER +#define MSAN_UNPOISON(p, size) +#define MSAN_CHECK_MEM_IS_INITIALIZED(p, size) +#endif // MEMORY_SANITIZER + +// DISABLE_CFI_PERF -- Disable Control Flow Integrity for perf reasons. +#if !defined(DISABLE_CFI_PERF) +#if defined(__clang__) && defined(OFFICIAL_BUILD) +#define DISABLE_CFI_PERF NO_SANITIZE("cfi") +#else +#define DISABLE_CFI_PERF +#endif +#endif + +// DISABLE_CFI_ICALL -- Disable Control Flow Integrity indirect call checks. +// Security Note: if you just need to allow calling of dlsym functions use +// DISABLE_CFI_DLSYM. +#if !defined(DISABLE_CFI_ICALL) +#if BUILDFLAG(IS_WIN) +// Windows also needs __declspec(guard(nocf)). +#define DISABLE_CFI_ICALL NO_SANITIZE("cfi-icall") __declspec(guard(nocf)) +#else +#define DISABLE_CFI_ICALL NO_SANITIZE("cfi-icall") +#endif +#endif +#if !defined(DISABLE_CFI_ICALL) +#define DISABLE_CFI_ICALL +#endif + +// DISABLE_CFI_DLSYM -- applies DISABLE_CFI_ICALL on platforms where dlsym +// functions must be called. Retains CFI checks on platforms where loaded +// modules participate in CFI (e.g. Windows). +#if !defined(DISABLE_CFI_DLSYM) +#if BUILDFLAG(IS_WIN) +// Windows modules register functions when loaded so can be checked by CFG. +#define DISABLE_CFI_DLSYM +#else +#define DISABLE_CFI_DLSYM DISABLE_CFI_ICALL +#endif +#endif +#if !defined(DISABLE_CFI_DLSYM) +#define DISABLE_CFI_DLSYM +#endif + +// Macro useful for writing cross-platform function pointers. +#if !defined(CDECL) +#if BUILDFLAG(IS_WIN) +#define CDECL __cdecl +#else // BUILDFLAG(IS_WIN) +#define CDECL +#endif // BUILDFLAG(IS_WIN) +#endif // !defined(CDECL) + +// Macro for hinting that an expression is likely to be false. +#if !defined(UNLIKELY) +#if defined(COMPILER_GCC) || defined(__clang__) +#define UNLIKELY(x) __builtin_expect(!!(x), 0) +#else +#define UNLIKELY(x) (x) +#endif // defined(COMPILER_GCC) +#endif // !defined(UNLIKELY) + +#if !defined(LIKELY) +#if defined(COMPILER_GCC) || defined(__clang__) +#define LIKELY(x) __builtin_expect(!!(x), 1) +#else +#define LIKELY(x) (x) +#endif // defined(COMPILER_GCC) +#endif // !defined(LIKELY) + +// Compiler feature-detection. +// clang.llvm.org/docs/LanguageExtensions.html#has-feature-and-has-extension +#if defined(__has_feature) +#define HAS_FEATURE(FEATURE) __has_feature(FEATURE) +#else +#define HAS_FEATURE(FEATURE) 0 +#endif + +#if defined(COMPILER_GCC) +#define PRETTY_FUNCTION __PRETTY_FUNCTION__ +#elif defined(COMPILER_MSVC) +#define PRETTY_FUNCTION __FUNCSIG__ +#else +// See https://en.cppreference.com/w/c/language/function_definition#func +#define PRETTY_FUNCTION __func__ +#endif + +#if !defined(CPU_ARM_NEON) +#if defined(__arm__) +#if !defined(__ARMEB__) && !defined(__ARM_EABI__) && !defined(__EABI__) && \ + !defined(__VFP_FP__) && !defined(_WIN32_WCE) && !defined(ANDROID) +#error Chromium does not support middle endian architecture +#endif +#if defined(__ARM_NEON__) +#define CPU_ARM_NEON 1 +#endif +#endif // defined(__arm__) +#endif // !defined(CPU_ARM_NEON) + +#if !defined(HAVE_MIPS_MSA_INTRINSICS) +#if defined(__mips_msa) && defined(__mips_isa_rev) && (__mips_isa_rev >= 5) +#define HAVE_MIPS_MSA_INTRINSICS 1 +#endif +#endif + +#if defined(__clang__) && HAS_ATTRIBUTE(uninitialized) +// Attribute "uninitialized" disables -ftrivial-auto-var-init=pattern for +// the specified variable. +// Library-wide alternative is +// 'configs -= [ "//build/config/compiler:default_init_stack_vars" ]' in .gn +// file. +// +// See "init_stack_vars" in build/config/compiler/BUILD.gn and +// http://crbug.com/977230 +// "init_stack_vars" is enabled for non-official builds and we hope to enable it +// in official build in 2020 as well. The flag writes fixed pattern into +// uninitialized parts of all local variables. In rare cases such initialization +// is undesirable and attribute can be used: +// 1. Degraded performance +// In most cases compiler is able to remove additional stores. E.g. if memory is +// never accessed or properly initialized later. Preserved stores mostly will +// not affect program performance. However if compiler failed on some +// performance critical code we can get a visible regression in a benchmark. +// 2. memset, memcpy calls +// Compiler may replaces some memory writes with memset or memcpy calls. This is +// not -ftrivial-auto-var-init specific, but it can happen more likely with the +// flag. It can be a problem if code is not linked with C run-time library. +// +// Note: The flag is security risk mitigation feature. So in future the +// attribute uses should be avoided when possible. However to enable this +// mitigation on the most of the code we need to be less strict now and minimize +// number of exceptions later. So if in doubt feel free to use attribute, but +// please document the problem for someone who is going to cleanup it later. +// E.g. platform, bot, benchmark or test name in patch description or next to +// the attribute. +#define STACK_UNINITIALIZED [[clang::uninitialized]] +#else +#define STACK_UNINITIALIZED +#endif + +// Attribute "no_stack_protector" disables -fstack-protector for the specified +// function. +// +// "stack_protector" is enabled on most POSIX builds. The flag adds a canary +// to each stack frame, which on function return is checked against a reference +// canary. If the canaries do not match, it's likely that a stack buffer +// overflow has occurred, so immediately crashing will prevent exploitation in +// many cases. +// +// In some cases it's desirable to remove this, e.g. on hot functions, or if +// we have purposely changed the reference canary. +#if defined(COMPILER_GCC) || defined(__clang__) +#if HAS_ATTRIBUTE(__no_stack_protector__) +#define NO_STACK_PROTECTOR __attribute__((__no_stack_protector__)) +#else +#define NO_STACK_PROTECTOR __attribute__((__optimize__("-fno-stack-protector"))) +#endif +#else +#define NO_STACK_PROTECTOR +#endif + +// The ANALYZER_ASSUME_TRUE(bool arg) macro adds compiler-specific hints +// to Clang which control what code paths are statically analyzed, +// and is meant to be used in conjunction with assert & assert-like functions. +// The expression is passed straight through if analysis isn't enabled. +// +// ANALYZER_SKIP_THIS_PATH() suppresses static analysis for the current +// codepath and any other branching codepaths that might follow. +#if defined(__clang_analyzer__) + +inline constexpr bool AnalyzerNoReturn() __attribute__((analyzer_noreturn)) { + return false; +} + +inline constexpr bool AnalyzerAssumeTrue(bool arg) { + // AnalyzerNoReturn() is invoked and analysis is terminated if |arg| is + // false. + return arg || AnalyzerNoReturn(); +} + +#define ANALYZER_ASSUME_TRUE(arg) ::AnalyzerAssumeTrue(!!(arg)) +#define ANALYZER_SKIP_THIS_PATH() static_cast(::AnalyzerNoReturn()) + +#else // !defined(__clang_analyzer__) + +#define ANALYZER_ASSUME_TRUE(arg) (arg) +#define ANALYZER_SKIP_THIS_PATH() + +#endif // defined(__clang_analyzer__) + +// Use nomerge attribute to disable optimization of merging multiple same calls. +#if defined(__clang__) && HAS_ATTRIBUTE(nomerge) +#define NOMERGE [[clang::nomerge]] +#else +#define NOMERGE +#endif + +// Marks a type as being eligible for the "trivial" ABI despite having a +// non-trivial destructor or copy/move constructor. Such types can be relocated +// after construction by simply copying their memory, which makes them eligible +// to be passed in registers. The canonical example is std::unique_ptr. +// +// Use with caution; this has some subtle effects on constructor/destructor +// ordering and will be very incorrect if the type relies on its address +// remaining constant. When used as a function argument (by value), the value +// may be constructed in the caller's stack frame, passed in a register, and +// then used and destructed in the callee's stack frame. A similar thing can +// occur when values are returned. +// +// TRIVIAL_ABI is not needed for types which have a trivial destructor and +// copy/move constructors, such as base::TimeTicks and other POD. +// +// It is also not likely to be effective on types too large to be passed in one +// or two registers on typical target ABIs. +// +// See also: +// https://clang.llvm.org/docs/AttributeReference.html#trivial-abi +// https://libcxx.llvm.org/docs/DesignDocs/UniquePtrTrivialAbi.html +#if defined(__clang__) && HAS_ATTRIBUTE(trivial_abi) +#define TRIVIAL_ABI [[clang::trivial_abi]] +#else +#define TRIVIAL_ABI +#endif + +// Marks a member function as reinitializing a moved-from variable. +// See also +// https://clang.llvm.org/extra/clang-tidy/checks/bugprone-use-after-move.html#reinitialization +#if defined(__clang__) && HAS_ATTRIBUTE(reinitializes) +#define REINITIALIZES_AFTER_MOVE [[clang::reinitializes]] +#else +#define REINITIALIZES_AFTER_MOVE +#endif + +// Requires constant initialization. See constinit in C++20. Allows to rely on a +// variable being initialized before execution, and not requiring a global +// constructor. +#if HAS_ATTRIBUTE(require_constant_initialization) +#define CONSTINIT __attribute__((require_constant_initialization)) +#endif +#if !defined(CONSTINIT) +#define CONSTINIT +#endif + +#if defined(__clang__) && (!defined(MOZ_ZUCCHINI) || __clang_major__ >= 13) +#define GSL_OWNER [[gsl::Owner]] +#define GSL_POINTER [[gsl::Pointer]] +#else +#define GSL_OWNER +#define GSL_POINTER +#endif + +// Adds the "logically_const" tag to a symbol's mangled name. The "Mutable +// Constants" check [1] detects instances of constants that aren't in .rodata, +// e.g. due to a missing `const`. Using this tag suppresses the check for this +// symbol, allowing it to live outside .rodata without a warning. +// +// [1]: +// https://crsrc.org/c/docs/speed/binary_size/android_binary_size_trybot.md#Mutable-Constants +#if defined(COMPILER_GCC) || defined(__clang__) +#define LOGICALLY_CONST [[gnu::abi_tag("logically_const")]] +#else +#define LOGICALLY_CONST +#endif + +// preserve_most clang's calling convention. Reduces register pressure for the +// caller and as such can be used for cold calls. Support for the +// "preserve_most" attribute is limited: +// - 32-bit platforms do not implement it, +// - component builds fail because _dl_runtime_resolve() clobbers registers, +// - there are crashes on arm64 on Windows (https://crbug.com/v8/14065), which +// can hopefully be fixed in the future. +// Additionally, the initial implementation in clang <= 16 overwrote the return +// register(s) in the epilogue of a preserve_most function, so we only use +// preserve_most in clang >= 17 (see https://reviews.llvm.org/D143425). +// See https://clang.llvm.org/docs/AttributeReference.html#preserve-most for +// more details. +#if defined(ARCH_CPU_64_BITS) && \ + !(BUILDFLAG(IS_WIN) && defined(ARCH_CPU_ARM64)) && \ + !defined(COMPONENT_BUILD) && defined(__clang__) && \ + __clang_major__ >= 17 && HAS_ATTRIBUTE(preserve_most) +#define PRESERVE_MOST __attribute__((preserve_most)) +#else +#define PRESERVE_MOST +#endif + +#endif // BASE_COMPILER_SPECIFIC_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/adapters.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/adapters.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/adapters.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/adapters.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,57 @@ +// Copyright 2014 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_ADAPTERS_H_ +#define BASE_CONTAINERS_ADAPTERS_H_ + +#include + +#include +#include + +#include "base/memory/raw_ptr_exclusion.h" + +namespace base { + +namespace internal { + +// Internal adapter class for implementing base::Reversed. +template +class ReversedAdapter { + public: + using Iterator = decltype(std::rbegin(std::declval())); + + explicit ReversedAdapter(T& t) : t_(t) {} + ReversedAdapter(const ReversedAdapter& ra) : t_(ra.t_) {} + ReversedAdapter& operator=(const ReversedAdapter&) = delete; + + Iterator begin() const { return std::rbegin(t_); } + Iterator end() const { return std::rend(t_); } + + private: + // Not a raw_ref<...> for performance reasons: on-stack pointer. + // It is only used inside for loops. Ideally, the container being iterated + // over should be the one held via a raw_ref/raw_ptrs. + RAW_PTR_EXCLUSION T& t_; +}; + +} // namespace internal + +// Reversed returns a container adapter usable in a range-based "for" statement +// for iterating a reversible container in reverse order. +// +// Example: +// +// std::vector v = ...; +// for (int i : base::Reversed(v)) { +// // iterates through v from back to front +// } +template +internal::ReversedAdapter Reversed(T& t) { + return internal::ReversedAdapter(t); +} + +} // namespace base + +#endif // BASE_CONTAINERS_ADAPTERS_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/checked_iterators.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/checked_iterators.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/checked_iterators.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/checked_iterators.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,299 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CHECKED_ITERATORS_H_ +#define BASE_CONTAINERS_CHECKED_ITERATORS_H_ + +#include +#include +#include + +#include "base/check_op.h" +#include "base/containers/util.h" +#include "base/memory/raw_ptr_exclusion.h" +#include "build/build_config.h" + +namespace base { + +template +class CheckedContiguousIterator { + public: + using difference_type = std::ptrdiff_t; + using value_type = std::remove_cv_t; + using pointer = T*; + using reference = T&; + using iterator_category = std::random_access_iterator_tag; +#if defined(__cpp_lib_ranges) + using iterator_concept = std::contiguous_iterator_tag; +#endif + + // Required for converting constructor below. + template + friend class CheckedContiguousIterator; + + // Required for certain libc++ algorithm optimizations that are not available + // for NaCl. + template + friend struct std::pointer_traits; + + constexpr CheckedContiguousIterator() = default; + + constexpr CheckedContiguousIterator(T* start, const T* end) + : CheckedContiguousIterator(start, start, end) {} + + constexpr CheckedContiguousIterator(const T* start, T* current, const T* end) + : start_(start), current_(current), end_(end) { + CHECK_LE(start, current); + CHECK_LE(current, end); + } + + constexpr CheckedContiguousIterator(const CheckedContiguousIterator& other) = + default; + + // Converting constructor allowing conversions like CCI to CCI, + // but disallowing CCI to CCI or CCI to CCI, which + // are unsafe. Furthermore, this is the same condition as used by the + // converting constructors of std::span and std::unique_ptr. + // See https://wg21.link/n4042 for details. + template < + typename U, + std::enable_if_t::value>* = nullptr> + constexpr CheckedContiguousIterator(const CheckedContiguousIterator& other) + : start_(other.start_), current_(other.current_), end_(other.end_) { + // We explicitly don't delegate to the 3-argument constructor here. Its + // CHECKs would be redundant, since we expect |other| to maintain its own + // invariant. However, DCHECKs never hurt anybody. Presumably. + DCHECK_LE(other.start_, other.current_); + DCHECK_LE(other.current_, other.end_); + } + + ~CheckedContiguousIterator() = default; + + constexpr CheckedContiguousIterator& operator=( + const CheckedContiguousIterator& other) = default; + + friend constexpr bool operator==(const CheckedContiguousIterator& lhs, + const CheckedContiguousIterator& rhs) { + lhs.CheckComparable(rhs); + return lhs.current_ == rhs.current_; + } + + friend constexpr bool operator!=(const CheckedContiguousIterator& lhs, + const CheckedContiguousIterator& rhs) { + lhs.CheckComparable(rhs); + return lhs.current_ != rhs.current_; + } + + friend constexpr bool operator<(const CheckedContiguousIterator& lhs, + const CheckedContiguousIterator& rhs) { + lhs.CheckComparable(rhs); + return lhs.current_ < rhs.current_; + } + + friend constexpr bool operator<=(const CheckedContiguousIterator& lhs, + const CheckedContiguousIterator& rhs) { + lhs.CheckComparable(rhs); + return lhs.current_ <= rhs.current_; + } + friend constexpr bool operator>(const CheckedContiguousIterator& lhs, + const CheckedContiguousIterator& rhs) { + lhs.CheckComparable(rhs); + return lhs.current_ > rhs.current_; + } + + friend constexpr bool operator>=(const CheckedContiguousIterator& lhs, + const CheckedContiguousIterator& rhs) { + lhs.CheckComparable(rhs); + return lhs.current_ >= rhs.current_; + } + + constexpr CheckedContiguousIterator& operator++() { + CHECK_NE(current_, end_); + ++current_; + return *this; + } + + constexpr CheckedContiguousIterator operator++(int) { + CheckedContiguousIterator old = *this; + ++*this; + return old; + } + + constexpr CheckedContiguousIterator& operator--() { + CHECK_NE(current_, start_); + --current_; + return *this; + } + + constexpr CheckedContiguousIterator operator--(int) { + CheckedContiguousIterator old = *this; + --*this; + return old; + } + + constexpr CheckedContiguousIterator& operator+=(difference_type rhs) { + if (rhs > 0) { + CHECK_LE(rhs, end_ - current_); + } else { + CHECK_LE(-rhs, current_ - start_); + } + current_ += rhs; + return *this; + } + + constexpr CheckedContiguousIterator operator+(difference_type rhs) const { + CheckedContiguousIterator it = *this; + it += rhs; + return it; + } + + constexpr friend CheckedContiguousIterator operator+( + difference_type lhs, + const CheckedContiguousIterator& rhs) { + return rhs + lhs; + } + + constexpr CheckedContiguousIterator& operator-=(difference_type rhs) { + if (rhs < 0) { + CHECK_LE(-rhs, end_ - current_); + } else { + CHECK_LE(rhs, current_ - start_); + } + current_ -= rhs; + return *this; + } + + constexpr CheckedContiguousIterator operator-(difference_type rhs) const { + CheckedContiguousIterator it = *this; + it -= rhs; + return it; + } + + constexpr friend difference_type operator-( + const CheckedContiguousIterator& lhs, + const CheckedContiguousIterator& rhs) { + lhs.CheckComparable(rhs); + return lhs.current_ - rhs.current_; + } + + constexpr reference operator*() const { + CHECK_NE(current_, end_); + return *current_; + } + + constexpr pointer operator->() const { + CHECK_NE(current_, end_); + return current_; + } + + constexpr reference operator[](difference_type rhs) const { + CHECK_GE(rhs, 0); + CHECK_LT(rhs, end_ - current_); + return current_[rhs]; + } + + [[nodiscard]] static bool IsRangeMoveSafe( + const CheckedContiguousIterator& from_begin, + const CheckedContiguousIterator& from_end, + const CheckedContiguousIterator& to) { + if (from_end < from_begin) + return false; + const auto from_begin_uintptr = get_uintptr(from_begin.current_); + const auto from_end_uintptr = get_uintptr(from_end.current_); + const auto to_begin_uintptr = get_uintptr(to.current_); + const auto to_end_uintptr = + get_uintptr((to + std::distance(from_begin, from_end)).current_); + + return to_begin_uintptr >= from_end_uintptr || + to_end_uintptr <= from_begin_uintptr; + } + + private: + constexpr void CheckComparable(const CheckedContiguousIterator& other) const { + CHECK_EQ(start_, other.start_); + CHECK_EQ(end_, other.end_); + } + + // This field is not a raw_ptr<> because it was filtered by the rewriter for: + // #union, #constexpr-ctor-field-initializer + RAW_PTR_EXCLUSION const T* start_ = nullptr; + // This field is not a raw_ptr<> because it was filtered by the rewriter for: + // #union, #constexpr-ctor-field-initializer + RAW_PTR_EXCLUSION T* current_ = nullptr; + // This field is not a raw_ptr<> because it was filtered by the rewriter for: + // #union, #constexpr-ctor-field-initializer + RAW_PTR_EXCLUSION const T* end_ = nullptr; +}; + +template +using CheckedContiguousConstIterator = CheckedContiguousIterator; + +} // namespace base + +// Specialize both std::__is_cpp17_contiguous_iterator and std::pointer_traits +// for CCI in case we compile with libc++ outside of NaCl. The former is +// required to enable certain algorithm optimizations (e.g. std::copy can be a +// simple std::memmove under certain circumstances), and is a precursor to +// C++20's std::contiguous_iterator concept [1]. Once we actually use C++20 it +// will be enough to add `using iterator_concept = std::contiguous_iterator_tag` +// to the iterator class [2], and we can get rid of this non-standard +// specialization. +// +// The latter is required to obtain the underlying raw pointer without resulting +// in CHECK failures. The important bit is the `to_address(pointer)` overload, +// which is the standard blessed way to customize `std::to_address(pointer)` in +// C++20 [3]. +// +// [1] https://wg21.link/iterator.concept.contiguous +// [2] https://wg21.link/std.iterator.tags +// [3] https://wg21.link/pointer.traits.optmem + +#if defined(_LIBCPP_VERSION) + +// TODO(crbug.com/1284275): Remove when C++20 is on by default, as the use +// of `iterator_concept` above should suffice. +_LIBCPP_BEGIN_NAMESPACE_STD + +// TODO(crbug.com/1449299): https://reviews.llvm.org/D150801 renamed this from +// `__is_cpp17_contiguous_iterator` to `__libcpp_is_contiguous_iterator`. Clean +// up the old spelling after libc++ rolls. +template +struct __is_cpp17_contiguous_iterator; +template +struct __is_cpp17_contiguous_iterator<::base::CheckedContiguousIterator> + : true_type {}; + +template +struct __libcpp_is_contiguous_iterator; +template +struct __libcpp_is_contiguous_iterator<::base::CheckedContiguousIterator> + : true_type {}; + +_LIBCPP_END_NAMESPACE_STD + +#endif + +namespace std { + +template +struct pointer_traits<::base::CheckedContiguousIterator> { + using pointer = ::base::CheckedContiguousIterator; + using element_type = T; + using difference_type = ptrdiff_t; + + template + using rebind = ::base::CheckedContiguousIterator; + + static constexpr pointer pointer_to(element_type& r) noexcept { + return pointer(&r, &r); + } + + static constexpr element_type* to_address(pointer p) noexcept { + return p.current_; + } +}; + +} // namespace std + +#endif // BASE_CONTAINERS_CHECKED_ITERATORS_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/circular_deque.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/circular_deque.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/circular_deque.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/circular_deque.h 2025-12-01 18:15:49.000000000 +0000 @@ -0,0 +1,1130 @@ +// Copyright 2017 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CIRCULAR_DEQUE_H_ +#define BASE_CONTAINERS_CIRCULAR_DEQUE_H_ + +#include +#include +#include +#include +#include + +#include "base/check.h" +#include "base/containers/vector_buffer.h" +#include "base/dcheck_is_on.h" +#include "base/memory/raw_ptr_exclusion.h" +#include "base/ranges/algorithm.h" +#include "base/template_util.h" + +#if DCHECK_IS_ON() +#include +#endif + +// base::circular_deque is similar to std::deque. Unlike std::deque, the +// storage is provided in a flat circular buffer conceptually similar to a +// vector. The beginning and end will wrap around as necessary so that +// pushes and pops will be constant time as long as a capacity expansion is +// not required. +// +// The API should be identical to std::deque with the following differences: +// +// - ITERATORS ARE NOT STABLE. Mutating the container will invalidate all +// iterators. +// +// - Insertions may resize the vector and so are not constant time (std::deque +// guarantees constant time for insertions at the ends). +// +// - Container-wide comparisons are not implemented. If you want to compare +// two containers, use an algorithm so the expensive iteration is explicit. +// +// If you want a similar container with only a queue API, use base::queue in +// base/containers/queue.h. +// +// Constructors: +// circular_deque(); +// circular_deque(size_t count); +// circular_deque(size_t count, const T& value); +// circular_deque(InputIterator first, InputIterator last); +// circular_deque(const circular_deque&); +// circular_deque(circular_deque&&); +// circular_deque(std::initializer_list); +// +// Assignment functions: +// circular_deque& operator=(const circular_deque&); +// circular_deque& operator=(circular_deque&&); +// circular_deque& operator=(std::initializer_list); +// void assign(size_t count, const T& value); +// void assign(InputIterator first, InputIterator last); +// void assign(std::initializer_list value); +// +// Random accessors: +// T& at(size_t); +// const T& at(size_t) const; +// T& operator[](size_t); +// const T& operator[](size_t) const; +// +// End accessors: +// T& front(); +// const T& front() const; +// T& back(); +// const T& back() const; +// +// Iterator functions: +// iterator begin(); +// const_iterator begin() const; +// const_iterator cbegin() const; +// iterator end(); +// const_iterator end() const; +// const_iterator cend() const; +// reverse_iterator rbegin(); +// const_reverse_iterator rbegin() const; +// const_reverse_iterator crbegin() const; +// reverse_iterator rend(); +// const_reverse_iterator rend() const; +// const_reverse_iterator crend() const; +// +// Memory management: +// void reserve(size_t); // SEE IMPLEMENTATION FOR SOME GOTCHAS. +// size_t capacity() const; +// void shrink_to_fit(); +// +// Size management: +// void clear(); +// bool empty() const; +// size_t size() const; +// void resize(size_t); +// void resize(size_t count, const T& value); +// +// Positional insert and erase: +// void insert(const_iterator pos, size_type count, const T& value); +// void insert(const_iterator pos, +// InputIterator first, InputIterator last); +// iterator insert(const_iterator pos, const T& value); +// iterator insert(const_iterator pos, T&& value); +// iterator emplace(const_iterator pos, Args&&... args); +// iterator erase(const_iterator pos); +// iterator erase(const_iterator first, const_iterator last); +// +// End insert and erase: +// void push_front(const T&); +// void push_front(T&&); +// void push_back(const T&); +// void push_back(T&&); +// T& emplace_front(Args&&...); +// T& emplace_back(Args&&...); +// void pop_front(); +// void pop_back(); +// +// General: +// void swap(circular_deque&); + +namespace base { + +template +class circular_deque; + +namespace internal { + +// Start allocating nonempty buffers with this many entries. This is the +// external capacity so the internal buffer will be one larger (= 4) which is +// more even for the allocator. See the descriptions of internal vs. external +// capacity on the comment above the buffer_ variable below. +constexpr size_t kCircularBufferInitialCapacity = 3; + +template +class circular_deque_const_iterator { + public: + using difference_type = std::ptrdiff_t; + using value_type = T; + using pointer = const T*; + using reference = const T&; + using iterator_category = std::random_access_iterator_tag; + + circular_deque_const_iterator() : parent_deque_(nullptr), index_(0) { +#if DCHECK_IS_ON() + created_generation_ = 0; +#endif // DCHECK_IS_ON() + } + + // Dereferencing. + const T& operator*() const { + CheckUnstableUsage(); + parent_deque_->CheckValidIndex(index_); + return parent_deque_->buffer_[index_]; + } + const T* operator->() const { + CheckUnstableUsage(); + parent_deque_->CheckValidIndex(index_); + return &parent_deque_->buffer_[index_]; + } + const value_type& operator[](difference_type i) const { return *(*this + i); } + + // Increment and decrement. + circular_deque_const_iterator& operator++() { + Increment(); + return *this; + } + circular_deque_const_iterator operator++(int) { + circular_deque_const_iterator ret = *this; + Increment(); + return ret; + } + circular_deque_const_iterator& operator--() { + Decrement(); + return *this; + } + circular_deque_const_iterator operator--(int) { + circular_deque_const_iterator ret = *this; + Decrement(); + return ret; + } + + // Random access mutation. + friend circular_deque_const_iterator operator+( + const circular_deque_const_iterator& iter, + difference_type offset) { + circular_deque_const_iterator ret = iter; + ret.Add(offset); + return ret; + } + circular_deque_const_iterator& operator+=(difference_type offset) { + Add(offset); + return *this; + } + friend circular_deque_const_iterator operator-( + const circular_deque_const_iterator& iter, + difference_type offset) { + circular_deque_const_iterator ret = iter; + ret.Add(-offset); + return ret; + } + circular_deque_const_iterator& operator-=(difference_type offset) { + Add(-offset); + return *this; + } + + friend std::ptrdiff_t operator-(const circular_deque_const_iterator& lhs, + const circular_deque_const_iterator& rhs) { + lhs.CheckComparable(rhs); + return static_cast(lhs.OffsetFromBegin() - + rhs.OffsetFromBegin()); + } + + // Comparisons. + friend bool operator==(const circular_deque_const_iterator& lhs, + const circular_deque_const_iterator& rhs) { + lhs.CheckComparable(rhs); + return lhs.index_ == rhs.index_; + } + friend bool operator!=(const circular_deque_const_iterator& lhs, + const circular_deque_const_iterator& rhs) { + return !(lhs == rhs); + } + friend bool operator<(const circular_deque_const_iterator& lhs, + const circular_deque_const_iterator& rhs) { + lhs.CheckComparable(rhs); + return lhs.OffsetFromBegin() < rhs.OffsetFromBegin(); + } + friend bool operator<=(const circular_deque_const_iterator& lhs, + const circular_deque_const_iterator& rhs) { + return !(lhs > rhs); + } + friend bool operator>(const circular_deque_const_iterator& lhs, + const circular_deque_const_iterator& rhs) { + lhs.CheckComparable(rhs); + return lhs.OffsetFromBegin() > rhs.OffsetFromBegin(); + } + friend bool operator>=(const circular_deque_const_iterator& lhs, + const circular_deque_const_iterator& rhs) { + return !(lhs < rhs); + } + + protected: + friend class circular_deque; + + circular_deque_const_iterator(const circular_deque* parent, size_t index) + : parent_deque_(parent), index_(index) { +#if DCHECK_IS_ON() + created_generation_ = parent->generation_; +#endif // DCHECK_IS_ON() + } + + // Returns the offset from the beginning index of the buffer to the current + // item. + size_t OffsetFromBegin() const { + if (index_ >= parent_deque_->begin_) + return index_ - parent_deque_->begin_; // On the same side as begin. + return parent_deque_->buffer_.capacity() - parent_deque_->begin_ + index_; + } + + // Most uses will be ++ and -- so use a simplified implementation. + void Increment() { + CheckUnstableUsage(); + parent_deque_->CheckValidIndex(index_); + index_++; + if (index_ == parent_deque_->buffer_.capacity()) + index_ = 0; + } + void Decrement() { + CheckUnstableUsage(); + parent_deque_->CheckValidIndexOrEnd(index_); + if (index_ == 0) + index_ = parent_deque_->buffer_.capacity() - 1; + else + index_--; + } + void Add(difference_type delta) { + CheckUnstableUsage(); +#if DCHECK_IS_ON() + if (delta <= 0) + parent_deque_->CheckValidIndexOrEnd(index_); + else + parent_deque_->CheckValidIndex(index_); +#endif + // It should be valid to add 0 to any iterator, even if the container is + // empty and the iterator points to end(). The modulo below will divide + // by 0 if the buffer capacity is empty, so it's important to check for + // this case explicitly. + if (delta == 0) + return; + + difference_type new_offset = OffsetFromBegin() + delta; + DCHECK(new_offset >= 0 && + new_offset <= static_cast(parent_deque_->size())); + index_ = (new_offset + parent_deque_->begin_) % + parent_deque_->buffer_.capacity(); + } + +#if DCHECK_IS_ON() + void CheckUnstableUsage() const { + DCHECK(parent_deque_); + // Since circular_deque doesn't guarantee stability, any attempt to + // dereference this iterator after a mutation (i.e. the generation doesn't + // match the original) in the container is illegal. + DCHECK(created_generation_ == parent_deque_->generation_) + << "circular_deque iterator dereferenced after mutation."; + } + void CheckComparable(const circular_deque_const_iterator& other) const { + DCHECK(parent_deque_ == other.parent_deque_); + // Since circular_deque doesn't guarantee stability, two iterators that + // are compared must have been generated without mutating the container. + // If this fires, the container was mutated between generating the two + // iterators being compared. + DCHECK(created_generation_ == other.created_generation_); + } +#else + inline void CheckUnstableUsage() const {} + inline void CheckComparable(const circular_deque_const_iterator&) const {} +#endif // DCHECK_IS_ON() + + // `parent_deque_` is not a raw_ptr<...> for performance reasons: Usually + // on-stack pointer, pointing back to the collection being iterated, owned by + // object that iterates over it. Additionally this is supported by the + // analysis of sampling profiler data and tab_search:top100:2020. + RAW_PTR_EXCLUSION const circular_deque* parent_deque_; + + size_t index_; + +#if DCHECK_IS_ON() + // The generation of the parent deque when this iterator was created. The + // container will update the generation for every modification so we can + // test if the container was modified by comparing them. + uint64_t created_generation_; +#endif // DCHECK_IS_ON() +}; + +template +class circular_deque_iterator : public circular_deque_const_iterator { + using base = circular_deque_const_iterator; + + public: + friend class circular_deque; + + using difference_type = std::ptrdiff_t; + using value_type = T; + using pointer = T*; + using reference = T&; + using iterator_category = std::random_access_iterator_tag; + + // Expose the base class' constructor. + circular_deque_iterator() : circular_deque_const_iterator() {} + + // Dereferencing. + T& operator*() const { return const_cast(base::operator*()); } + T* operator->() const { return const_cast(base::operator->()); } + T& operator[](difference_type i) { + return const_cast(base::operator[](i)); + } + + // Random access mutation. + friend circular_deque_iterator operator+(const circular_deque_iterator& iter, + difference_type offset) { + circular_deque_iterator ret = iter; + ret.Add(offset); + return ret; + } + circular_deque_iterator& operator+=(difference_type offset) { + base::Add(offset); + return *this; + } + friend circular_deque_iterator operator-(const circular_deque_iterator& iter, + difference_type offset) { + circular_deque_iterator ret = iter; + ret.Add(-offset); + return ret; + } + circular_deque_iterator& operator-=(difference_type offset) { + base::Add(-offset); + return *this; + } + + // Increment and decrement. + circular_deque_iterator& operator++() { + base::Increment(); + return *this; + } + circular_deque_iterator operator++(int) { + circular_deque_iterator ret = *this; + base::Increment(); + return ret; + } + circular_deque_iterator& operator--() { + base::Decrement(); + return *this; + } + circular_deque_iterator operator--(int) { + circular_deque_iterator ret = *this; + base::Decrement(); + return ret; + } + + private: + circular_deque_iterator(const circular_deque* parent, size_t index) + : circular_deque_const_iterator(parent, index) {} +}; + +} // namespace internal + +template +class circular_deque { + private: + using VectorBuffer = internal::VectorBuffer; + + public: + using value_type = T; + using size_type = std::size_t; + using difference_type = std::ptrdiff_t; + using reference = value_type&; + using const_reference = const value_type&; + using pointer = value_type*; + using const_pointer = const value_type*; + + using iterator = internal::circular_deque_iterator; + using const_iterator = internal::circular_deque_const_iterator; + using reverse_iterator = std::reverse_iterator; + using const_reverse_iterator = std::reverse_iterator; + + // --------------------------------------------------------------------------- + // Constructor + + constexpr circular_deque() = default; + + // Constructs with |count| copies of |value| or default constructed version. + explicit circular_deque(size_type count) { resize(count); } + circular_deque(size_type count, const T& value) { resize(count, value); } + + // Range constructor. + template + circular_deque(InputIterator first, InputIterator last) { + assign(first, last); + } + + // Copy/move. + circular_deque(const circular_deque& other) : buffer_(other.size() + 1) { + assign(other.begin(), other.end()); + } + circular_deque(circular_deque&& other) noexcept + : buffer_(std::move(other.buffer_)), + begin_(other.begin_), + end_(other.end_) { + other.begin_ = 0; + other.end_ = 0; + } + + circular_deque(std::initializer_list init) { assign(init); } + + ~circular_deque() { DestructRange(begin_, end_); } + + // --------------------------------------------------------------------------- + // Assignments. + // + // All of these may invalidate iterators and references. + + circular_deque& operator=(const circular_deque& other) { + if (&other == this) + return *this; + + reserve(other.size()); + assign(other.begin(), other.end()); + return *this; + } + circular_deque& operator=(circular_deque&& other) noexcept { + if (&other == this) + return *this; + + // We're about to overwrite the buffer, so don't free it in clear to + // avoid doing it twice. + ClearRetainCapacity(); + buffer_ = std::move(other.buffer_); + begin_ = other.begin_; + end_ = other.end_; + + other.begin_ = 0; + other.end_ = 0; + + IncrementGeneration(); + return *this; + } + circular_deque& operator=(std::initializer_list ilist) { + reserve(ilist.size()); + assign(std::begin(ilist), std::end(ilist)); + return *this; + } + + void assign(size_type count, const value_type& value) { + ClearRetainCapacity(); + reserve(count); + for (size_t i = 0; i < count; i++) + emplace_back(value); + IncrementGeneration(); + } + + // This variant should be enabled only when InputIterator is an iterator. + template + typename std::enable_if<::base::internal::is_iterator::value, + void>::type + assign(InputIterator first, InputIterator last) { + // Possible future enhancement, dispatch on iterator tag type. For forward + // iterators we can use std::difference to preallocate the space required + // and only do one copy. + ClearRetainCapacity(); + for (; first != last; ++first) + emplace_back(*first); + IncrementGeneration(); + } + + void assign(std::initializer_list value) { + reserve(std::distance(value.begin(), value.end())); + assign(value.begin(), value.end()); + } + + // --------------------------------------------------------------------------- + // Accessors. + // + // Since this class assumes no exceptions, at() and operator[] are equivalent. + + const value_type& at(size_type i) const { + DCHECK(i < size()); + size_t right_size = buffer_.capacity() - begin_; + if (begin_ <= end_ || i < right_size) + return buffer_[begin_ + i]; + return buffer_[i - right_size]; + } + value_type& at(size_type i) { + return const_cast(std::as_const(*this).at(i)); + } + + value_type& operator[](size_type i) { + return const_cast(std::as_const(*this)[i]); + } + + const value_type& operator[](size_type i) const { return at(i); } + + value_type& front() { + DCHECK(!empty()); + return buffer_[begin_]; + } + const value_type& front() const { + DCHECK(!empty()); + return buffer_[begin_]; + } + + value_type& back() { + DCHECK(!empty()); + return *(--end()); + } + const value_type& back() const { + DCHECK(!empty()); + return *(--end()); + } + + // --------------------------------------------------------------------------- + // Iterators. + + iterator begin() { return iterator(this, begin_); } + const_iterator begin() const { return const_iterator(this, begin_); } + const_iterator cbegin() const { return const_iterator(this, begin_); } + + iterator end() { return iterator(this, end_); } + const_iterator end() const { return const_iterator(this, end_); } + const_iterator cend() const { return const_iterator(this, end_); } + + reverse_iterator rbegin() { return reverse_iterator(end()); } + const_reverse_iterator rbegin() const { + return const_reverse_iterator(end()); + } + const_reverse_iterator crbegin() const { return rbegin(); } + + reverse_iterator rend() { return reverse_iterator(begin()); } + const_reverse_iterator rend() const { + return const_reverse_iterator(begin()); + } + const_reverse_iterator crend() const { return rend(); } + + // --------------------------------------------------------------------------- + // Memory management. + + // IMPORTANT NOTE ON reserve(...): This class implements auto-shrinking of + // the buffer when elements are deleted and there is "too much" wasted space. + // So if you call reserve() with a large size in anticipation of pushing many + // elements, but pop an element before the queue is full, the capacity you + // reserved may be lost. + // + // As a result, it's only worthwhile to call reserve() when you're adding + // many things at once with no intermediate operations. + void reserve(size_type new_capacity) { + if (new_capacity > capacity()) + SetCapacityTo(new_capacity); + } + + size_type capacity() const { + // One item is wasted to indicate end(). + return buffer_.capacity() == 0 ? 0 : buffer_.capacity() - 1; + } + + void shrink_to_fit() { + if (empty()) { + // Optimize empty case to really delete everything if there was + // something. + if (buffer_.capacity()) + buffer_ = VectorBuffer(); + } else { + SetCapacityTo(size()); + } + } + + // --------------------------------------------------------------------------- + // Size management. + + // This will additionally reset the capacity() to 0. + void clear() { + // This can't resize(0) because that requires a default constructor to + // compile, which not all contained classes may implement. + ClearRetainCapacity(); + buffer_ = VectorBuffer(); + } + + bool empty() const { return begin_ == end_; } + + size_type size() const { + if (begin_ <= end_) + return end_ - begin_; + return buffer_.capacity() - begin_ + end_; + } + + // When reducing size, the elements are deleted from the end. When expanding + // size, elements are added to the end with |value| or the default + // constructed version. Even when using resize(count) to shrink, a default + // constructor is required for the code to compile, even though it will not + // be called. + // + // There are two versions rather than using a default value to avoid + // creating a temporary when shrinking (when it's not needed). Plus if + // the default constructor is desired when expanding usually just calling it + // for each element is faster than making a default-constructed temporary and + // copying it. + void resize(size_type count) { + // SEE BELOW VERSION if you change this. The code is mostly the same. + if (count > size()) { + // This could be slighly more efficient but expanding a queue with + // identical elements is unusual and the extra computations of emplacing + // one-by-one will typically be small relative to calling the constructor + // for every item. + ExpandCapacityIfNecessary(count - size()); + while (size() < count) + emplace_back(); + } else if (count < size()) { + size_t new_end = (begin_ + count) % buffer_.capacity(); + DestructRange(new_end, end_); + end_ = new_end; + + ShrinkCapacityIfNecessary(); + } + IncrementGeneration(); + } + void resize(size_type count, const value_type& value) { + // SEE ABOVE VERSION if you change this. The code is mostly the same. + if (count > size()) { + ExpandCapacityIfNecessary(count - size()); + while (size() < count) + emplace_back(value); + } else if (count < size()) { + size_t new_end = (begin_ + count) % buffer_.capacity(); + DestructRange(new_end, end_); + end_ = new_end; + + ShrinkCapacityIfNecessary(); + } + IncrementGeneration(); + } + + // --------------------------------------------------------------------------- + // Insert and erase. + // + // Insertion and deletion in the middle is O(n) and invalidates all existing + // iterators. + // + // The implementation of insert isn't optimized as much as it could be. If + // the insertion requires that the buffer be grown, it will first be grown + // and everything moved, and then the items will be inserted, potentially + // moving some items twice. This simplifies the implemntation substantially + // and means less generated templatized code. Since this is an uncommon + // operation for deques, and already relatively slow, it doesn't seem worth + // the benefit to optimize this. + + void insert(const_iterator pos, size_type count, const T& value) { + ValidateIterator(pos); + + // Optimize insert at the beginning. + if (pos == begin()) { + ExpandCapacityIfNecessary(count); + for (size_t i = 0; i < count; i++) + push_front(value); + return; + } + + iterator insert_cur(this, pos.index_); + iterator insert_end; + MakeRoomFor(count, &insert_cur, &insert_end); + while (insert_cur < insert_end) { + new (&buffer_[insert_cur.index_]) T(value); + ++insert_cur; + } + + IncrementGeneration(); + } + + // This enable_if keeps this call from getting confused with the (pos, count, + // value) version when value is an integer. + template + typename std::enable_if<::base::internal::is_iterator::value, + void>::type + insert(const_iterator pos, InputIterator first, InputIterator last) { + ValidateIterator(pos); + + const difference_type inserted_items_signed = std::distance(first, last); + if (inserted_items_signed == 0) + return; // Can divide by 0 when doing modulo below, so return early. + CHECK(inserted_items_signed > 0); + const size_type inserted_items = + static_cast(inserted_items_signed); + + // Make a hole to copy the items into. + iterator insert_cur; + iterator insert_end; + if (pos == begin()) { + // Optimize insert at the beginning, nothing needs to be shifted and the + // hole is the |inserted_items| block immediately before |begin_|. + ExpandCapacityIfNecessary(inserted_items); + insert_end = begin(); + begin_ = + (begin_ + buffer_.capacity() - inserted_items) % buffer_.capacity(); + insert_cur = begin(); + } else { + insert_cur = iterator(this, pos.index_); + MakeRoomFor(inserted_items, &insert_cur, &insert_end); + } + + // Copy the items. + while (insert_cur < insert_end) { + new (&buffer_[insert_cur.index_]) T(*first); + ++insert_cur; + ++first; + } + + IncrementGeneration(); + } + + // These all return an iterator to the inserted item. Existing iterators will + // be invalidated. + iterator insert(const_iterator pos, const T& value) { + return emplace(pos, value); + } + iterator insert(const_iterator pos, T&& value) { + return emplace(pos, std::move(value)); + } + template + iterator emplace(const_iterator pos, Args&&... args) { + ValidateIterator(pos); + + // Optimize insert at beginning which doesn't require shifting. + if (pos == cbegin()) { + emplace_front(std::forward(args)...); + return begin(); + } + + // Do this before we make the new iterators we return. + IncrementGeneration(); + + iterator insert_begin(this, pos.index_); + iterator insert_end; + MakeRoomFor(1, &insert_begin, &insert_end); + new (&buffer_[insert_begin.index_]) T(std::forward(args)...); + + return insert_begin; + } + + // Calling erase() won't automatically resize the buffer smaller like resize + // or the pop functions. Erase is slow and relatively uncommon, and for + // normal deque usage a pop will normally be done on a regular basis that + // will prevent excessive buffer usage over long periods of time. It's not + // worth having the extra code for every template instantiation of erase() + // to resize capacity downward to a new buffer. + iterator erase(const_iterator pos) { return erase(pos, pos + 1); } + iterator erase(const_iterator first, const_iterator last) { + ValidateIterator(first); + ValidateIterator(last); + + IncrementGeneration(); + + // First, call the destructor on the deleted items. + if (first.index_ == last.index_) { + // Nothing deleted. Need to return early to avoid falling through to + // moving items on top of themselves. + return iterator(this, first.index_); + } else if (first.index_ < last.index_) { + // Contiguous range. + buffer_.DestructRange(&buffer_[first.index_], &buffer_[last.index_]); + } else { + // Deleted range wraps around. + buffer_.DestructRange(&buffer_[first.index_], + &buffer_[buffer_.capacity()]); + buffer_.DestructRange(&buffer_[0], &buffer_[last.index_]); + } + + if (first.index_ == begin_) { + // This deletion is from the beginning. Nothing needs to be copied, only + // begin_ needs to be updated. + begin_ = last.index_; + return iterator(this, last.index_); + } + + // In an erase operation, the shifted items all move logically to the left, + // so move them from left-to-right. + iterator move_src(this, last.index_); + iterator move_src_end = end(); + iterator move_dest(this, first.index_); + for (; move_src < move_src_end; move_src++, move_dest++) { + buffer_.MoveRange(&buffer_[move_src.index_], + &buffer_[move_src.index_ + 1], + &buffer_[move_dest.index_]); + } + + end_ = move_dest.index_; + + // Since we did not reallocate and only changed things after the erase + // element(s), the input iterator's index points to the thing following the + // deletion. + return iterator(this, first.index_); + } + + // --------------------------------------------------------------------------- + // Begin/end operations. + + void push_front(const T& value) { emplace_front(value); } + void push_front(T&& value) { emplace_front(std::move(value)); } + + void push_back(const T& value) { emplace_back(value); } + void push_back(T&& value) { emplace_back(std::move(value)); } + + template + reference emplace_front(Args&&... args) { + ExpandCapacityIfNecessary(1); + if (begin_ == 0) + begin_ = buffer_.capacity() - 1; + else + begin_--; + IncrementGeneration(); + new (&buffer_[begin_]) T(std::forward(args)...); + return front(); + } + + template + reference emplace_back(Args&&... args) { + ExpandCapacityIfNecessary(1); + new (&buffer_[end_]) T(std::forward(args)...); + if (end_ == buffer_.capacity() - 1) + end_ = 0; + else + end_++; + IncrementGeneration(); + return back(); + } + + void pop_front() { + DCHECK(size()); + buffer_.DestructRange(&buffer_[begin_], &buffer_[begin_ + 1]); + begin_++; + if (begin_ == buffer_.capacity()) + begin_ = 0; + + ShrinkCapacityIfNecessary(); + + // Technically popping will not invalidate any iterators since the + // underlying buffer will be stable. But in the future we may want to add a + // feature that resizes the buffer smaller if there is too much wasted + // space. This ensures we can make such a change safely. + IncrementGeneration(); + } + void pop_back() { + DCHECK(size()); + if (end_ == 0) + end_ = buffer_.capacity() - 1; + else + end_--; + buffer_.DestructRange(&buffer_[end_], &buffer_[end_ + 1]); + + ShrinkCapacityIfNecessary(); + + // See pop_front comment about why this is here. + IncrementGeneration(); + } + + // --------------------------------------------------------------------------- + // General operations. + + void swap(circular_deque& other) { + std::swap(buffer_, other.buffer_); + std::swap(begin_, other.begin_); + std::swap(end_, other.end_); + IncrementGeneration(); + } + + friend void swap(circular_deque& lhs, circular_deque& rhs) { lhs.swap(rhs); } + + private: + friend internal::circular_deque_iterator; + friend internal::circular_deque_const_iterator; + + // Moves the items in the given circular buffer to the current one. The + // source is moved from so will become invalid. The destination buffer must + // have already been allocated with enough size. + static void MoveBuffer(VectorBuffer& from_buf, + size_t from_begin, + size_t from_end, + VectorBuffer* to_buf, + size_t* to_begin, + size_t* to_end) { + size_t from_capacity = from_buf.capacity(); + + *to_begin = 0; + if (from_begin < from_end) { + // Contiguous. + from_buf.MoveRange(&from_buf[from_begin], &from_buf[from_end], + to_buf->begin()); + *to_end = from_end - from_begin; + } else if (from_begin > from_end) { + // Discontiguous, copy the right side to the beginning of the new buffer. + from_buf.MoveRange(&from_buf[from_begin], &from_buf[from_capacity], + to_buf->begin()); + size_t right_size = from_capacity - from_begin; + // Append the left side. + from_buf.MoveRange(&from_buf[0], &from_buf[from_end], + &(*to_buf)[right_size]); + *to_end = right_size + from_end; + } else { + // No items. + *to_end = 0; + } + } + + // Expands the buffer size. This assumes the size is larger than the + // number of elements in the vector (it won't call delete on anything). + void SetCapacityTo(size_t new_capacity) { + // Use the capacity + 1 as the internal buffer size to differentiate + // empty and full (see definition of buffer_ below). + VectorBuffer new_buffer(new_capacity + 1); + MoveBuffer(buffer_, begin_, end_, &new_buffer, &begin_, &end_); + buffer_ = std::move(new_buffer); + } + void ExpandCapacityIfNecessary(size_t additional_elts) { + size_t min_new_capacity = size() + additional_elts; + if (capacity() >= min_new_capacity) + return; // Already enough room. + + min_new_capacity = + std::max(min_new_capacity, internal::kCircularBufferInitialCapacity); + + // std::vector always grows by at least 50%. WTF::Deque grows by at least + // 25%. We expect queue workloads to generally stay at a similar size and + // grow less than a vector might, so use 25%. + size_t new_capacity = + std::max(min_new_capacity, capacity() + capacity() / 4); + SetCapacityTo(new_capacity); + } + + void ShrinkCapacityIfNecessary() { + // Don't auto-shrink below this size. + if (capacity() <= internal::kCircularBufferInitialCapacity) + return; + + // Shrink when 100% of the size() is wasted. + size_t sz = size(); + size_t empty_spaces = capacity() - sz; + if (empty_spaces < sz) + return; + + // Leave 1/4 the size as free capacity, not going below the initial + // capacity. + size_t new_capacity = + std::max(internal::kCircularBufferInitialCapacity, sz + sz / 4); + if (new_capacity < capacity()) { + // Count extra item to convert to internal capacity. + SetCapacityTo(new_capacity); + } + } + + // Backend for clear() but does not resize the internal buffer. + void ClearRetainCapacity() { + // This can't resize(0) because that requires a default constructor to + // compile, which not all contained classes may implement. + DestructRange(begin_, end_); + begin_ = 0; + end_ = 0; + IncrementGeneration(); + } + + // Calls destructors for the given begin->end indices. The indices may wrap + // around. The buffer is not resized, and the begin_ and end_ members are + // not changed. + void DestructRange(size_t begin, size_t end) { + if (end == begin) { + return; + } else if (end > begin) { + buffer_.DestructRange(&buffer_[begin], &buffer_[end]); + } else { + buffer_.DestructRange(&buffer_[begin], &buffer_[buffer_.capacity()]); + buffer_.DestructRange(&buffer_[0], &buffer_[end]); + } + } + + // Makes room for |count| items starting at |*insert_begin|. Since iterators + // are not stable across buffer resizes, |*insert_begin| will be updated to + // point to the beginning of the newly opened position in the new array (it's + // in/out), and the end of the newly opened position (it's out-only). + void MakeRoomFor(size_t count, iterator* insert_begin, iterator* insert_end) { + if (count == 0) { + *insert_end = *insert_begin; + return; + } + + // The offset from the beginning will be stable across reallocations. + size_t begin_offset = insert_begin->OffsetFromBegin(); + ExpandCapacityIfNecessary(count); + + insert_begin->index_ = (begin_ + begin_offset) % buffer_.capacity(); + *insert_end = + iterator(this, (insert_begin->index_ + count) % buffer_.capacity()); + + // Update the new end and prepare the iterators for copying. + iterator src = end(); + end_ = (end_ + count) % buffer_.capacity(); + iterator dest = end(); + + // Move the elements. This will always involve shifting logically to the + // right, so move in a right-to-left order. + while (true) { + if (src == *insert_begin) + break; + --src; + --dest; + buffer_.MoveRange(&buffer_[src.index_], &buffer_[src.index_ + 1], + &buffer_[dest.index_]); + } + } + +#if DCHECK_IS_ON() + // Asserts the given index is dereferencable. The index is an index into the + // buffer, not an index used by operator[] or at() which will be offsets from + // begin. + void CheckValidIndex(size_t i) const { + if (begin_ <= end_) + DCHECK(i >= begin_ && i < end_); + else + DCHECK((i >= begin_ && i < buffer_.capacity()) || i < end_); + } + + // Asserts the given index is either dereferencable or points to end(). + void CheckValidIndexOrEnd(size_t i) const { + if (i != end_) + CheckValidIndex(i); + } + + void ValidateIterator(const const_iterator& i) const { + DCHECK(i.parent_deque_ == this); + i.CheckUnstableUsage(); + } + + // See generation_ below. + void IncrementGeneration() { generation_++; } +#else + // No-op versions of these functions for release builds. + void CheckValidIndex(size_t) const {} + void CheckValidIndexOrEnd(size_t) const {} + void ValidateIterator(const const_iterator& i) const {} + void IncrementGeneration() {} +#endif + + // Danger, the buffer_.capacity() is the "internal capacity" which is + // capacity() + 1 since there is an extra item to indicate the end. Otherwise + // being completely empty and completely full are indistinguishable (begin == + // end). We could add a separate flag to avoid it, but that adds significant + // extra complexity since every computation will have to check for it. Always + // keeping one extra unused element in the buffer makes iterator computations + // much simpler. + // + // Container internal code will want to use buffer_.capacity() for offset + // computations rather than capacity(). + VectorBuffer buffer_; + size_type begin_ = 0; + size_type end_ = 0; + +#if DCHECK_IS_ON() + // Incremented every time a modification is made that could affect iterator + // invalidations. + uint64_t generation_ = 0; +#endif +}; + +// Implementations of base::Erase[If] (see base/stl_util.h). +template +size_t Erase(circular_deque& container, const Value& value) { + auto it = ranges::remove(container, value); + size_t removed = std::distance(it, container.end()); + container.erase(it, container.end()); + return removed; +} + +template +size_t EraseIf(circular_deque& container, Predicate pred) { + auto it = ranges::remove_if(container, pred); + size_t removed = std::distance(it, container.end()); + container.erase(it, container.end()); + return removed; +} + +} // namespace base + +#endif // BASE_CONTAINERS_CIRCULAR_DEQUE_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/contains.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/contains.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/contains.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/contains.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,97 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CONTAINS_H_ +#define BASE_CONTAINERS_CONTAINS_H_ + +#include +#include + +#include "base/ranges/algorithm.h" +#include "base/ranges/ranges.h" + +namespace base { + +namespace internal { + +// Small helper to detect whether a given type has a nested `key_type` typedef. +// Used below to catch misuses of the API for associative containers. +template +struct HasKeyType : std::false_type {}; + +template +struct HasKeyType> : std::true_type {}; + +// Probe whether a `contains` member function exists and return the result of +// `container.contains(value)` if this is a valid expression. This is the +// highest priority option. +template +constexpr auto ContainsImpl(const Container& container, + const Value& value, + priority_tag<2>) + -> decltype(container.contains(value)) { + return container.contains(value); +} + +// Probe whether a `find` member function exists and whether its return value +// can be compared with `container.end()`. Intended for STL style maps and sets +// that lack a `contains` member function. +template +constexpr auto ContainsImpl(const Container& container, + const Value& value, + priority_tag<1>) + -> decltype(container.find(value) != container.end()) { + return container.find(value) != container.end(); +} + +// Probe whether a `find` member function exists and whether its return value +// can be compared with `Container::npos`. Intended for STL style strings that +// lack a `contains` member function. +template +constexpr auto ContainsImpl(const Container& container, + const Value& value, + priority_tag<1>) + -> decltype(container.find(value) != Container::npos) { + return container.find(value) != Container::npos; +} + +// Generic fallback option, using a linear search over `container` to find +// `value`. Has the lowest priority. This will not compile for associative +// containers, as this likely is a performance bug. +template +constexpr bool ContainsImpl(const Container& container, + const Value& value, + priority_tag<0>) { + static_assert( + !HasKeyType::value, + "Error: About to perform linear search on an associative container. " + "Either use a more generic comparator (e.g. std::less<>) or, if a linear " + "search is desired, provide an explicit projection parameter."); + return ranges::find(container, value) != ranges::end(container); +} + +} // namespace internal + +// A general purpose utility to check whether `container` contains `value`. This +// will probe whether a `contains` or `find` member function on `container` +// exists, and fall back to a generic linear search over `container`. +template +constexpr bool Contains(const Container& container, const Value& value) { + return internal::ContainsImpl(container, value, internal::priority_tag<2>()); +} + +// Overload that allows to provide an additional projection invocable. This +// projection will be applied to every element in `container` before comparing +// it with `value`. This will always perform a linear search. +template +constexpr bool Contains(const Container& container, + const Value& value, + Proj proj) { + return ranges::find(container, value, std::move(proj)) != + ranges::end(container); +} + +} // namespace base + +#endif // BASE_CONTAINERS_CONTAINS_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/contiguous_iterator.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/contiguous_iterator.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/contiguous_iterator.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/contiguous_iterator.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,108 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CONTIGUOUS_ITERATOR_H_ +#define BASE_CONTAINERS_CONTIGUOUS_ITERATOR_H_ + +#include +#include +#include +#include +#include + +#include "base/containers/checked_iterators.h" + +namespace base { + +namespace internal { + +template +struct PointsToObject : std::true_type {}; +// std::iter_value_t is not defined for `T*` where T is not an object type. +template +struct PointsToObject : std::is_object {}; + +// A pointer is a contiguous iterator. +// Reference: https://wg21.link/iterator.traits#5 +template +struct IsPointer : std::is_pointer {}; + +template >> +struct IsStringIterImpl + : std::disjunction, + std::is_same> {}; + +// An iterator to std::basic_string is contiguous. +// Reference: https://wg21.link/basic.string.general#2 +// +// Note: Requires indirection via `IsStringIterImpl` to avoid triggering a +// `static_assert(is_trivial_v)` inside libc++'s std::basic_string. +template +struct IsStringIter + : std::conjunction>, IsStringIterImpl> { +}; + +// An iterator to std::array is contiguous. +// Reference: https://wg21.link/array.overview#1 +template , 1>> +struct IsArrayIter + : std::disjunction, + std::is_same> {}; + +// An iterator to a non-bool std::vector is contiguous. +// Reference: https://wg21.link/vector.overview#2 +template >> +struct IsVectorIter + : std::conjunction< + std::negation, bool>>, + std::disjunction, + std::is_same>> {}; + +// The result of passing a std::valarray to std::begin is a contiguous iterator. +// Note: Since all common standard library implementations (i.e. libc++, +// stdlibc++ and MSVC's STL) just use a pointer here, we perform a similar +// optimization. The corresponding unittest still ensures that this is working +// as intended. +// Reference: https://wg21.link/valarray.range#1 +template +struct IsValueArrayIter : std::is_pointer {}; + +// base's CheckedContiguousIterator is a contiguous iterator. +template > +struct IsCheckedContiguousIter + : std::disjunction< + std::is_same>, + std::is_same>> {}; + +// Check that the iterator points to an actual object, and is one of the +// iterator types mentioned above. +template ::value> +struct IsContiguousIteratorImpl : std::false_type {}; +template +struct IsContiguousIteratorImpl + : std::disjunction, + IsStringIter, + IsArrayIter, + IsVectorIter, + IsValueArrayIter, + IsCheckedContiguousIter> {}; + +} // namespace internal + +// IsContiguousIterator is a type trait that determines whether a given type is +// a contiguous iterator. It is similar to C++20's contiguous_iterator concept, +// but due to a lack of the corresponding contiguous_iterator_tag relies on +// explicitly instantiating the type with iterators that are supposed to be +// contiguous iterators. +// References: +// - https://wg21.link/iterator.concept.contiguous +// - https://wg21.link/std.iterator.tags#lib:contiguous_iterator_tag +// - https://wg21.link/n4284 +template +struct IsContiguousIterator + : internal::IsContiguousIteratorImpl> {}; + +} // namespace base + +#endif // BASE_CONTAINERS_CONTIGUOUS_ITERATOR_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,33 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CXX20_ERASE_H_ +#define BASE_CONTAINERS_CXX20_ERASE_H_ + +#include "base/containers/cxx20_erase_deque.h" +#include "base/containers/cxx20_erase_forward_list.h" +#include "base/containers/cxx20_erase_list.h" +#include "base/containers/cxx20_erase_map.h" +#include "base/containers/cxx20_erase_set.h" +#include "base/containers/cxx20_erase_string.h" +#include "base/containers/cxx20_erase_unordered_map.h" +#include "base/containers/cxx20_erase_unordered_set.h" +#include "base/containers/cxx20_erase_vector.h" + +// Erase/EraseIf are based on C++20's uniform container erasure API: +// - https://eel.is/c++draft/libraryindex#:erase +// - https://eel.is/c++draft/libraryindex#:erase_if +// They provide a generic way to erase elements from a container. +// The functions here implement these for the standard containers until those +// functions are available in the C++ standard. +// Note: there is no std::erase for standard associative containers so we don't +// have it either. + +// This header is provided for convenience, so callers to Erase/EraseIf can just +// include this in their .cc file without thinking about which Erase/EraseIf +// specialization header to include. For uncommon cases where Erase/EraseIf are +// used in .h files, please include the specialization header to avoid bloating +// the header. + +#endif // BASE_CONTAINERS_CXX20_ERASE_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_deque.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_deque.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_deque.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_deque.h 2025-12-01 18:15:47.000000000 +0000 @@ -0,0 +1,41 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CXX20_ERASE_DEQUE_H_ +#define BASE_CONTAINERS_CXX20_ERASE_DEQUE_H_ + +#include +#include +#include + +namespace base { + +// Erase/EraseIf are based on C++20's uniform container erasure API: +// - https://eel.is/c++draft/libraryindex#:erase +// - https://eel.is/c++draft/libraryindex#:erase_if +// They provide a generic way to erase elements from a container. +// The functions here implement these for the standard containers until those +// functions are available in the C++ standard. +// Note: there is no std::erase for standard associative containers so we don't +// have it either. + +template +size_t Erase(std::deque& container, const Value& value) { + auto it = std::remove(container.begin(), container.end(), value); + size_t removed = std::distance(it, container.end()); + container.erase(it, container.end()); + return removed; +} + +template +size_t EraseIf(std::deque& container, Predicate pred) { + auto it = std::remove_if(container.begin(), container.end(), pred); + size_t removed = std::distance(it, container.end()); + container.erase(it, container.end()); + return removed; +} + +} // namespace base + +#endif // BASE_CONTAINERS_CXX20_ERASE_DEQUE_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_forward_list.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_forward_list.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_forward_list.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_forward_list.h 2025-12-01 18:15:47.000000000 +0000 @@ -0,0 +1,42 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CXX20_ERASE_FORWARD_LIST_H_ +#define BASE_CONTAINERS_CXX20_ERASE_FORWARD_LIST_H_ + +#include +#include + +namespace base { + +// Erase/EraseIf are based on C++20's uniform container erasure API: +// - https://eel.is/c++draft/libraryindex#:erase +// - https://eel.is/c++draft/libraryindex#:erase_if +// They provide a generic way to erase elements from a container. +// The functions here implement these for the standard containers until those +// functions are available in the C++ standard. +// Note: there is no std::erase for standard associative containers so we don't +// have it either. + +template +size_t EraseIf(std::forward_list& container, Predicate pred) { + // Note: std::forward_list does not have a size() API, thus we need to use the + // O(n) std::distance work-around. However, given that EraseIf is O(n) + // already, this should not make a big difference. + size_t old_size = std::distance(container.begin(), container.end()); + container.remove_if(pred); + return old_size - std::distance(container.begin(), container.end()); +} + +template +size_t Erase(std::forward_list& container, const Value& value) { + // Unlike std::forward_list::remove, this function template accepts + // heterogeneous types and does not force a conversion to the container's + // value type before invoking the == operator. + return EraseIf(container, [&](const T& cur) { return cur == value; }); +} + +} // namespace base + +#endif // BASE_CONTAINERS_CXX20_ERASE_FORWARD_LIST_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_internal.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_internal.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_internal.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_internal.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,33 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CXX20_ERASE_INTERNAL_H_ +#define BASE_CONTAINERS_CXX20_ERASE_INTERNAL_H_ + +// Internal portion of base/containers/cxx20_erase_*.h. Please include those +// headers instead of including this directly. + +namespace base { + +namespace internal { + +// Calls erase on iterators of matching elements and returns the number of +// removed elements. +template +size_t IterateAndEraseIf(Container& container, Predicate pred) { + size_t old_size = container.size(); + for (auto it = container.begin(), last = container.end(); it != last;) { + if (pred(*it)) + it = container.erase(it); + else + ++it; + } + return old_size - container.size(); +} + +} // namespace internal + +} // namespace base + +#endif // BASE_CONTAINERS_CXX20_ERASE_INTERNAL_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_list.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_list.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_list.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_list.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,38 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CXX20_ERASE_LIST_H_ +#define BASE_CONTAINERS_CXX20_ERASE_LIST_H_ + +#include + +namespace base { + +// Erase/EraseIf are based on C++20's uniform container erasure API: +// - https://eel.is/c++draft/libraryindex#:erase +// - https://eel.is/c++draft/libraryindex#:erase_if +// They provide a generic way to erase elements from a container. +// The functions here implement these for the standard containers until those +// functions are available in the C++ standard. +// Note: there is no std::erase for standard associative containers so we don't +// have it either. + +template +size_t EraseIf(std::list& container, Predicate pred) { + size_t old_size = container.size(); + container.remove_if(pred); + return old_size - container.size(); +} + +template +size_t Erase(std::list& container, const Value& value) { + // Unlike std::list::remove, this function template accepts heterogeneous + // types and does not force a conversion to the container's value type before + // invoking the == operator. + return EraseIf(container, [&](const T& cur) { return cur == value; }); +} + +} // namespace base + +#endif // BASE_CONTAINERS_CXX20_ERASE_LIST_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_map.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_map.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_map.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_map.h 2025-12-01 18:15:47.000000000 +0000 @@ -0,0 +1,37 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CXX20_ERASE_MAP_H_ +#define BASE_CONTAINERS_CXX20_ERASE_MAP_H_ + +#include + +#include "base/containers/cxx20_erase_internal.h" + +namespace base { + +// EraseIf is based on C++20's uniform container erasure API: +// - https://eel.is/c++draft/libraryindex#:erase +// - https://eel.is/c++draft/libraryindex#:erase_if +// They provide a generic way to erase elements from a container. +// The functions here implement these for the standard containers until those +// functions are available in the C++ standard. +// Note: there is no std::erase for standard associative containers so we don't +// have it either. + +template +size_t EraseIf(std::map& container, + Predicate pred) { + return internal::IterateAndEraseIf(container, pred); +} + +template +size_t EraseIf(std::multimap& container, + Predicate pred) { + return internal::IterateAndEraseIf(container, pred); +} + +} // namespace base + +#endif // BASE_CONTAINERS_CXX20_ERASE_MAP_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_set.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_set.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_set.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_set.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,36 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CXX20_ERASE_SET_H_ +#define BASE_CONTAINERS_CXX20_ERASE_SET_H_ + +#include + +#include "base/containers/cxx20_erase_internal.h" + +namespace base { + +// EraseIf is based on C++20's uniform container erasure API: +// - https://eel.is/c++draft/libraryindex#:erase +// - https://eel.is/c++draft/libraryindex#:erase_if +// They provide a generic way to erase elements from a container. +// The functions here implement these for the standard containers until those +// functions are available in the C++ standard. +// Note: there is no std::erase for standard associative containers so we don't +// have it either. + +template +size_t EraseIf(std::set& container, Predicate pred) { + return internal::IterateAndEraseIf(container, pred); +} + +template +size_t EraseIf(std::multiset& container, + Predicate pred) { + return internal::IterateAndEraseIf(container, pred); +} + +} // namespace base + +#endif // BASE_CONTAINERS_CXX20_ERASE_SET_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_string.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_string.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_string.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_string.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,43 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CXX20_ERASE_STRING_H_ +#define BASE_CONTAINERS_CXX20_ERASE_STRING_H_ + +#include +#include +#include + +namespace base { + +// Erase/EraseIf are based on C++20's uniform container erasure API: +// - https://eel.is/c++draft/libraryindex#:erase +// - https://eel.is/c++draft/libraryindex#:erase_if +// They provide a generic way to erase elements from a container. +// The functions here implement these for the standard containers until those +// functions are available in the C++ standard. +// Note: there is no std::erase for standard associative containers so we don't +// have it either. + +template +size_t Erase(std::basic_string& container, + const Value& value) { + auto it = std::remove(container.begin(), container.end(), value); + size_t removed = std::distance(it, container.end()); + container.erase(it, container.end()); + return removed; +} + +template +size_t EraseIf(std::basic_string& container, + Predicate pred) { + auto it = std::remove_if(container.begin(), container.end(), pred); + size_t removed = std::distance(it, container.end()); + container.erase(it, container.end()); + return removed; +} + +} // namespace base + +#endif // BASE_CONTAINERS_CXX20_ERASE_STRING_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_unordered_map.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_unordered_map.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_unordered_map.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_unordered_map.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,48 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CXX20_ERASE_UNORDERED_MAP_H_ +#define BASE_CONTAINERS_CXX20_ERASE_UNORDERED_MAP_H_ + +#include + +#include "base/containers/cxx20_erase_internal.h" + +namespace base { + +// EraseIf is based on C++20's uniform container erasure API: +// - https://eel.is/c++draft/libraryindex#:erase +// - https://eel.is/c++draft/libraryindex#:erase_if +// They provide a generic way to erase elements from a container. +// The functions here implement these for the standard containers until those +// functions are available in the C++ standard. +// Note: there is no std::erase for standard associative containers so we don't +// have it either. + +template +size_t EraseIf(std::unordered_map& container, + Predicate pred) { + return internal::IterateAndEraseIf(container, pred); +} + +template +size_t EraseIf( + std::unordered_multimap& container, + Predicate pred) { + return internal::IterateAndEraseIf(container, pred); +} + +} // namespace base + +#endif // BASE_CONTAINERS_CXX20_ERASE_UNORDERED_MAP_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_unordered_set.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_unordered_set.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_unordered_set.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_unordered_set.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,46 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CXX20_ERASE_UNORDERED_SET_H_ +#define BASE_CONTAINERS_CXX20_ERASE_UNORDERED_SET_H_ + +#include + +#include "base/containers/cxx20_erase_internal.h" + +namespace base { + +// EraseIf is based on C++20's uniform container erasure API: +// - https://eel.is/c++draft/libraryindex#:erase +// - https://eel.is/c++draft/libraryindex#:erase_if +// They provide a generic way to erase elements from a container. +// The functions here implement these for the standard containers until those +// functions are available in the C++ standard. +// Note: there is no std::erase for standard associative containers so we don't +// have it either. + +template +size_t EraseIf(std::unordered_set& container, + Predicate pred) { + return internal::IterateAndEraseIf(container, pred); +} + +template +size_t EraseIf( + std::unordered_multiset& container, + Predicate pred) { + return internal::IterateAndEraseIf(container, pred); +} + +} // namespace base + +#endif // BASE_CONTAINERS_CXX20_ERASE_UNORDERED_SET_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_vector.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_vector.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_vector.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/cxx20_erase_vector.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,41 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_CXX20_ERASE_VECTOR_H_ +#define BASE_CONTAINERS_CXX20_ERASE_VECTOR_H_ + +#include +#include +#include + +namespace base { + +// Erase/EraseIf are based on C++20's uniform container erasure API: +// - https://eel.is/c++draft/libraryindex#:erase +// - https://eel.is/c++draft/libraryindex#:erase_if +// They provide a generic way to erase elements from a container. +// The functions here implement these for the standard containers until those +// functions are available in the C++ standard. +// Note: there is no std::erase for standard associative containers so we don't +// have it either. + +template +size_t Erase(std::vector& container, const Value& value) { + auto it = std::remove(container.begin(), container.end(), value); + size_t removed = static_cast(std::distance(it, container.end())); + container.erase(it, container.end()); + return removed; +} + +template +size_t EraseIf(std::vector& container, Predicate pred) { + auto it = std::remove_if(container.begin(), container.end(), pred); + size_t removed = static_cast(std::distance(it, container.end())); + container.erase(it, container.end()); + return removed; +} + +} // namespace base + +#endif // BASE_CONTAINERS_CXX20_ERASE_VECTOR_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/span.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/span.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/span.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/span.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,553 @@ +// Copyright 2017 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_SPAN_H_ +#define BASE_CONTAINERS_SPAN_H_ + +#include +#include + +#include +#include +#include +#include +#include + +#include "base/check.h" +#include "base/compiler_specific.h" +#include "base/containers/checked_iterators.h" +#include "base/containers/contiguous_iterator.h" +#include "base/cxx20_to_address.h" +#include "base/memory/raw_ptr_exclusion.h" +#include "base/numerics/safe_math.h" + +namespace base { + +// [views.constants] +constexpr size_t dynamic_extent = std::numeric_limits::max(); + +template +class span; + +namespace internal { + +template +using size_constant = std::integral_constant; + +template +struct ExtentImpl : size_constant {}; + +template +struct ExtentImpl : size_constant {}; + +template +struct ExtentImpl> : size_constant {}; + +template +struct ExtentImpl> : size_constant {}; + +template +using Extent = ExtentImpl>; + +template +struct IsSpanImpl : std::false_type {}; + +template +struct IsSpanImpl> : std::true_type {}; + +template +using IsNotSpan = std::negation>>; + +template +struct IsStdArrayImpl : std::false_type {}; + +template +struct IsStdArrayImpl> : std::true_type {}; + +template +using IsNotStdArray = std::negation>>; + +template +using IsNotCArray = std::negation>>; + +template +using IsLegalDataConversion = std::is_convertible; + +template +using IteratorHasConvertibleReferenceType = + IsLegalDataConversion>, T>; + +template +using EnableIfCompatibleContiguousIterator = std::enable_if_t< + std::conjunction, + IteratorHasConvertibleReferenceType>::value>; + +template +using ContainerHasConvertibleData = IsLegalDataConversion< + std::remove_pointer_t()))>, + T>; + +template +using ContainerHasIntegralSize = + std::is_integral()))>; + +template +using EnableIfLegalSpanConversion = + std::enable_if_t<(ToExtent == dynamic_extent || ToExtent == FromExtent) && + IsLegalDataConversion::value>; + +// SFINAE check if Array can be converted to a span. +template +using EnableIfSpanCompatibleArray = + std::enable_if_t<(Extent == dynamic_extent || + Extent == internal::Extent::value) && + ContainerHasConvertibleData::value>; + +// SFINAE check if Container can be converted to a span. +template +using IsSpanCompatibleContainer = + std::conjunction, + IsNotStdArray, + IsNotCArray, + ContainerHasConvertibleData, + ContainerHasIntegralSize>; + +template +using EnableIfSpanCompatibleContainer = + std::enable_if_t::value>; + +template +using EnableIfSpanCompatibleContainerAndSpanIsDynamic = + std::enable_if_t::value && + Extent == dynamic_extent>; + +// A helper template for storing the size of a span. Spans with static extents +// don't require additional storage, since the extent itself is specified in the +// template parameter. +template +class ExtentStorage { + public: + constexpr explicit ExtentStorage(size_t size) noexcept {} + constexpr size_t size() const noexcept { return Extent; } +}; + +// Specialization of ExtentStorage for dynamic extents, which do require +// explicit storage for the size. +template <> +struct ExtentStorage { + constexpr explicit ExtentStorage(size_t size) noexcept : size_(size) {} + constexpr size_t size() const noexcept { return size_; } + + private: + size_t size_; +}; + +// must_not_be_dynamic_extent prevents |dynamic_extent| from being returned in a +// constexpr context. +template +constexpr size_t must_not_be_dynamic_extent() { + static_assert( + kExtent != dynamic_extent, + "EXTENT should only be used for containers with a static extent."); + return kExtent; +} + +} // namespace internal + +// A span is a value type that represents an array of elements of type T. Since +// it only consists of a pointer to memory with an associated size, it is very +// light-weight. It is cheap to construct, copy, move and use spans, so that +// users are encouraged to use it as a pass-by-value parameter. A span does not +// own the underlying memory, so care must be taken to ensure that a span does +// not outlive the backing store. +// +// span is somewhat analogous to StringPiece, but with arbitrary element types, +// allowing mutation if T is non-const. +// +// span is implicitly convertible from C++ arrays, as well as most [1] +// container-like types that provide a data() and size() method (such as +// std::vector). A mutable span can also be implicitly converted to an +// immutable span. +// +// Consider using a span for functions that take a data pointer and size +// parameter: it allows the function to still act on an array-like type, while +// allowing the caller code to be a bit more concise. +// +// For read-only data access pass a span: the caller can supply either +// a span or a span, while the callee will have a read-only view. +// For read-write access a mutable span is required. +// +// Without span: +// Read-Only: +// // std::string HexEncode(const uint8_t* data, size_t size); +// std::vector data_buffer = GenerateData(); +// std::string r = HexEncode(data_buffer.data(), data_buffer.size()); +// +// Mutable: +// // ssize_t SafeSNPrintf(char* buf, size_t N, const char* fmt, Args...); +// char str_buffer[100]; +// SafeSNPrintf(str_buffer, sizeof(str_buffer), "Pi ~= %lf", 3.14); +// +// With span: +// Read-Only: +// // std::string HexEncode(base::span data); +// std::vector data_buffer = GenerateData(); +// std::string r = HexEncode(data_buffer); +// +// Mutable: +// // ssize_t SafeSNPrintf(base::span, const char* fmt, Args...); +// char str_buffer[100]; +// SafeSNPrintf(str_buffer, "Pi ~= %lf", 3.14); +// +// Spans with "const" and pointers +// ------------------------------- +// +// Const and pointers can get confusing. Here are vectors of pointers and their +// corresponding spans: +// +// const std::vector => base::span +// std::vector => base::span +// const std::vector => base::span +// +// Differences from the C++20 draft +// -------------------------------- +// +// http://eel.is/c++draft/views contains the latest C++20 draft of std::span. +// Chromium tries to follow the draft as close as possible. Differences between +// the draft and the implementation are documented in subsections below. +// +// Differences from [span.objectrep]: +// - as_bytes() and as_writable_bytes() return spans of uint8_t instead of +// std::byte (std::byte is a C++17 feature) +// +// Differences from [span.cons]: +// - Constructing a static span (i.e. Extent != dynamic_extent) from a dynamic +// sized container (e.g. std::vector) requires an explicit conversion (in the +// C++20 draft this is simply UB) +// +// Furthermore, all constructors and methods are marked noexcept due to the lack +// of exceptions in Chromium. +// +// Due to the lack of class template argument deduction guides in C++14 +// appropriate make_span() utility functions are provided. + +// [span], class template span +template +class GSL_POINTER span : public internal::ExtentStorage { + private: + using ExtentStorage = internal::ExtentStorage; + + public: + using element_type = T; + using value_type = std::remove_cv_t; + using size_type = size_t; + using difference_type = ptrdiff_t; + using pointer = T*; + using const_pointer = const T*; + using reference = T&; + using const_reference = const T&; + using iterator = CheckedContiguousIterator; + // TODO(https://crbug.com/828324): Drop the const_iterator typedef once gMock + // supports containers without this nested type. + using const_iterator = iterator; + using reverse_iterator = std::reverse_iterator; + static constexpr size_t extent = Extent; + + // [span.cons], span constructors, copy, assignment, and destructor + constexpr span() noexcept : ExtentStorage(0), data_(nullptr) { + static_assert(Extent == dynamic_extent || Extent == 0, "Invalid Extent"); + } + + template > + constexpr span(It first, StrictNumeric count) noexcept + : ExtentStorage(count), + // The use of to_address() here is to handle the case where the iterator + // `first` is pointing to the container's `end()`. In that case we can + // not use the address returned from the iterator, or dereference it + // through the iterator's `operator*`, but we can store it. We must + // assume in this case that `count` is 0, since the iterator does not + // point to valid data. Future hardening of iterators may disallow + // pulling the address from `end()`, as demonstrated by asserts() in + // libstdc++: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93960. + // + // The span API dictates that the `data()` is accessible when size is 0, + // since the pointer may be valid, so we cannot prevent storing and + // giving out an invalid pointer here without breaking API compatibility + // and our unit tests. Thus protecting against this can likely only be + // successful from inside iterators themselves, where the context about + // the pointer is known. + // + // We can not protect here generally against an invalid iterator/count + // being passed in, since we have no context to determine if the + // iterator or count are valid. + data_(base::to_address(first)) { + CHECK(Extent == dynamic_extent || Extent == count); + } + + template < + typename It, + typename End, + typename = internal::EnableIfCompatibleContiguousIterator, + typename = std::enable_if_t::value>> + constexpr span(It begin, End end) noexcept + // Subtracting two iterators gives a ptrdiff_t, but the result should be + // non-negative: see CHECK below. + : span(begin, static_cast(end - begin)) { + // Note: CHECK_LE is not constexpr, hence regular CHECK must be used. + CHECK(begin <= end); + } + + template < + size_t N, + typename = internal::EnableIfSpanCompatibleArray> + constexpr span(T (&array)[N]) noexcept : span(std::data(array), N) {} + + template < + typename U, + size_t N, + typename = + internal::EnableIfSpanCompatibleArray&, T, Extent>> + constexpr span(std::array& array) noexcept + : span(std::data(array), N) {} + + template &, T, Extent>> + constexpr span(const std::array& array) noexcept + : span(std::data(array), N) {} + + // Conversion from a container that has compatible std::data() and integral + // std::size(). + template < + typename Container, + typename = + internal::EnableIfSpanCompatibleContainerAndSpanIsDynamic> + constexpr span(Container& container) noexcept + : span(std::data(container), std::size(container)) {} + + template < + typename Container, + typename = internal::EnableIfSpanCompatibleContainerAndSpanIsDynamic< + const Container&, + T, + Extent>> + constexpr span(const Container& container) noexcept + : span(std::data(container), std::size(container)) {} + + constexpr span(const span& other) noexcept = default; + + // Conversions from spans of compatible types and extents: this allows a + // span to be seamlessly used as a span, but not the other way + // around. If extent is not dynamic, OtherExtent has to be equal to Extent. + template < + typename U, + size_t OtherExtent, + typename = + internal::EnableIfLegalSpanConversion> + constexpr span(const span& other) + : span(other.data(), other.size()) {} + + constexpr span& operator=(const span& other) noexcept = default; + ~span() noexcept = default; + + // [span.sub], span subviews + template + constexpr span first() const noexcept { + static_assert(Count <= Extent, "Count must not exceed Extent"); + CHECK(Extent != dynamic_extent || Count <= size()); + return {data(), Count}; + } + + template + constexpr span last() const noexcept { + static_assert(Count <= Extent, "Count must not exceed Extent"); + CHECK(Extent != dynamic_extent || Count <= size()); + return {data() + (size() - Count), Count}; + } + + template + constexpr span + subspan() const noexcept { + static_assert(Offset <= Extent, "Offset must not exceed Extent"); + static_assert(Count == dynamic_extent || Count <= Extent - Offset, + "Count must not exceed Extent - Offset"); + CHECK(Extent != dynamic_extent || Offset <= size()); + CHECK(Extent != dynamic_extent || Count == dynamic_extent || + Count <= size() - Offset); + return {data() + Offset, Count != dynamic_extent ? Count : size() - Offset}; + } + + constexpr span first(size_t count) const noexcept { + // Note: CHECK_LE is not constexpr, hence regular CHECK must be used. + CHECK(count <= size()); + return {data(), count}; + } + + constexpr span last(size_t count) const noexcept { + // Note: CHECK_LE is not constexpr, hence regular CHECK must be used. + CHECK(count <= size()); + return {data() + (size() - count), count}; + } + + constexpr span subspan(size_t offset, + size_t count = dynamic_extent) const + noexcept { + // Note: CHECK_LE is not constexpr, hence regular CHECK must be used. + CHECK(offset <= size()); + CHECK(count == dynamic_extent || count <= size() - offset); + return {data() + offset, count != dynamic_extent ? count : size() - offset}; + } + + // [span.obs], span observers + constexpr size_t size() const noexcept { return ExtentStorage::size(); } + constexpr size_t size_bytes() const noexcept { return size() * sizeof(T); } + [[nodiscard]] constexpr bool empty() const noexcept { return size() == 0; } + + // [span.elem], span element access + constexpr T& operator[](size_t idx) const noexcept { + // Note: CHECK_LT is not constexpr, hence regular CHECK must be used. + CHECK(idx < size()); + return *(data() + idx); + } + + constexpr T& front() const noexcept { + static_assert(Extent == dynamic_extent || Extent > 0, + "Extent must not be 0"); + CHECK(Extent != dynamic_extent || !empty()); + return *data(); + } + + constexpr T& back() const noexcept { + static_assert(Extent == dynamic_extent || Extent > 0, + "Extent must not be 0"); + CHECK(Extent != dynamic_extent || !empty()); + return *(data() + size() - 1); + } + + constexpr T* data() const noexcept { return data_; } + + // [span.iter], span iterator support + constexpr iterator begin() const noexcept { + return iterator(data_, data_ + size()); + } + + constexpr iterator end() const noexcept { + return iterator(data_, data_ + size(), data_ + size()); + } + + constexpr reverse_iterator rbegin() const noexcept { + return reverse_iterator(end()); + } + + constexpr reverse_iterator rend() const noexcept { + return reverse_iterator(begin()); + } + + private: + // This field is not a raw_ptr<> because it was filtered by the rewriter + // for: #constexpr-ctor-field-initializer, #global-scope, #union + RAW_PTR_EXCLUSION T* data_; +}; + +// span::extent can not be declared inline prior to C++17, hence this +// definition is required. +template +constexpr size_t span::extent; + +// [span.objectrep], views of object representation +template +span +as_bytes(span s) noexcept { + return {reinterpret_cast(s.data()), s.size_bytes()}; +} + +template ::value>> +span +as_writable_bytes(span s) noexcept { + return {reinterpret_cast(s.data()), s.size_bytes()}; +} + +// Type-deducing helpers for constructing a span. +template +constexpr auto make_span(It it, StrictNumeric size) noexcept { + using T = std::remove_reference_t>; + return span(it, size); +} + +template >> +constexpr auto make_span(It it, End end) noexcept { + using T = std::remove_reference_t>; + return span(it, end); +} + +// make_span utility function that deduces both the span's value_type and extent +// from the passed in argument. +// +// Usage: auto span = base::make_span(...); +template +constexpr auto make_span(Container&& container) noexcept { + using T = + std::remove_pointer_t()))>; + using Extent = internal::Extent; + return span(std::forward(container)); +} + +// make_span utility functions that allow callers to explicit specify the span's +// extent, the value_type is deduced automatically. This is useful when passing +// a dynamically sized container to a method expecting static spans, when the +// container is known to have the correct size. +// +// Note: This will CHECK that N indeed matches size(container). +// +// Usage: auto static_span = base::make_span(...); +template +constexpr auto make_span(It it, StrictNumeric size) noexcept { + using T = std::remove_reference_t>; + return span(it, size); +} + +template >> +constexpr auto make_span(It it, End end) noexcept { + using T = std::remove_reference_t>; + return span(it, end); +} + +template +constexpr auto make_span(Container&& container) noexcept { + using T = + std::remove_pointer_t()))>; + return span(std::data(container), std::size(container)); +} + +} // namespace base + +// EXTENT returns the size of any type that can be converted to a |base::span| +// with definite extent, i.e. everything that is a contiguous storage of some +// sort with static size. Specifically, this works for std::array in a constexpr +// context. Note: +// * |std::size| should be preferred for plain arrays. +// * In run-time contexts, functions such as |std::array::size| should be +// preferred. +#define EXTENT(x) \ + ::base::internal::must_not_be_dynamic_extent() + +#endif // BASE_CONTAINERS_SPAN_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/stack.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/stack.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/stack.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/stack.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,23 @@ +// Copyright 2017 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_STACK_H_ +#define BASE_CONTAINERS_STACK_H_ + +#include + +#include "base/containers/circular_deque.h" + +namespace base { + +// Provides a definition of base::stack that's like std::stack but uses a +// base::circular_deque instead of std::deque. Since std::stack is just a +// wrapper for an underlying type, we can just provide a typedef for it that +// defaults to the base circular_deque. +template > +using stack = std::stack; + +} // namespace base + +#endif // BASE_CONTAINERS_STACK_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/util.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/util.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/util.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/util.h 2025-12-01 18:15:49.000000000 +0000 @@ -0,0 +1,21 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_UTIL_H_ +#define BASE_CONTAINERS_UTIL_H_ + +#include + +namespace base { + +// TODO(crbug.com/817982): What we really need is for checked_math.h to be +// able to do checked arithmetic on pointers. +template +inline uintptr_t get_uintptr(const T* t) { + return reinterpret_cast(t); +} + +} // namespace base + +#endif // BASE_CONTAINERS_UTIL_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/vector_buffer.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/vector_buffer.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/containers/vector_buffer.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/containers/vector_buffer.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,193 @@ +// Copyright 2017 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CONTAINERS_VECTOR_BUFFER_H_ +#define BASE_CONTAINERS_VECTOR_BUFFER_H_ + +#include +#include + +#include +#include + +#include "base/check.h" +#include "base/check_op.h" +#include "base/containers/util.h" +#include "base/memory/raw_ptr_exclusion.h" +#include "base/numerics/checked_math.h" + +namespace base { +namespace internal { + +// Internal implementation detail of base/containers. +// +// Implements a vector-like buffer that holds a certain capacity of T. Unlike +// std::vector, VectorBuffer never constructs or destructs its arguments, and +// can't change sizes. But it does implement templates to assist in efficient +// moving and destruction of those items manually. +// +// In particular, the destructor function does not iterate over the items if +// there is no destructor. Moves should be implemented as a memcpy/memmove for +// trivially copyable objects (POD) otherwise, it should be a std::move if +// possible, and as a last resort it falls back to a copy. This behavior is +// similar to std::vector. +// +// No special consideration is done for noexcept move constructors since +// we compile without exceptions. +// +// The current API does not support moving overlapping ranges. +template +class VectorBuffer { + public: + constexpr VectorBuffer() = default; + +#if defined(__clang__) && !defined(__native_client__) + // This constructor converts an uninitialized void* to a T* which triggers + // clang Control Flow Integrity. Since this is as-designed, disable. + __attribute__((no_sanitize("cfi-unrelated-cast", "vptr"))) +#endif + VectorBuffer(size_t count) + : buffer_(reinterpret_cast( + malloc(CheckMul(sizeof(T), count).ValueOrDie()))), + capacity_(count) { + } + VectorBuffer(VectorBuffer&& other) noexcept + : buffer_(other.buffer_), capacity_(other.capacity_) { + other.buffer_ = nullptr; + other.capacity_ = 0; + } + + VectorBuffer(const VectorBuffer&) = delete; + VectorBuffer& operator=(const VectorBuffer&) = delete; + + ~VectorBuffer() { free(buffer_); } + + VectorBuffer& operator=(VectorBuffer&& other) { + free(buffer_); + buffer_ = other.buffer_; + capacity_ = other.capacity_; + + other.buffer_ = nullptr; + other.capacity_ = 0; + return *this; + } + + size_t capacity() const { return capacity_; } + + T& operator[](size_t i) { + // TODO(crbug.com/817982): Some call sites (at least circular_deque.h) are + // calling this with `i == capacity_` as a way of getting `end()`. Therefore + // we have to allow this for now (`i <= capacity_`), until we fix those call + // sites to use real iterators. This comment applies here and to `const T& + // operator[]`, below. + CHECK_LE(i, capacity_); + return buffer_[i]; + } + + const T& operator[](size_t i) const { + CHECK_LE(i, capacity_); + return buffer_[i]; + } + + T* begin() { return buffer_; } + T* end() { return &buffer_[capacity_]; } + + // DestructRange ------------------------------------------------------------ + + // Trivially destructible objects need not have their destructors called. + template ::value, + int>::type = 0> + void DestructRange(T* begin, T* end) {} + + // Non-trivially destructible objects must have their destructors called + // individually. + template ::value, + int>::type = 0> + void DestructRange(T* begin, T* end) { + CHECK_LE(begin, end); + while (begin != end) { + begin->~T(); + begin++; + } + } + + // MoveRange ---------------------------------------------------------------- + // + // The destructor will be called (as necessary) for all moved types. The + // ranges must not overlap. + // + // The parameters and begin and end (one past the last) of the input buffer, + // and the address of the first element to copy to. There must be sufficient + // room in the destination for all items in the range [begin, end). + + // Trivially copyable types can use memcpy. trivially copyable implies + // that there is a trivial destructor as we don't have to call it. + template < + typename T2 = T, + typename std::enable_if, int>::type = 0> + static void MoveRange(T* from_begin, T* from_end, T* to) { + CHECK(!RangesOverlap(from_begin, from_end, to)); + + memcpy( + to, from_begin, + CheckSub(get_uintptr(from_end), get_uintptr(from_begin)).ValueOrDie()); + } + + // Not trivially copyable, but movable: call the move constructor and + // destruct the original. + template ::value && + !std::is_trivially_copyable_v, + int>::type = 0> + static void MoveRange(T* from_begin, T* from_end, T* to) { + CHECK(!RangesOverlap(from_begin, from_end, to)); + while (from_begin != from_end) { + new (to) T(std::move(*from_begin)); + from_begin->~T(); + from_begin++; + to++; + } + } + + // Not movable, not trivially copyable: call the copy constructor and + // destruct the original. + template ::value && + !std::is_trivially_copyable_v, + int>::type = 0> + static void MoveRange(T* from_begin, T* from_end, T* to) { + CHECK(!RangesOverlap(from_begin, from_end, to)); + while (from_begin != from_end) { + new (to) T(*from_begin); + from_begin->~T(); + from_begin++; + to++; + } + } + + private: + static bool RangesOverlap(const T* from_begin, + const T* from_end, + const T* to) { + const auto from_begin_uintptr = get_uintptr(from_begin); + const auto from_end_uintptr = get_uintptr(from_end); + const auto to_uintptr = get_uintptr(to); + return !( + to >= from_end || + CheckAdd(to_uintptr, CheckSub(from_end_uintptr, from_begin_uintptr)) + .ValueOrDie() <= from_begin_uintptr); + } + + // `buffer_` is not a raw_ptr<...> for performance reasons (based on analysis + // of sampling profiler data and tab_search:top100:2020). + RAW_PTR_EXCLUSION T* buffer_ = nullptr; + size_t capacity_ = 0; +}; + +} // namespace internal +} // namespace base + +#endif // BASE_CONTAINERS_VECTOR_BUFFER_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/cpu.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/cpu.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/cpu.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/cpu.cc 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,387 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/cpu.h" + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "base/no_destructor.h" +#include "build/build_config.h" + +#if defined(ARCH_CPU_ARM_FAMILY) && \ + (BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) +#include +#include + +#include "base/files/file_util.h" +#include "base/numerics/checked_math.h" +#include "base/ranges/algorithm.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/string_split.h" +#include "base/strings/string_util.h" + +// Temporary definitions until a new hwcap.h is pulled in everywhere. +// https://crbug.com/1265965 +#ifndef HWCAP2_MTE +#define HWCAP2_MTE (1 << 18) +#define HWCAP2_BTI (1 << 17) +#endif + +struct ProcCpuInfo { + std::string brand; + uint8_t implementer = 0; + uint32_t part_number = 0; +}; +#endif + +#if defined(ARCH_CPU_X86_FAMILY) +#if defined(COMPILER_MSVC) +#include +#include // For _xgetbv() +#endif +#endif + +namespace base { + +#if defined(ARCH_CPU_X86_FAMILY) +namespace internal { + +X86ModelInfo ComputeX86FamilyAndModel(const std::string& vendor, + int signature) { + X86ModelInfo results; + results.family = (signature >> 8) & 0xf; + results.model = (signature >> 4) & 0xf; + results.ext_family = 0; + results.ext_model = 0; + + // The "Intel 64 and IA-32 Architectures Developer's Manual: Vol. 2A" + // specifies the Extended Model is defined only when the Base Family is + // 06h or 0Fh. + // The "AMD CPUID Specification" specifies that the Extended Model is + // defined only when Base Family is 0Fh. + // Both manuals define the display model as + // {ExtendedModel[3:0],BaseModel[3:0]} in that case. + if (results.family == 0xf || + (results.family == 0x6 && vendor == "GenuineIntel")) { + results.ext_model = (signature >> 16) & 0xf; + results.model += results.ext_model << 4; + } + // Both the "Intel 64 and IA-32 Architectures Developer's Manual: Vol. 2A" + // and the "AMD CPUID Specification" specify that the Extended Family is + // defined only when the Base Family is 0Fh. + // Both manuals define the display family as {0000b,BaseFamily[3:0]} + + // ExtendedFamily[7:0] in that case. + if (results.family == 0xf) { + results.ext_family = (signature >> 20) & 0xff; + results.family += results.ext_family; + } + + return results; +} + +} // namespace internal +#endif // defined(ARCH_CPU_X86_FAMILY) + +CPU::CPU(bool require_branding) { + Initialize(require_branding); +} +CPU::CPU() : CPU(true) {} +CPU::CPU(CPU&&) = default; + +namespace { + +#if defined(ARCH_CPU_X86_FAMILY) +#if !defined(COMPILER_MSVC) + +#if defined(__pic__) && defined(__i386__) + +void __cpuid(int cpu_info[4], int info_type) { + __asm__ volatile( + "mov %%ebx, %%edi\n" + "cpuid\n" + "xchg %%edi, %%ebx\n" + : "=a"(cpu_info[0]), "=D"(cpu_info[1]), "=c"(cpu_info[2]), + "=d"(cpu_info[3]) + : "a"(info_type), "c"(0)); +} + +#else + +void __cpuid(int cpu_info[4], int info_type) { + __asm__ volatile("cpuid\n" + : "=a"(cpu_info[0]), "=b"(cpu_info[1]), "=c"(cpu_info[2]), + "=d"(cpu_info[3]) + : "a"(info_type), "c"(0)); +} + +#endif +#endif // !defined(COMPILER_MSVC) + +// xgetbv returns the value of an Intel Extended Control Register (XCR). +// Currently only XCR0 is defined by Intel so |xcr| should always be zero. +uint64_t xgetbv(uint32_t xcr) { +#if defined(COMPILER_MSVC) + return _xgetbv(xcr); +#else + uint32_t eax, edx; + + __asm__ volatile ( + "xgetbv" : "=a"(eax), "=d"(edx) : "c"(xcr)); + return (static_cast(edx) << 32) | eax; +#endif // defined(COMPILER_MSVC) +} + +#endif // ARCH_CPU_X86_FAMILY + +#if defined(ARCH_CPU_ARM_FAMILY) && \ + (BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) +StringPairs::const_iterator FindFirstProcCpuKey(const StringPairs& pairs, + StringPiece key) { + return ranges::find_if(pairs, [key](const StringPairs::value_type& pair) { + return TrimWhitespaceASCII(pair.first, base::TRIM_ALL) == key; + }); +} + +// Parses information about the ARM processor. Note that depending on the CPU +// package, processor configuration, and/or kernel version, this may only +// report information about the processor on which this thread is running. This +// can happen on heterogeneous-processor SoCs like Snapdragon 808, which has 4 +// Cortex-A53 and 2 Cortex-A57. Unfortunately there is not a universally +// reliable way to examine the CPU part information for all cores. +const ProcCpuInfo& ParseProcCpu() { + static const NoDestructor info([]() { + // This function finds the value from /proc/cpuinfo under the key "model + // name" or "Processor". "model name" is used in Linux 3.8 and later (3.7 + // and later for arm64) and is shown once per CPU. "Processor" is used in + // earler versions and is shown only once at the top of /proc/cpuinfo + // regardless of the number CPUs. + const char kModelNamePrefix[] = "model name"; + const char kProcessorPrefix[] = "Processor"; + + std::string cpuinfo; + ReadFileToString(FilePath("/proc/cpuinfo"), &cpuinfo); + DCHECK(!cpuinfo.empty()); + + ProcCpuInfo info; + + StringPairs pairs; + if (!SplitStringIntoKeyValuePairs(cpuinfo, ':', '\n', &pairs)) { + NOTREACHED(); + return info; + } + + auto model_name = FindFirstProcCpuKey(pairs, kModelNamePrefix); + if (model_name == pairs.end()) + model_name = FindFirstProcCpuKey(pairs, kProcessorPrefix); + if (model_name != pairs.end()) { + info.brand = + std::string(TrimWhitespaceASCII(model_name->second, TRIM_ALL)); + } + + auto implementer_string = FindFirstProcCpuKey(pairs, "CPU implementer"); + if (implementer_string != pairs.end()) { + // HexStringToUInt() handles the leading whitespace on the value. + uint32_t implementer; + HexStringToUInt(implementer_string->second, &implementer); + if (!CheckedNumeric(implementer) + .AssignIfValid(&info.implementer)) { + info.implementer = 0; + } + } + + auto part_number_string = FindFirstProcCpuKey(pairs, "CPU part"); + if (part_number_string != pairs.end()) + HexStringToUInt(part_number_string->second, &info.part_number); + + return info; + }()); + + return *info; +} +#endif // defined(ARCH_CPU_ARM_FAMILY) && (BUILDFLAG(IS_ANDROID) || + // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) + +} // namespace + +void CPU::Initialize(bool require_branding) { +#if defined(ARCH_CPU_X86_FAMILY) + int cpu_info[4] = {-1}; + // This array is used to temporarily hold the vendor name and then the brand + // name. Thus it has to be big enough for both use cases. There are + // static_asserts below for each of the use cases to make sure this array is + // big enough. + char cpu_string[sizeof(cpu_info) * 3 + 1]; + + // __cpuid with an InfoType argument of 0 returns the number of + // valid Ids in CPUInfo[0] and the CPU identification string in + // the other three array elements. The CPU identification string is + // not in linear order. The code below arranges the information + // in a human readable form. The human readable order is CPUInfo[1] | + // CPUInfo[3] | CPUInfo[2]. CPUInfo[2] and CPUInfo[3] are swapped + // before using memcpy() to copy these three array elements to |cpu_string|. + __cpuid(cpu_info, 0); + int num_ids = cpu_info[0]; + std::swap(cpu_info[2], cpu_info[3]); + static constexpr size_t kVendorNameSize = 3 * sizeof(cpu_info[1]); + static_assert(kVendorNameSize < std::size(cpu_string), + "cpu_string too small"); + memcpy(cpu_string, &cpu_info[1], kVendorNameSize); + cpu_string[kVendorNameSize] = '\0'; + cpu_vendor_ = cpu_string; + + // Interpret CPU feature information. + if (num_ids > 0) { + int cpu_info7[4] = {0}; + __cpuid(cpu_info, 1); + if (num_ids >= 7) { + __cpuid(cpu_info7, 7); + } + signature_ = cpu_info[0]; + stepping_ = cpu_info[0] & 0xf; + type_ = (cpu_info[0] >> 12) & 0x3; + internal::X86ModelInfo results = + internal::ComputeX86FamilyAndModel(cpu_vendor_, signature_); + family_ = results.family; + model_ = results.model; + ext_family_ = results.ext_family; + ext_model_ = results.ext_model; + has_mmx_ = (cpu_info[3] & 0x00800000) != 0; + has_sse_ = (cpu_info[3] & 0x02000000) != 0; + has_sse2_ = (cpu_info[3] & 0x04000000) != 0; + has_sse3_ = (cpu_info[2] & 0x00000001) != 0; + has_ssse3_ = (cpu_info[2] & 0x00000200) != 0; + has_sse41_ = (cpu_info[2] & 0x00080000) != 0; + has_sse42_ = (cpu_info[2] & 0x00100000) != 0; + has_popcnt_ = (cpu_info[2] & 0x00800000) != 0; + + // "Hypervisor Present Bit: Bit 31 of ECX of CPUID leaf 0x1." + // See https://lwn.net/Articles/301888/ + // This is checking for any hypervisor. Hypervisors may choose not to + // announce themselves. Hypervisors trap CPUID and sometimes return + // different results to underlying hardware. + is_running_in_vm_ = (static_cast(cpu_info[2]) & 0x80000000) != 0; + + // AVX instructions will generate an illegal instruction exception unless + // a) they are supported by the CPU, + // b) XSAVE is supported by the CPU and + // c) XSAVE is enabled by the kernel. + // See http://software.intel.com/en-us/blogs/2011/04/14/is-avx-enabled + // + // In addition, we have observed some crashes with the xgetbv instruction + // even after following Intel's example code. (See crbug.com/375968.) + // Because of that, we also test the XSAVE bit because its description in + // the CPUID documentation suggests that it signals xgetbv support. + has_avx_ = + (cpu_info[2] & 0x10000000) != 0 && + (cpu_info[2] & 0x04000000) != 0 /* XSAVE */ && + (cpu_info[2] & 0x08000000) != 0 /* OSXSAVE */ && + (xgetbv(0) & 6) == 6 /* XSAVE enabled by kernel */; + has_aesni_ = (cpu_info[2] & 0x02000000) != 0; + has_fma3_ = (cpu_info[2] & 0x00001000) != 0; + has_avx2_ = has_avx_ && (cpu_info7[1] & 0x00000020) != 0; + + has_pku_ = (cpu_info7[2] & 0x00000010) != 0; + } + + // Get the brand string of the cpu. + __cpuid(cpu_info, static_cast(0x80000000)); + const uint32_t max_parameter = static_cast(cpu_info[0]); + + static constexpr uint32_t kParameterStart = 0x80000002; + static constexpr uint32_t kParameterEnd = 0x80000004; + static constexpr uint32_t kParameterSize = + kParameterEnd - kParameterStart + 1; + static_assert(kParameterSize * sizeof(cpu_info) + 1 == std::size(cpu_string), + "cpu_string has wrong size"); + + if (max_parameter >= kParameterEnd) { + size_t i = 0; + for (uint32_t parameter = kParameterStart; parameter <= kParameterEnd; + ++parameter) { + __cpuid(cpu_info, static_cast(parameter)); + memcpy(&cpu_string[i], cpu_info, sizeof(cpu_info)); + i += sizeof(cpu_info); + } + cpu_string[i] = '\0'; + cpu_brand_ = cpu_string; + } + + static constexpr uint32_t kParameterContainingNonStopTimeStampCounter = + 0x80000007; + if (max_parameter >= kParameterContainingNonStopTimeStampCounter) { + __cpuid(cpu_info, + static_cast(kParameterContainingNonStopTimeStampCounter)); + has_non_stop_time_stamp_counter_ = (cpu_info[3] & (1 << 8)) != 0; + } + + if (!has_non_stop_time_stamp_counter_ && is_running_in_vm_) { + int cpu_info_hv[4] = {}; + __cpuid(cpu_info_hv, 0x40000000); + if (cpu_info_hv[1] == 0x7263694D && // Micr + cpu_info_hv[2] == 0x666F736F && // osof + cpu_info_hv[3] == 0x76482074) { // t Hv + // If CPUID says we have a variant TSC and a hypervisor has identified + // itself and the hypervisor says it is Microsoft Hyper-V, then treat + // TSC as invariant. + // + // Microsoft Hyper-V hypervisor reports variant TSC as there are some + // scenarios (eg. VM live migration) where the TSC is variant, but for + // our purposes we can treat it as invariant. + has_non_stop_time_stamp_counter_ = true; + } + } +#elif defined(ARCH_CPU_ARM_FAMILY) +#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) + if (require_branding) { + const ProcCpuInfo& info = ParseProcCpu(); + cpu_brand_ = info.brand; + implementer_ = info.implementer; + part_number_ = info.part_number; + } + +#if defined(ARCH_CPU_ARM64) + // Check for Armv8.5-A BTI/MTE support, exposed via HWCAP2 + unsigned long hwcap2 = getauxval(AT_HWCAP2); + has_mte_ = hwcap2 & HWCAP2_MTE; + has_bti_ = hwcap2 & HWCAP2_BTI; +#endif + +#elif BUILDFLAG(IS_WIN) + // Windows makes high-resolution thread timing information available in + // user-space. + has_non_stop_time_stamp_counter_ = true; +#endif +#endif +} + +#if defined(ARCH_CPU_X86_FAMILY) +CPU::IntelMicroArchitecture CPU::GetIntelMicroArchitecture() const { + if (has_avx2()) return AVX2; + if (has_fma3()) return FMA3; + if (has_avx()) return AVX; + if (has_sse42()) return SSE42; + if (has_sse41()) return SSE41; + if (has_ssse3()) return SSSE3; + if (has_sse3()) return SSE3; + if (has_sse2()) return SSE2; + if (has_sse()) return SSE; + return PENTIUM; +} +#endif + +const CPU& CPU::GetInstanceNoAllocation() { + static const base::NoDestructor cpu(CPU(false)); + + return *cpu; +} + +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/cpu.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/cpu.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/cpu.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/cpu.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,159 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CPU_H_ +#define BASE_CPU_H_ + +#include +#include + +#include "base/base_export.h" +#include "build/build_config.h" + +namespace base { + +#if defined(ARCH_CPU_X86_FAMILY) +namespace internal { + +struct X86ModelInfo { + int family; + int model; + int ext_family; + int ext_model; +}; + +// Compute the CPU family and model based on the vendor and CPUID signature. +BASE_EXPORT X86ModelInfo ComputeX86FamilyAndModel(const std::string& vendor, + int signature); + +} // namespace internal +#endif // defined(ARCH_CPU_X86_FAMILY) + +// Query information about the processor. +class BASE_EXPORT CPU final { + public: + CPU(); + CPU(CPU&&); + CPU(const CPU&) = delete; + + // Get a preallocated instance of CPU. + // This can be used in very early application startup. The instance of CPU is + // created without branding, see CPU(bool requires_branding) for details and + // implications. + static const CPU& GetInstanceNoAllocation(); + + enum IntelMicroArchitecture { + PENTIUM = 0, + SSE = 1, + SSE2 = 2, + SSE3 = 3, + SSSE3 = 4, + SSE41 = 5, + SSE42 = 6, + AVX = 7, + AVX2 = 8, + FMA3 = 9, + MAX_INTEL_MICRO_ARCHITECTURE = 10 + }; + + // Accessors for CPU information. + const std::string& vendor_name() const { return cpu_vendor_; } + int signature() const { return signature_; } + int stepping() const { return stepping_; } + int model() const { return model_; } + int family() const { return family_; } + int type() const { return type_; } + int extended_model() const { return ext_model_; } + int extended_family() const { return ext_family_; } + bool has_mmx() const { return has_mmx_; } + bool has_sse() const { return has_sse_; } + bool has_sse2() const { return has_sse2_; } + bool has_sse3() const { return has_sse3_; } + bool has_ssse3() const { return has_ssse3_; } + bool has_sse41() const { return has_sse41_; } + bool has_sse42() const { return has_sse42_; } + bool has_popcnt() const { return has_popcnt_; } + bool has_avx() const { return has_avx_; } + bool has_fma3() const { return has_fma3_; } + bool has_avx2() const { return has_avx2_; } + bool has_aesni() const { return has_aesni_; } + bool has_non_stop_time_stamp_counter() const { + return has_non_stop_time_stamp_counter_; + } + bool is_running_in_vm() const { return is_running_in_vm_; } + +#if defined(ARCH_CPU_ARM_FAMILY) + // The cpuinfo values for ARM cores are from the MIDR_EL1 register, a + // bitfield whose format is described in the core-specific manuals. E.g., + // ARM Cortex-A57: + // https://developer.arm.com/documentation/ddi0488/h/system-control/aarch64-register-descriptions/main-id-register--el1. + uint8_t implementer() const { return implementer_; } + uint32_t part_number() const { return part_number_; } +#endif + + // Armv8.5-A extensions for control flow and memory safety. +#if defined(ARCH_CPU_ARM_FAMILY) + bool has_mte() const { return has_mte_; } + bool has_bti() const { return has_bti_; } +#else + constexpr bool has_mte() const { return false; } + constexpr bool has_bti() const { return false; } +#endif + +#if defined(ARCH_CPU_X86_FAMILY) + // Memory protection key support for user-mode pages + bool has_pku() const { return has_pku_; } +#else + constexpr bool has_pku() const { return false; } +#endif + +#if defined(ARCH_CPU_X86_FAMILY) + IntelMicroArchitecture GetIntelMicroArchitecture() const; +#endif + const std::string& cpu_brand() const { return cpu_brand_; } + + private: + // Query the processor for CPUID information. + void Initialize(bool requires_branding); + explicit CPU(bool requires_branding); + + int signature_ = 0; // raw form of type, family, model, and stepping + int type_ = 0; // process type + int family_ = 0; // family of the processor + int model_ = 0; // model of processor + int stepping_ = 0; // processor revision number + int ext_model_ = 0; + int ext_family_ = 0; +#if defined(ARCH_CPU_ARM_FAMILY) + uint32_t part_number_ = 0; // ARM MIDR part number + uint8_t implementer_ = 0; // ARM MIDR implementer identifier +#endif + bool has_mmx_ = false; + bool has_sse_ = false; + bool has_sse2_ = false; + bool has_sse3_ = false; + bool has_ssse3_ = false; + bool has_sse41_ = false; + bool has_sse42_ = false; + bool has_popcnt_ = false; + bool has_avx_ = false; + bool has_fma3_ = false; + bool has_avx2_ = false; + bool has_aesni_ = false; +#if defined(ARCH_CPU_ARM_FAMILY) + bool has_mte_ = false; // Armv8.5-A MTE (Memory Taggging Extension) + bool has_bti_ = false; // Armv8.5-A BTI (Branch Target Identification) +#endif +#if defined(ARCH_CPU_X86_FAMILY) + bool has_pku_ = false; +#endif + bool has_non_stop_time_stamp_counter_ = false; + bool is_running_in_vm_ = false; + std::string cpu_vendor_ = "unknown"; + std::string cpu_brand_; +}; + +} // namespace base + +#endif // BASE_CPU_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/cxx20_is_constant_evaluated.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/cxx20_is_constant_evaluated.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/cxx20_is_constant_evaluated.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/cxx20_is_constant_evaluated.h 2025-12-01 18:15:47.000000000 +0000 @@ -0,0 +1,29 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CXX20_IS_CONSTANT_EVALUATED_H_ +#define BASE_CXX20_IS_CONSTANT_EVALUATED_H_ + +#if defined(MOZ_ZUCCHINI) +#include "base/compiler_specific.h" +#endif // defined(MOZ_ZUCCHINI) + +namespace base { + +// Implementation of C++20's std::is_constant_evaluated. +// +// References: +// - https://en.cppreference.com/w/cpp/types/is_constant_evaluated +// - https://wg21.link/meta.const.eval +constexpr bool is_constant_evaluated() noexcept { +#if !defined(MOZ_ZUCCHINI) || HAS_BUILTIN(__builtin_is_constant_evaluated) + return __builtin_is_constant_evaluated(); +#else + return false; +#endif // !defined(MOZ_ZUCCHINI) || HAS_BUILTIN(__builtin_is_constant_evaluated) +} + +} // namespace base + +#endif // BASE_CXX20_IS_CONSTANT_EVALUATED_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/cxx20_to_address.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/cxx20_to_address.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/cxx20_to_address.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/cxx20_to_address.h 2025-12-01 18:15:47.000000000 +0000 @@ -0,0 +1,50 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_CXX20_TO_ADDRESS_H_ +#define BASE_CXX20_TO_ADDRESS_H_ + +#include +#include + +namespace base { + +namespace { + +template +struct has_std_to_address : std::false_type {}; + +template +struct has_std_to_address< + Ptr, + std::void_t::to_address( + std::declval()))>> : std::true_type {}; + +} // namespace + +// Implementation of C++20's std::to_address. +// Note: This does consider specializations of pointer_traits<>::to_address, +// even though it's a C++20 member function, because CheckedContiguousIterator +// specializes pointer_traits<> with a to_address() member. +// +// Reference: https://wg21.link/pointer.conversion#lib:to_address +template +constexpr T* to_address(T* p) noexcept { + static_assert(!std::is_function::value, + "Error: T must not be a function type."); + return p; +} + +template +constexpr auto to_address(const Ptr& p) noexcept { + if constexpr (has_std_to_address::value) { + return std::pointer_traits::to_address(p); + } else { + return base::to_address(p.operator->()); + } +} + +} // namespace base + +#endif // BASE_CXX20_TO_ADDRESS_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/dcheck_is_on.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/dcheck_is_on.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/dcheck_is_on.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/dcheck_is_on.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,22 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_DCHECK_IS_ON_H_ +#define BASE_DCHECK_IS_ON_H_ + +#include "base/debug/debugging_buildflags.h" + +#if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON) +#define DCHECK_IS_ON() false +#else +#define DCHECK_IS_ON() true +#endif + +#if BUILDFLAG(EXPENSIVE_DCHECKS_ARE_ON) +#define EXPENSIVE_DCHECKS_ARE_ON() true +#else +#define EXPENSIVE_DCHECKS_ARE_ON() false +#endif + +#endif // BASE_DCHECK_IS_ON_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file.cc 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,181 @@ +// Copyright 2011 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file.h" + +#include + +#include "base/check_op.h" +#include "base/files/file_path.h" +#include "base/files/file_tracing.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/metrics/histogram.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/notreached.h" +#include "base/numerics/safe_conversions.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/timer/elapsed_timer.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/trace_event/base_tracing.h" +#include "build/build_config.h" + +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +#include +#endif + +namespace base { + +File::Info::Info() = default; + +File::Info::~Info() = default; + +File::File() = default; + +#if !BUILDFLAG(IS_NACL) +File::File(const FilePath& path, uint32_t flags) : error_details_(FILE_OK) { + Initialize(path, flags); +} +#endif + +File::File(ScopedPlatformFile platform_file) + : File(std::move(platform_file), false) {} + +File::File(PlatformFile platform_file) : File(platform_file, false) {} + +File::File(ScopedPlatformFile platform_file, bool async) + : file_(std::move(platform_file)), error_details_(FILE_OK), async_(async) { +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + DCHECK_GE(file_.get(), -1); +#endif +} + +File::File(PlatformFile platform_file, bool async) + : file_(platform_file), + error_details_(FILE_OK), + async_(async) { +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + DCHECK_GE(platform_file, -1); +#endif +} + +File::File(Error error_details) : error_details_(error_details) {} + +File::File(File&& other) + : file_(other.TakePlatformFile()), + tracing_path_(other.tracing_path_), + error_details_(other.error_details()), + created_(other.created()), + async_(other.async_) {} + +File::~File() { + // Go through the AssertIOAllowed logic. + Close(); +} + +File& File::operator=(File&& other) { + Close(); + SetPlatformFile(other.TakePlatformFile()); + tracing_path_ = other.tracing_path_; + error_details_ = other.error_details(); + created_ = other.created(); + async_ = other.async_; + return *this; +} + +#if !BUILDFLAG(IS_NACL) +void File::Initialize(const FilePath& path, uint32_t flags) { + if (path.ReferencesParent()) { +#if BUILDFLAG(IS_WIN) + ::SetLastError(ERROR_ACCESS_DENIED); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + errno = EACCES; +#else +#error Unsupported platform +#endif + error_details_ = FILE_ERROR_ACCESS_DENIED; + return; + } + if (FileTracing::IsCategoryEnabled()) + tracing_path_ = path; + SCOPED_FILE_TRACE("Initialize"); + DoInitialize(path, flags); +} +#endif + +bool File::ReadAndCheck(int64_t offset, span data) { + int size = checked_cast(data.size()); + return Read(offset, reinterpret_cast(data.data()), size) == size; +} + +bool File::ReadAtCurrentPosAndCheck(span data) { + int size = checked_cast(data.size()); + return ReadAtCurrentPos(reinterpret_cast(data.data()), size) == size; +} + +bool File::WriteAndCheck(int64_t offset, span data) { + int size = checked_cast(data.size()); + return Write(offset, reinterpret_cast(data.data()), size) == + size; +} + +bool File::WriteAtCurrentPosAndCheck(span data) { + int size = checked_cast(data.size()); + return WriteAtCurrentPos(reinterpret_cast(data.data()), size) == + size; +} + +// static +std::string File::ErrorToString(Error error) { + switch (error) { + case FILE_OK: + return "FILE_OK"; + case FILE_ERROR_FAILED: + return "FILE_ERROR_FAILED"; + case FILE_ERROR_IN_USE: + return "FILE_ERROR_IN_USE"; + case FILE_ERROR_EXISTS: + return "FILE_ERROR_EXISTS"; + case FILE_ERROR_NOT_FOUND: + return "FILE_ERROR_NOT_FOUND"; + case FILE_ERROR_ACCESS_DENIED: + return "FILE_ERROR_ACCESS_DENIED"; + case FILE_ERROR_TOO_MANY_OPENED: + return "FILE_ERROR_TOO_MANY_OPENED"; + case FILE_ERROR_NO_MEMORY: + return "FILE_ERROR_NO_MEMORY"; + case FILE_ERROR_NO_SPACE: + return "FILE_ERROR_NO_SPACE"; + case FILE_ERROR_NOT_A_DIRECTORY: + return "FILE_ERROR_NOT_A_DIRECTORY"; + case FILE_ERROR_INVALID_OPERATION: + return "FILE_ERROR_INVALID_OPERATION"; + case FILE_ERROR_SECURITY: + return "FILE_ERROR_SECURITY"; + case FILE_ERROR_ABORT: + return "FILE_ERROR_ABORT"; + case FILE_ERROR_NOT_A_FILE: + return "FILE_ERROR_NOT_A_FILE"; + case FILE_ERROR_NOT_EMPTY: + return "FILE_ERROR_NOT_EMPTY"; + case FILE_ERROR_INVALID_URL: + return "FILE_ERROR_INVALID_URL"; + case FILE_ERROR_IO: + return "FILE_ERROR_IO"; + case FILE_ERROR_MAX: + break; + } + + NOTREACHED(); + return ""; +} + +void File::WriteIntoTrace(perfetto::TracedValue context) const { + auto dict = std::move(context).WriteDictionary(); + dict.Add("is_valid", IsValid()); + dict.Add("created", created_); + dict.Add("async", async_); + dict.Add("error_details", ErrorToString(error_details_)); +} + +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file.h 2025-12-01 18:15:47.000000000 +0000 @@ -0,0 +1,426 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_FILES_FILE_H_ +#define BASE_FILES_FILE_H_ + +#include + +#include + +#include "base/base_export.h" +#include "base/containers/span.h" +#include "base/files/file_path.h" +#include "base/files/file_tracing.h" +#include "base/files/platform_file.h" +#include "base/time/time.h" +#include "base/trace_event/base_tracing_forward.h" +#include "build/build_config.h" + +struct stat; + +namespace base { + +using stat_wrapper_t = struct stat; + +// Thin wrapper around an OS-level file. +// Note that this class does not provide any support for asynchronous IO, other +// than the ability to create asynchronous handles on Windows. +// +// Note about const: this class does not attempt to determine if the underlying +// file system object is affected by a particular method in order to consider +// that method const or not. Only methods that deal with member variables in an +// obvious non-modifying way are marked as const. Any method that forward calls +// to the OS is not considered const, even if there is no apparent change to +// member variables. +// +// On POSIX, if the given file is a symbolic link, most of the methods apply to +// the file that the symbolic link resolves to. +class BASE_EXPORT File { + public: + // FLAG_(OPEN|CREATE).* are mutually exclusive. You should specify exactly one + // of the five (possibly combining with other flags) when opening or creating + // a file. + // FLAG_(WRITE|APPEND) are mutually exclusive. This is so that APPEND behavior + // will be consistent with O_APPEND on POSIX. + enum Flags : uint32_t { + FLAG_OPEN = 1 << 0, // Opens a file, only if it exists. + FLAG_CREATE = 1 << 1, // Creates a new file, only if it does not + // already exist. + FLAG_OPEN_ALWAYS = 1 << 2, // May create a new file. + FLAG_CREATE_ALWAYS = 1 << 3, // May overwrite an old file. + FLAG_OPEN_TRUNCATED = 1 << 4, // Opens a file and truncates it, only if it + // exists. + FLAG_READ = 1 << 5, + FLAG_WRITE = 1 << 6, + FLAG_APPEND = 1 << 7, + FLAG_WIN_EXCLUSIVE_READ = 1 << 8, // Windows only. Opposite of SHARE. + FLAG_WIN_EXCLUSIVE_WRITE = 1 << 9, // Windows only. Opposite of SHARE. + FLAG_ASYNC = 1 << 10, + FLAG_WIN_TEMPORARY = 1 << 11, // Windows only. + FLAG_WIN_HIDDEN = 1 << 12, // Windows only. + FLAG_DELETE_ON_CLOSE = 1 << 13, + FLAG_WRITE_ATTRIBUTES = 1 << 14, // File opened in a mode allowing writing + // attributes, such as with SetTimes(). + FLAG_WIN_SHARE_DELETE = 1 << 15, // Windows only. + FLAG_TERMINAL_DEVICE = 1 << 16, // Serial port flags. + FLAG_WIN_BACKUP_SEMANTICS = 1 << 17, // Windows only. + FLAG_WIN_EXECUTE = 1 << 18, // Windows only. + FLAG_WIN_SEQUENTIAL_SCAN = 1 << 19, // Windows only. + FLAG_CAN_DELETE_ON_CLOSE = 1 << 20, // Requests permission to delete a file + // via DeleteOnClose() (Windows only). + // See DeleteOnClose() for details. +#if !defined(MOZ_ZUCCHINI) + FLAG_WIN_NO_EXECUTE = + 1 << 21, // Windows only. Marks the file with a deny ACE that prevents + // opening the file with EXECUTE access. Cannot be used with + // FILE_WIN_EXECUTE flag. See also PreventExecuteMapping. +#endif // !defined(MOZ_ZUCCHINI) + }; + + // This enum has been recorded in multiple histograms using PlatformFileError + // enum. If the order of the fields needs to change, please ensure that those + // histograms are obsolete or have been moved to a different enum. + // + // FILE_ERROR_ACCESS_DENIED is returned when a call fails because of a + // filesystem restriction. FILE_ERROR_SECURITY is returned when a browser + // policy doesn't allow the operation to be executed. + enum Error { + FILE_OK = 0, + FILE_ERROR_FAILED = -1, + FILE_ERROR_IN_USE = -2, + FILE_ERROR_EXISTS = -3, + FILE_ERROR_NOT_FOUND = -4, + FILE_ERROR_ACCESS_DENIED = -5, + FILE_ERROR_TOO_MANY_OPENED = -6, + FILE_ERROR_NO_MEMORY = -7, + FILE_ERROR_NO_SPACE = -8, + FILE_ERROR_NOT_A_DIRECTORY = -9, + FILE_ERROR_INVALID_OPERATION = -10, + FILE_ERROR_SECURITY = -11, + FILE_ERROR_ABORT = -12, + FILE_ERROR_NOT_A_FILE = -13, + FILE_ERROR_NOT_EMPTY = -14, + FILE_ERROR_INVALID_URL = -15, + FILE_ERROR_IO = -16, + // Put new entries here and increment FILE_ERROR_MAX. + FILE_ERROR_MAX = -17 + }; + + // This explicit mapping matches both FILE_ on Windows and SEEK_ on Linux. + enum Whence { + FROM_BEGIN = 0, + FROM_CURRENT = 1, + FROM_END = 2 + }; + + // Used to hold information about a given file. + // If you add more fields to this structure (platform-specific fields are OK), + // make sure to update all functions that use it in file_util_{win|posix}.cc, + // too, and the ParamTraits implementation in + // ipc/ipc_message_utils.cc. + struct BASE_EXPORT Info { + Info(); + ~Info(); +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + // Fills this struct with values from |stat_info|. + void FromStat(const stat_wrapper_t& stat_info); +#endif + + // The size of the file in bytes. Undefined when is_directory is true. + int64_t size = 0; + + // True if the file corresponds to a directory. + bool is_directory = false; + + // True if the file corresponds to a symbolic link. For Windows currently + // not supported and thus always false. + bool is_symbolic_link = false; + + // The last modified time of a file. + Time last_modified; + + // The last accessed time of a file. + Time last_accessed; + + // The creation time of a file. + Time creation_time; + }; + + File(); + + // Creates or opens the given file. This will fail with 'access denied' if the + // |path| contains path traversal ('..') components. + File(const FilePath& path, uint32_t flags); + + // Takes ownership of |platform_file| and sets async to false. + explicit File(ScopedPlatformFile platform_file); + explicit File(PlatformFile platform_file); + + // Takes ownership of |platform_file| and sets async to the given value. + // This constructor exists because on Windows you can't check if platform_file + // is async or not. + File(ScopedPlatformFile platform_file, bool async); + File(PlatformFile platform_file, bool async); + + // Creates an object with a specific error_details code. + explicit File(Error error_details); + + File(File&& other); + + File(const File&) = delete; + File& operator=(const File&) = delete; + + ~File(); + + File& operator=(File&& other); + + // Creates or opens the given file. + void Initialize(const FilePath& path, uint32_t flags); + + // Returns |true| if the handle / fd wrapped by this object is valid. This + // method doesn't interact with the file system and is thus safe to be called + // from threads that disallow blocking. + bool IsValid() const; + + // Returns true if a new file was created (or an old one truncated to zero + // length to simulate a new file, which can happen with + // FLAG_CREATE_ALWAYS), and false otherwise. + bool created() const { return created_; } + + // Returns the OS result of opening this file. Note that the way to verify + // the success of the operation is to use IsValid(), not this method: + // File file(path, flags); + // if (!file.IsValid()) + // return; + Error error_details() const { return error_details_; } + + PlatformFile GetPlatformFile() const; + PlatformFile TakePlatformFile(); + + // Destroying this object closes the file automatically. + void Close(); + + // Changes current position in the file to an |offset| relative to an origin + // defined by |whence|. Returns the resultant current position in the file + // (relative to the start) or -1 in case of error. + int64_t Seek(Whence whence, int64_t offset); + + // Simplified versions of Read() and friends (see below) that check the int + // return value and just return a boolean. They return true if and only if + // the function read in / wrote out exactly |data.size()| bytes of data. + bool ReadAndCheck(int64_t offset, span data); + bool ReadAtCurrentPosAndCheck(span data); + bool WriteAndCheck(int64_t offset, span data); + bool WriteAtCurrentPosAndCheck(span data); + + // Reads the given number of bytes (or until EOF is reached) starting with the + // given offset. Returns the number of bytes read, or -1 on error. Note that + // this function makes a best effort to read all data on all platforms, so it + // is not intended for stream oriented files but instead for cases when the + // normal expectation is that actually |size| bytes are read unless there is + // an error. + int Read(int64_t offset, char* data, int size); + + // Same as above but without seek. + int ReadAtCurrentPos(char* data, int size); + + // Reads the given number of bytes (or until EOF is reached) starting with the + // given offset, but does not make any effort to read all data on all + // platforms. Returns the number of bytes read, or -1 on error. + int ReadNoBestEffort(int64_t offset, char* data, int size); + + // Same as above but without seek. + int ReadAtCurrentPosNoBestEffort(char* data, int size); + + // Writes the given buffer into the file at the given offset, overwritting any + // data that was previously there. Returns the number of bytes written, or -1 + // on error. Note that this function makes a best effort to write all data on + // all platforms. |data| can be nullptr when |size| is 0. + // Ignores the offset and writes to the end of the file if the file was opened + // with FLAG_APPEND. + int Write(int64_t offset, const char* data, int size); + + // Save as above but without seek. + int WriteAtCurrentPos(const char* data, int size); + + // Save as above but does not make any effort to write all data on all + // platforms. Returns the number of bytes written, or -1 on error. + int WriteAtCurrentPosNoBestEffort(const char* data, int size); + + // Returns the current size of this file, or a negative number on failure. + int64_t GetLength(); + + // Truncates the file to the given length. If |length| is greater than the + // current size of the file, the file is extended with zeros. If the file + // doesn't exist, |false| is returned. + bool SetLength(int64_t length); + + // Instructs the filesystem to flush the file to disk. (POSIX: fsync, Windows: + // FlushFileBuffers). + // Calling Flush() does not guarantee file integrity and thus is not a valid + // substitute for file integrity checks and recovery codepaths for malformed + // files. It can also be *really* slow, so avoid blocking on Flush(), + // especially please don't block shutdown on Flush(). + // Latency percentiles of Flush() across all platforms as of July 2016: + // 50 % > 5 ms + // 10 % > 58 ms + // 1 % > 357 ms + // 0.1 % > 1.8 seconds + // 0.01 % > 7.6 seconds + bool Flush(); + + // Updates the file times. + bool SetTimes(Time last_access_time, Time last_modified_time); + + // Returns some basic information for the given file. + bool GetInfo(Info* info); + +#if !BUILDFLAG( \ + IS_FUCHSIA) // Fuchsia's POSIX API does not support file locking. + enum class LockMode { + kShared, + kExclusive, + }; + + // Attempts to take an exclusive write lock on the file. Returns immediately + // (i.e. does not wait for another process to unlock the file). If the lock + // was obtained, the result will be FILE_OK. A lock only guarantees + // that other processes may not also take a lock on the same file with the + // same API - it may still be opened, renamed, unlinked, etc. + // + // Common semantics: + // * Locks are held by processes, but not inherited by child processes. + // * Locks are released by the OS on file close or process termination. + // * Locks are reliable only on local filesystems. + // * Duplicated file handles may also write to locked files. + // Windows-specific semantics: + // * Locks are mandatory for read/write APIs, advisory for mapping APIs. + // * Within a process, locking the same file (by the same or new handle) + // will fail. + // POSIX-specific semantics: + // * Locks are advisory only. + // * Within a process, locking the same file (by the same or new handle) + // will succeed. The new lock replaces the old lock. + // * Closing any descriptor on a given file releases the lock. + Error Lock(LockMode mode); + + // Unlock a file previously locked. + Error Unlock(); + +#endif // !BUILDFLAG(IS_FUCHSIA) + + // Returns a new object referencing this file for use within the current + // process. Handling of FLAG_DELETE_ON_CLOSE varies by OS. On POSIX, the File + // object that was created or initialized with this flag will have unlinked + // the underlying file when it was created or opened. On Windows, the + // underlying file is deleted when the last handle to it is closed. + File Duplicate() const; + + bool async() const { return async_; } + + // Serialise this object into a trace. + void WriteIntoTrace(perfetto::TracedValue context) const; + +#if BUILDFLAG(IS_WIN) + // Sets or clears the DeleteFile disposition on the file. Returns true if + // the disposition was set or cleared, as indicated by |delete_on_close|. + // + // Microsoft Windows deletes a file only when the DeleteFile disposition is + // set on a file when the last handle to the last underlying kernel File + // object is closed. This disposition is be set by: + // - Calling the Win32 DeleteFile function with the path to a file. + // - Opening/creating a file with FLAG_DELETE_ON_CLOSE and then closing all + // handles to that File object. + // - Opening/creating a file with FLAG_CAN_DELETE_ON_CLOSE and subsequently + // calling DeleteOnClose(true). + // + // In all cases, all pre-existing handles to the file must have been opened + // with FLAG_WIN_SHARE_DELETE. Once the disposition has been set by any of the + // above means, no new File objects can be created for the file. + // + // So: + // - Use FLAG_WIN_SHARE_DELETE when creating/opening a file to allow another + // entity on the system to cause it to be deleted when it is closed. (Note: + // another entity can delete the file the moment after it is closed, so not + // using this permission doesn't provide any protections.) + // - Use FLAG_DELETE_ON_CLOSE for any file that is to be deleted after use. + // The OS will ensure it is deleted even in the face of process termination. + // Note that it's possible for deletion to be cancelled via another File + // object referencing the same file using DeleteOnClose(false) to clear the + // DeleteFile disposition after the original File is closed. + // - Use FLAG_CAN_DELETE_ON_CLOSE in conjunction with DeleteOnClose() to alter + // the DeleteFile disposition on an open handle. This fine-grained control + // allows for marking a file for deletion during processing so that it is + // deleted in the event of untimely process termination, and then clearing + // this state once the file is suitable for persistence. + bool DeleteOnClose(bool delete_on_close); +#endif + +#if BUILDFLAG(IS_WIN) + static Error OSErrorToFileError(DWORD last_error); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + static Error OSErrorToFileError(int saved_errno); +#endif + + // Gets the last global error (errno or GetLastError()) and converts it to the + // closest base::File::Error equivalent via OSErrorToFileError(). The returned + // value is only trustworthy immediately after another base::File method + // fails. base::File never resets the global error to zero. + static Error GetLastFileError(); + + // Converts an error value to a human-readable form. Used for logging. + static std::string ErrorToString(Error error); + +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + // Wrapper for stat(). + static int Stat(const char* path, stat_wrapper_t* sb); + // Wrapper for fstat(). + static int Fstat(int fd, stat_wrapper_t* sb); + // Wrapper for lstat(). + static int Lstat(const char* path, stat_wrapper_t* sb); +#endif + +#if !defined(MOZ_ZUCCHINI) + // This function can be used to augment `flags` with the correct flags + // required to create a File that can be safely passed to an untrusted + // process. It must be called if the File is intended to be transferred to an + // untrusted process, but can still be safely called even if the File is not + // intended to be transferred. + static constexpr uint32_t AddFlagsForPassingToUntrustedProcess( + uint32_t flags) { + if (flags & File::FLAG_WRITE || flags & File::FLAG_APPEND || + flags & File::FLAG_WRITE_ATTRIBUTES) { + flags |= File::FLAG_WIN_NO_EXECUTE; + } + return flags; + } +#endif // !defined(MOZ_ZUCCHINI) + + private: + friend class FileTracing::ScopedTrace; + + // Creates or opens the given file. Only called if |path| has no + // traversal ('..') components. + void DoInitialize(const FilePath& path, uint32_t flags); + + void SetPlatformFile(PlatformFile file); + + ScopedPlatformFile file_; + + // A path to use for tracing purposes. Set if file tracing is enabled during + // |Initialize()|. + FilePath tracing_path_; + + // Object tied to the lifetime of |this| that enables/disables tracing. + FileTracing::ScopedEnabler trace_enabler_; + + Error error_details_ = FILE_ERROR_FAILED; + bool created_ = false; + bool async_ = false; +}; + +} // namespace base + +#endif // BASE_FILES_FILE_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_enumerator.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_enumerator.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator.cc 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,32 @@ +// Copyright 2013 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file_enumerator.h" + +#include "base/files/file_util.h" +#include "base/functional/function_ref.h" + +namespace base { + +FileEnumerator::FileInfo::~FileInfo() = default; + +bool FileEnumerator::ShouldSkip(const FilePath& path) { + FilePath::StringType basename = path.BaseName().value(); + return basename == FILE_PATH_LITERAL(".") || + (basename == FILE_PATH_LITERAL("..") && + !(INCLUDE_DOT_DOT & file_type_)); +} + +bool FileEnumerator::IsTypeMatched(bool is_dir) const { + return (file_type_ & + (is_dir ? FileEnumerator::DIRECTORIES : FileEnumerator::FILES)) != 0; +} + +void FileEnumerator::ForEach(FunctionRef ref) { + for (FilePath name = Next(); !name.empty(); name = Next()) { + ref(name); + } +} + +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_enumerator.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_enumerator.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,246 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_FILES_FILE_ENUMERATOR_H_ +#define BASE_FILES_FILE_ENUMERATOR_H_ + +#include +#include + +#include + +#include "base/base_export.h" +#include "base/containers/stack.h" +#include "base/files/file.h" +#include "base/files/file_path.h" +#include "base/functional/function_ref.h" +#include "base/time/time.h" +#include "build/build_config.h" + +#if BUILDFLAG(IS_WIN) +#include "base/win/windows_types.h" +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +#include +#include +#include +#endif + +namespace base { + +// A class for enumerating the files in a provided path. The order of the +// results is not guaranteed. +// +// This is blocking. Do not use on critical threads. +// +// Example: +// +// base::FileEnumerator e(my_dir, false, base::FileEnumerator::FILES, +// FILE_PATH_LITERAL("*.txt")); +// Using `ForEach` with a lambda: +// e.ForEach([](const base::FilePath& item) {...}); +// Using a `for` loop: +// for (base::FilePath name = e.Next(); !name.empty(); name = e.Next()) +// ... +class BASE_EXPORT FileEnumerator { + public: + // Note: copy & assign supported. + class BASE_EXPORT FileInfo { + public: + FileInfo(); + ~FileInfo(); + + bool IsDirectory() const; + + // The name of the file. This will not include any path information. This + // is in constrast to the value returned by FileEnumerator.Next() which + // includes the |root_path| passed into the FileEnumerator constructor. + FilePath GetName() const; + + int64_t GetSize() const; + + // On POSIX systems, this is rounded down to the second. + Time GetLastModifiedTime() const; + +#if BUILDFLAG(IS_WIN) + // Note that the cAlternateFileName (used to hold the "short" 8.3 name) + // of the WIN32_FIND_DATA will be empty. Since we don't use short file + // names, we tell Windows to omit it which speeds up the query slightly. + const WIN32_FIND_DATA& find_data() const { + return *ChromeToWindowsType(&find_data_); + } +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + const stat_wrapper_t& stat() const { return stat_; } +#endif + + private: + friend class FileEnumerator; + +#if BUILDFLAG(IS_WIN) + CHROME_WIN32_FIND_DATA find_data_; +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + stat_wrapper_t stat_; + FilePath filename_; +#endif + }; + + enum FileType { + FILES = 1 << 0, + DIRECTORIES = 1 << 1, + INCLUDE_DOT_DOT = 1 << 2, + + // Report only the names of entries and not their type, size, or + // last-modified time. May only be used for non-recursive enumerations, and + // implicitly includes both files and directories (neither of which may be + // specified). When used, an enumerator's `GetInfo()` method must not be + // called. + NAMES_ONLY = 1 << 3, + +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + SHOW_SYM_LINKS = 1 << 4, +#endif + }; + + // Search policy for intermediate folders. + enum class FolderSearchPolicy { + // Recursive search will pass through folders whose names match the + // pattern. Inside each one, all files will be returned. Folders with names + // that do not match the pattern will be ignored within their interior. + MATCH_ONLY, + // Recursive search will pass through every folder and perform pattern + // matching inside each one. + ALL, + }; + + // Determines how a FileEnumerator handles errors encountered during + // enumeration. When no ErrorPolicy is explicitly set, FileEnumerator defaults + // to IGNORE_ERRORS. + enum class ErrorPolicy { + // Errors are ignored if possible and FileEnumerator returns as many files + // as it is able to enumerate. + IGNORE_ERRORS, + + // Any error encountered during enumeration will terminate the enumeration + // immediately. An error code indicating the nature of a failure can be + // retrieved from |GetError()|. + STOP_ENUMERATION, + }; + + // |root_path| is the starting directory to search for. It may or may not end + // in a slash. + // + // If |recursive| is true, this will enumerate all matches in any + // subdirectories matched as well. It does a breadth-first search, so all + // files in one directory will be returned before any files in a + // subdirectory. + // + // |file_type|, a bit mask of FileType, specifies whether the enumerator + // should match files, directories, or both. + // + // |pattern| is an optional pattern for which files to match. This + // works like shell globbing. For example, "*.txt" or "Foo???.doc". + // However, be careful in specifying patterns that aren't cross platform + // since the underlying code uses OS-specific matching routines. In general, + // Windows matching is less featureful than others, so test there first. + // If unspecified, this will match all files. + // + // |folder_search_policy| optionally specifies a search behavior. Refer to + // |FolderSearchPolicy| for a list of folder search policies and the meaning + // of them. If |recursive| is false, this parameter has no effect. + // + // |error_policy| optionally specifies the behavior when an error occurs. + // Refer to |ErrorPolicy| for a list of error policies and the meaning of + // them. + FileEnumerator(const FilePath& root_path, bool recursive, int file_type); + FileEnumerator(const FilePath& root_path, + bool recursive, + int file_type, + const FilePath::StringType& pattern); + FileEnumerator(const FilePath& root_path, + bool recursive, + int file_type, + const FilePath::StringType& pattern, + FolderSearchPolicy folder_search_policy); + FileEnumerator(const FilePath& root_path, + bool recursive, + int file_type, + const FilePath::StringType& pattern, + FolderSearchPolicy folder_search_policy, + ErrorPolicy error_policy); + FileEnumerator(const FileEnumerator&) = delete; + FileEnumerator& operator=(const FileEnumerator&) = delete; + ~FileEnumerator(); + + // Calls `ref` synchronously for each path found by the `FileEnumerator`. Each + // path will incorporate the `root_path` passed in the constructor: + // "/file_name.txt". If the `root_path` is absolute, then so will + // be the paths provided in the `ref` invocations. + void ForEach(FunctionRef ref); + + // Returns the next file or an empty string if there are no more results. + // + // The returned path will incorporate the |root_path| passed in the + // constructor: "/file_name.txt". If the |root_path| is absolute, + // then so will be the result of Next(). + FilePath Next(); + + // Returns info about the file last returned by Next(). Note that on Windows + // and Fuchsia, GetInfo() does not play well with INCLUDE_DOT_DOT. In + // particular, the GetLastModifiedTime() for the .. directory is 1601-01-01 + // on Fuchsia (https://crbug.com/1106172) and is equal to the last modified + // time of the current directory on Windows (https://crbug.com/1119546). + // Must not be used with FileType::NAMES_ONLY. + FileInfo GetInfo() const; + + // Once |Next()| returns an empty path, enumeration has been terminated. If + // termination was normal (i.e. no more results to enumerate) or ErrorPolicy + // is set to IGNORE_ERRORS, this returns FILE_OK. Otherwise it returns an + // error code reflecting why enumeration was stopped early. + File::Error GetError() const { return error_; } + + private: + // Returns true if the given path should be skipped in enumeration. + bool ShouldSkip(const FilePath& path); + + bool IsTypeMatched(bool is_dir) const; + + bool IsPatternMatched(const FilePath& src) const; + +#if BUILDFLAG(IS_WIN) + const WIN32_FIND_DATA& find_data() const { + return *ChromeToWindowsType(&find_data_); + } + + // True when find_data_ is valid. + bool has_find_data_ = false; + CHROME_WIN32_FIND_DATA find_data_; + HANDLE find_handle_ = INVALID_HANDLE_VALUE; +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + // The files in the current directory + std::vector directory_entries_; + + // Set of visited directories. Used to prevent infinite looping along + // circular symlinks. + // The Android NDK (r23) does not declare `st_ino` as an `ino_t`, hence the + // need for the ugly decltype. + std::unordered_set visited_directories_; + + // The next entry to use from the directory_entries_ vector + size_t current_directory_entry_; +#endif + FilePath root_path_; + const bool recursive_; + int file_type_; + FilePath::StringType pattern_; + const FolderSearchPolicy folder_search_policy_; + const ErrorPolicy error_policy_; + File::Error error_ = File::FILE_OK; + + // A stack that keeps track of which subdirectories we still need to + // enumerate in the breadth-first search. + base::stack pending_paths_; +}; + +} // namespace base + +#endif // BASE_FILES_FILE_ENUMERATOR_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_enumerator_posix.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator_posix.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_enumerator_posix.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator_posix.cc 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,265 @@ +// Copyright 2013 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file_enumerator.h" + +#include +#include +#include +#include +#include + +#include "base/logging.h" +#include "base/threading/scoped_blocking_call.h" +#include "build/build_config.h" + +namespace base { +namespace { + +void GetStat(const FilePath& path, bool show_links, stat_wrapper_t* st) { + DCHECK(st); + const int res = show_links ? File::Lstat(path.value().c_str(), st) + : File::Stat(path.value().c_str(), st); + if (res < 0) { + // Print the stat() error message unless it was ENOENT and we're following + // symlinks. + DPLOG_IF(ERROR, errno != ENOENT || show_links) + << "Cannot stat '" << path << "'"; + memset(st, 0, sizeof(*st)); + } +} + +#if BUILDFLAG(IS_FUCHSIA) +bool ShouldShowSymLinks(int file_type) { + return false; +} +#else +bool ShouldShowSymLinks(int file_type) { + return file_type & FileEnumerator::SHOW_SYM_LINKS; +} +#endif // BUILDFLAG(IS_FUCHSIA) + +#if BUILDFLAG(IS_FUCHSIA) +bool ShouldTrackVisitedDirectories(int file_type) { + return false; +} +#else +bool ShouldTrackVisitedDirectories(int file_type) { + return !(file_type & FileEnumerator::SHOW_SYM_LINKS); +} +#endif // BUILDFLAG(IS_FUCHSIA) + +} // namespace + +// FileEnumerator::FileInfo ---------------------------------------------------- + +FileEnumerator::FileInfo::FileInfo() { + memset(&stat_, 0, sizeof(stat_)); +} + +bool FileEnumerator::FileInfo::IsDirectory() const { + return S_ISDIR(stat_.st_mode); +} + +FilePath FileEnumerator::FileInfo::GetName() const { + return filename_; +} + +int64_t FileEnumerator::FileInfo::GetSize() const { + return stat_.st_size; +} + +base::Time FileEnumerator::FileInfo::GetLastModifiedTime() const { + return base::Time::FromTimeT(stat_.st_mtime); +} + +// FileEnumerator -------------------------------------------------------------- + +FileEnumerator::FileEnumerator(const FilePath& root_path, + bool recursive, + int file_type) + : FileEnumerator(root_path, + recursive, + file_type, + FilePath::StringType(), + FolderSearchPolicy::MATCH_ONLY) {} + +FileEnumerator::FileEnumerator(const FilePath& root_path, + bool recursive, + int file_type, + const FilePath::StringType& pattern) + : FileEnumerator(root_path, + recursive, + file_type, + pattern, + FolderSearchPolicy::MATCH_ONLY) {} + +FileEnumerator::FileEnumerator(const FilePath& root_path, + bool recursive, + int file_type, + const FilePath::StringType& pattern, + FolderSearchPolicy folder_search_policy) + : FileEnumerator(root_path, + recursive, + file_type, + pattern, + folder_search_policy, + ErrorPolicy::IGNORE_ERRORS) {} + +FileEnumerator::FileEnumerator(const FilePath& root_path, + bool recursive, + int file_type, + const FilePath::StringType& pattern, + FolderSearchPolicy folder_search_policy, + ErrorPolicy error_policy) + : current_directory_entry_(0), + root_path_(root_path), + recursive_(recursive), + file_type_(file_type), + pattern_(pattern), + folder_search_policy_(folder_search_policy), + error_policy_(error_policy) { + // INCLUDE_DOT_DOT must not be specified if recursive. + DCHECK(!(recursive && (INCLUDE_DOT_DOT & file_type_))); + + if (file_type_ & FileType::NAMES_ONLY) { + DCHECK(!recursive_); + DCHECK_EQ(file_type_ & ~(FileType::NAMES_ONLY | FileType::INCLUDE_DOT_DOT), + 0); + file_type_ |= (FileType::FILES | FileType::DIRECTORIES); + } + + if (recursive && ShouldTrackVisitedDirectories(file_type_)) { + stat_wrapper_t st; + GetStat(root_path, false, &st); + visited_directories_.insert(st.st_ino); + } + + pending_paths_.push(root_path); +} + +FileEnumerator::~FileEnumerator() = default; + +FilePath FileEnumerator::Next() { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + ++current_directory_entry_; + + // While we've exhausted the entries in the current directory, do the next + while (current_directory_entry_ >= directory_entries_.size()) { + if (pending_paths_.empty()) + return FilePath(); + + root_path_ = pending_paths_.top(); + root_path_ = root_path_.StripTrailingSeparators(); + pending_paths_.pop(); + + DIR* dir = opendir(root_path_.value().c_str()); + if (!dir) { + if (errno == 0 || error_policy_ == ErrorPolicy::IGNORE_ERRORS) + continue; + error_ = File::OSErrorToFileError(errno); + return FilePath(); + } + + directory_entries_.clear(); + +#if BUILDFLAG(IS_FUCHSIA) + // Fuchsia does not support .. on the file system server side, see + // https://fuchsia.googlesource.com/docs/+/master/dotdot.md and + // https://crbug.com/735540. However, for UI purposes, having the parent + // directory show up in directory listings makes sense, so we add it here to + // match the expectation on other operating systems. In cases where this + // is useful it should be resolvable locally. + FileInfo dotdot; + dotdot.stat_.st_mode = S_IFDIR; + dotdot.filename_ = FilePath(".."); + if (!ShouldSkip(dotdot.filename_)) { + directory_entries_.push_back(std::move(dotdot)); + } +#endif // BUILDFLAG(IS_FUCHSIA) + + current_directory_entry_ = 0; + struct dirent* dent; + // NOTE: Per the readdir() documentation, when the end of the directory is + // reached with no errors, null is returned and errno is not changed. + // Therefore we must reset errno to zero before calling readdir() if we + // wish to know whether a null result indicates an error condition. +#if !defined(MOZ_ZUCCHINI) + while (errno = 0, dent = readdir(dir)) { +#else + while ((void)(errno = 0), dent = readdir(dir)) { +#endif // !defined(MOZ_ZUCCHINI) + FileInfo info; + info.filename_ = FilePath(dent->d_name); + + if (ShouldSkip(info.filename_)) + continue; + + const bool is_pattern_matched = IsPatternMatched(info.filename_); + + // MATCH_ONLY policy enumerates files and directories which matching + // pattern only. So we can early skip further checks. + if (folder_search_policy_ == FolderSearchPolicy::MATCH_ONLY && + !is_pattern_matched) + continue; + + // Do not call OS stat/lstat if there is no sense to do it. If pattern is + // not matched (file will not appear in results) and search is not + // recursive (possible directory will not be added to pending paths) - + // there is no sense to obtain item below. + if (!recursive_ && !is_pattern_matched) + continue; + + // If the caller only wants the names of files and directories, then + // continue without populating `info` further. + if (file_type_ & FileType::NAMES_ONLY) { + directory_entries_.push_back(std::move(info)); + continue; + } + + const FilePath full_path = root_path_.Append(info.filename_); + GetStat(full_path, ShouldShowSymLinks(file_type_), &info.stat_); + + const bool is_dir = info.IsDirectory(); + + // Recursive mode: schedule traversal of a directory if either + // SHOW_SYM_LINKS is on or we haven't visited the directory yet. + if (recursive_ && is_dir && + (!ShouldTrackVisitedDirectories(file_type_) || + visited_directories_.insert(info.stat_.st_ino).second)) { + pending_paths_.push(full_path); + } + + if (is_pattern_matched && IsTypeMatched(is_dir)) + directory_entries_.push_back(std::move(info)); + } + int readdir_errno = errno; + closedir(dir); + if (readdir_errno != 0 && error_policy_ != ErrorPolicy::IGNORE_ERRORS) { + error_ = File::OSErrorToFileError(readdir_errno); + return FilePath(); + } + + // MATCH_ONLY policy enumerates files in matched subfolders by "*" pattern. + // ALL policy enumerates files in all subfolders by origin pattern. + if (folder_search_policy_ == FolderSearchPolicy::MATCH_ONLY) + pattern_.clear(); + } + + return root_path_.Append( + directory_entries_[current_directory_entry_].filename_); +} + +FileEnumerator::FileInfo FileEnumerator::GetInfo() const { + DCHECK(!(file_type_ & FileType::NAMES_ONLY)); + return directory_entries_[current_directory_entry_]; +} + +bool FileEnumerator::IsPatternMatched(const FilePath& path) const { + return pattern_.empty() || + !fnmatch(pattern_.c_str(), path.value().c_str(), FNM_NOESCAPE); +} + +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_enumerator_win.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator_win.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_enumerator_win.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_enumerator_win.cc 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,228 @@ +// Copyright 2013 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file_enumerator.h" + +#include +#include + +#include "base/check_op.h" +#include "base/notreached.h" +#include "base/strings/string_util.h" +#include "base/threading/scoped_blocking_call.h" +#include "base/win/shlwapi.h" + +namespace base { + +namespace { + +FilePath BuildSearchFilter(FileEnumerator::FolderSearchPolicy policy, + const FilePath& root_path, + const FilePath::StringType& pattern) { + // MATCH_ONLY policy filters incoming files by pattern on OS side. ALL policy + // collects all files and filters them manually. + switch (policy) { + case FileEnumerator::FolderSearchPolicy::MATCH_ONLY: + return root_path.Append(pattern); + case FileEnumerator::FolderSearchPolicy::ALL: + return root_path.Append(FILE_PATH_LITERAL("*")); + } + NOTREACHED(); + return {}; +} + +} // namespace + +// FileEnumerator::FileInfo ---------------------------------------------------- + +FileEnumerator::FileInfo::FileInfo() { + memset(&find_data_, 0, sizeof(find_data_)); +} + +bool FileEnumerator::FileInfo::IsDirectory() const { + return (find_data().dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; +} + +FilePath FileEnumerator::FileInfo::GetName() const { + return FilePath(find_data().cFileName); +} + +int64_t FileEnumerator::FileInfo::GetSize() const { + ULARGE_INTEGER size; + size.HighPart = find_data().nFileSizeHigh; + size.LowPart = find_data().nFileSizeLow; + DCHECK_LE(size.QuadPart, + static_cast(std::numeric_limits::max())); + return static_cast(size.QuadPart); +} + +Time FileEnumerator::FileInfo::GetLastModifiedTime() const { + return Time::FromFileTime(find_data().ftLastWriteTime); +} + +// FileEnumerator -------------------------------------------------------------- + +FileEnumerator::FileEnumerator(const FilePath& root_path, + bool recursive, + int file_type) + : FileEnumerator(root_path, + recursive, + file_type, + FilePath::StringType(), + FolderSearchPolicy::MATCH_ONLY) {} + +FileEnumerator::FileEnumerator(const FilePath& root_path, + bool recursive, + int file_type, + const FilePath::StringType& pattern) + : FileEnumerator(root_path, + recursive, + file_type, + pattern, + FolderSearchPolicy::MATCH_ONLY) {} + +FileEnumerator::FileEnumerator(const FilePath& root_path, + bool recursive, + int file_type, + const FilePath::StringType& pattern, + FolderSearchPolicy folder_search_policy) + : FileEnumerator(root_path, + recursive, + file_type, + pattern, + folder_search_policy, + ErrorPolicy::IGNORE_ERRORS) {} + +FileEnumerator::FileEnumerator(const FilePath& root_path, + bool recursive, + int file_type, + const FilePath::StringType& pattern, + FolderSearchPolicy folder_search_policy, + ErrorPolicy error_policy) + : recursive_(recursive), + file_type_(file_type), + pattern_(!pattern.empty() ? pattern : FILE_PATH_LITERAL("*")), + folder_search_policy_(folder_search_policy), + error_policy_(error_policy) { + // INCLUDE_DOT_DOT must not be specified if recursive. + DCHECK(!(recursive && (INCLUDE_DOT_DOT & file_type_))); + + if (file_type_ & FileType::NAMES_ONLY) { + DCHECK(!recursive_); + DCHECK_EQ(file_type_ & ~(FileType::NAMES_ONLY | FileType::INCLUDE_DOT_DOT), + 0); + file_type_ |= (FileType::FILES | FileType::DIRECTORIES); + } + + memset(&find_data_, 0, sizeof(find_data_)); + pending_paths_.push(root_path); +} + +FileEnumerator::~FileEnumerator() { + if (find_handle_ != INVALID_HANDLE_VALUE) + FindClose(find_handle_); +} + +FileEnumerator::FileInfo FileEnumerator::GetInfo() const { + DCHECK(!(file_type_ & FileType::NAMES_ONLY)); + if (!has_find_data_) { + NOTREACHED(); + return FileInfo(); + } + FileInfo ret; + memcpy(&ret.find_data_, &find_data_, sizeof(find_data_)); + return ret; +} + +FilePath FileEnumerator::Next() { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + while (has_find_data_ || !pending_paths_.empty()) { + if (!has_find_data_) { + // The last find FindFirstFile operation is done, prepare a new one. + root_path_ = pending_paths_.top(); + pending_paths_.pop(); + + // Start a new find operation. + const FilePath src = + BuildSearchFilter(folder_search_policy_, root_path_, pattern_); + find_handle_ = FindFirstFileEx(src.value().c_str(), + FindExInfoBasic, // Omit short name. + ChromeToWindowsType(&find_data_), + FindExSearchNameMatch, nullptr, + FIND_FIRST_EX_LARGE_FETCH); + has_find_data_ = true; + } else { + // Search for the next file/directory. + if (!FindNextFile(find_handle_, ChromeToWindowsType(&find_data_))) { + FindClose(find_handle_); + find_handle_ = INVALID_HANDLE_VALUE; + } + } + + DWORD last_error = GetLastError(); + if (INVALID_HANDLE_VALUE == find_handle_) { + has_find_data_ = false; + + // MATCH_ONLY policy clears pattern for matched subfolders. ALL policy + // applies pattern for all subfolders. + if (folder_search_policy_ == FolderSearchPolicy::MATCH_ONLY) { + // This is reached when we have finished a directory and are advancing + // to the next one in the queue. We applied the pattern (if any) to the + // files in the root search directory, but for those directories which + // were matched, we want to enumerate all files inside them. This will + // happen when the handle is empty. + pattern_ = FILE_PATH_LITERAL("*"); + } + + if (last_error == ERROR_NO_MORE_FILES || + error_policy_ == ErrorPolicy::IGNORE_ERRORS) { + continue; + } + + error_ = File::OSErrorToFileError(last_error); + return FilePath(); + } + + const FilePath filename(find_data().cFileName); + if (ShouldSkip(filename)) + continue; + + const bool is_dir = + (find_data().dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; + const FilePath abs_path = root_path_.Append(filename); + + // Check if directory should be processed recursive. + if (is_dir && recursive_) { + // If |cur_file| is a directory, and we are doing recursive searching, + // add it to pending_paths_ so we scan it after we finish scanning this + // directory. However, don't do recursion through reparse points or we + // may end up with an infinite cycle. + DWORD attributes = GetFileAttributes(abs_path.value().c_str()); + if (!(attributes & FILE_ATTRIBUTE_REPARSE_POINT)) + pending_paths_.push(abs_path); + } + + if (IsTypeMatched(is_dir) && IsPatternMatched(filename)) + return abs_path; + } + return FilePath(); +} + +bool FileEnumerator::IsPatternMatched(const FilePath& src) const { + switch (folder_search_policy_) { + case FolderSearchPolicy::MATCH_ONLY: + // MATCH_ONLY policy filters by pattern on search request, so all found + // files already fits to pattern. + return true; + case FolderSearchPolicy::ALL: + // ALL policy enumerates all files, we need to check pattern match + // manually. + return PathMatchSpec(src.value().c_str(), pattern_.c_str()) == TRUE; + } + NOTREACHED(); + return false; +} + +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_path.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_path.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_path.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_path.cc 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,1420 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file_path.h" + +#include + +#include + +#include "base/check_op.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/files/safe_base_name.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/numerics/safe_conversions.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/pickle.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/ranges/algorithm.h" +#include "base/strings/strcat.h" +#include "base/strings/string_piece.h" +#include "base/strings/string_util.h" +#include "base/strings/sys_string_conversions.h" +#include "base/strings/utf_string_conversions.h" +#include "base/trace_event/base_tracing.h" + +#if BUILDFLAG(IS_APPLE) +#include "base/mac/scoped_cftyperef.h" +#include "base/third_party/icu/icu_utf.h" +#endif + +#if BUILDFLAG(IS_WIN) +#include +#include "base/win/win_util.h" +#elif BUILDFLAG(IS_APPLE) +#include +#endif + +namespace base { + +using StringType = FilePath::StringType; +using StringPieceType = FilePath::StringPieceType; + +namespace { + +const char* const kCommonDoubleExtensionSuffixes[] = { + "bz", "bz2", "gz", "lz", "lzma", "lzo", "xz", "z", "zst"}; +const char* const kCommonDoubleExtensions[] = {"user.js"}; + +const FilePath::CharType kStringTerminator = FILE_PATH_LITERAL('\0'); + +// If this FilePath contains a drive letter specification, returns the +// position of the last character of the drive letter specification, +// otherwise returns npos. This can only be true on Windows, when a pathname +// begins with a letter followed by a colon. On other platforms, this always +// returns npos. +StringPieceType::size_type FindDriveLetter(StringPieceType path) { +#if defined(FILE_PATH_USES_DRIVE_LETTERS) + // This is dependent on an ASCII-based character set, but that's a + // reasonable assumption. iswalpha can be too inclusive here. + if (path.length() >= 2 && path[1] == L':' && + ((path[0] >= L'A' && path[0] <= L'Z') || + (path[0] >= L'a' && path[0] <= L'z'))) { + return 1; + } +#endif // FILE_PATH_USES_DRIVE_LETTERS + return StringType::npos; +} + +#if defined(FILE_PATH_USES_DRIVE_LETTERS) +bool EqualDriveLetterCaseInsensitive(StringPieceType a, StringPieceType b) { + size_t a_letter_pos = FindDriveLetter(a); + size_t b_letter_pos = FindDriveLetter(b); + + if (a_letter_pos == StringType::npos || b_letter_pos == StringType::npos) + return a == b; + + StringPieceType a_letter(a.substr(0, a_letter_pos + 1)); + StringPieceType b_letter(b.substr(0, b_letter_pos + 1)); + if (!StartsWith(a_letter, b_letter, CompareCase::INSENSITIVE_ASCII)) + return false; + + StringPieceType a_rest(a.substr(a_letter_pos + 1)); + StringPieceType b_rest(b.substr(b_letter_pos + 1)); + return a_rest == b_rest; +} +#endif // defined(FILE_PATH_USES_DRIVE_LETTERS) + +bool IsPathAbsolute(StringPieceType path) { +#if defined(FILE_PATH_USES_DRIVE_LETTERS) + StringType::size_type letter = FindDriveLetter(path); + if (letter != StringType::npos) { + // Look for a separator right after the drive specification. + return path.length() > letter + 1 && + FilePath::IsSeparator(path[letter + 1]); + } + // Look for a pair of leading separators. + return path.length() > 1 && + FilePath::IsSeparator(path[0]) && FilePath::IsSeparator(path[1]); +#else // FILE_PATH_USES_DRIVE_LETTERS + // Look for a separator in the first position. + return path.length() > 0 && FilePath::IsSeparator(path[0]); +#endif // FILE_PATH_USES_DRIVE_LETTERS +} + +bool AreAllSeparators(const StringType& input) { + for (auto it : input) { + if (!FilePath::IsSeparator(it)) + return false; + } + + return true; +} + +// Find the position of the '.' that separates the extension from the rest +// of the file name. The position is relative to BaseName(), not value(). +// Returns npos if it can't find an extension. +StringType::size_type FinalExtensionSeparatorPosition(const StringType& path) { + // Special case "." and ".." + if (path == FilePath::kCurrentDirectory || path == FilePath::kParentDirectory) + return StringType::npos; + + return path.rfind(FilePath::kExtensionSeparator); +} + +// Same as above, but allow a second extension component of up to 4 +// characters when the rightmost extension component is a common double +// extension (gz, bz2, Z). For example, foo.tar.gz or foo.tar.Z would have +// extension components of '.tar.gz' and '.tar.Z' respectively. +StringType::size_type ExtensionSeparatorPosition(const StringType& path) { + const StringType::size_type last_dot = FinalExtensionSeparatorPosition(path); + + // No extension, or the extension is the whole filename. + if (last_dot == StringType::npos || last_dot == 0U) + return last_dot; + + const StringType::size_type penultimate_dot = + path.rfind(FilePath::kExtensionSeparator, last_dot - 1); + const StringType::size_type last_separator = + path.find_last_of(FilePath::kSeparators, last_dot - 1, + FilePath::kSeparatorsLength - 1); + + if (penultimate_dot == StringType::npos || + (last_separator != StringType::npos && + penultimate_dot < last_separator)) { + return last_dot; + } + + for (auto* i : kCommonDoubleExtensions) { + StringType extension(path, penultimate_dot + 1); + if (EqualsCaseInsensitiveASCII(extension, i)) + return penultimate_dot; + } + + StringType extension(path, last_dot + 1); + for (auto* i : kCommonDoubleExtensionSuffixes) { + if (EqualsCaseInsensitiveASCII(extension, i)) { + if ((last_dot - penultimate_dot) <= 5U && + (last_dot - penultimate_dot) > 1U) { + return penultimate_dot; + } + } + } + + return last_dot; +} + +// Returns true if path is "", ".", or "..". +bool IsEmptyOrSpecialCase(const StringType& path) { + // Special cases "", ".", and ".." + if (path.empty() || path == FilePath::kCurrentDirectory || + path == FilePath::kParentDirectory) { + return true; + } + + return false; +} + +} // namespace + +FilePath::FilePath() = default; + +FilePath::FilePath(const FilePath& that) = default; +FilePath::FilePath(FilePath&& that) noexcept = default; + +FilePath::FilePath(StringPieceType path) : path_(path) { + StringType::size_type nul_pos = path_.find(kStringTerminator); + if (nul_pos != StringType::npos) + path_.erase(nul_pos, StringType::npos); +} + +FilePath::~FilePath() = default; + +FilePath& FilePath::operator=(const FilePath& that) = default; + +#if !defined(MOZ_ZUCCHINI) +FilePath& FilePath::operator=(FilePath&& that) noexcept = default; +#else +FilePath& FilePath::operator=(FilePath&& that) = default; +#endif // !defined(MOZ_ZUCCHINI) + +bool FilePath::operator==(const FilePath& that) const { +#if defined(FILE_PATH_USES_DRIVE_LETTERS) + return EqualDriveLetterCaseInsensitive(this->path_, that.path_); +#else // defined(FILE_PATH_USES_DRIVE_LETTERS) + return path_ == that.path_; +#endif // defined(FILE_PATH_USES_DRIVE_LETTERS) +} + +bool FilePath::operator!=(const FilePath& that) const { +#if defined(FILE_PATH_USES_DRIVE_LETTERS) + return !EqualDriveLetterCaseInsensitive(this->path_, that.path_); +#else // defined(FILE_PATH_USES_DRIVE_LETTERS) + return path_ != that.path_; +#endif // defined(FILE_PATH_USES_DRIVE_LETTERS) +} + +std::ostream& operator<<(std::ostream& out, const FilePath& file_path) { + return out << file_path.value(); +} + +// static +bool FilePath::IsSeparator(CharType character) { + for (size_t i = 0; i < kSeparatorsLength - 1; ++i) { + if (character == kSeparators[i]) { + return true; + } + } + + return false; +} + +std::vector FilePath::GetComponents() const { + std::vector ret_val; + if (value().empty()) + return ret_val; + + FilePath current = *this; + FilePath base; + + // Capture path components. + while (current != current.DirName()) { + base = current.BaseName(); + if (!AreAllSeparators(base.value())) + ret_val.push_back(base.value()); + current = current.DirName(); + } + + // Capture root, if any. + base = current.BaseName(); + if (!base.value().empty() && base.value() != kCurrentDirectory) + ret_val.push_back(current.BaseName().value()); + + // Capture drive letter, if any. + FilePath dir = current.DirName(); + StringType::size_type letter = FindDriveLetter(dir.value()); + if (letter != StringType::npos) + ret_val.emplace_back(dir.value(), 0, letter + 1); + + ranges::reverse(ret_val); + return ret_val; +} + +bool FilePath::IsParent(const FilePath& child) const { + return AppendRelativePath(child, nullptr); +} + +bool FilePath::AppendRelativePath(const FilePath& child, + FilePath* path) const { + std::vector parent_components = GetComponents(); + std::vector child_components = child.GetComponents(); + + if (parent_components.empty() || + parent_components.size() >= child_components.size()) + return false; + + std::vector::const_iterator parent_comp = + parent_components.begin(); + std::vector::const_iterator child_comp = + child_components.begin(); + +#if defined(FILE_PATH_USES_DRIVE_LETTERS) + // Windows can access case sensitive filesystems, so component + // comparisions must be case sensitive, but drive letters are + // never case sensitive. + if ((FindDriveLetter(*parent_comp) != StringType::npos) && + (FindDriveLetter(*child_comp) != StringType::npos)) { + if (!StartsWith(*parent_comp, *child_comp, CompareCase::INSENSITIVE_ASCII)) + return false; + ++parent_comp; + ++child_comp; + } +#endif // defined(FILE_PATH_USES_DRIVE_LETTERS) + + // The first 2 components for network paths are [<2-Separators>, ]. + // Use case-insensitive comparison for the hostname. + // https://tools.ietf.org/html/rfc3986#section-3.2.2 + if (IsNetwork() && parent_components.size() > 1) { + if (*parent_comp++ != *child_comp++ || + !base::EqualsCaseInsensitiveASCII(*parent_comp++, *child_comp++)) { + return false; + } + } + + while (parent_comp != parent_components.end()) { + if (*parent_comp != *child_comp) + return false; + ++parent_comp; + ++child_comp; + } + + if (path != nullptr) { + for (; child_comp != child_components.end(); ++child_comp) { + *path = path->Append(*child_comp); + } + } + return true; +} + +// libgen's dirname and basename aren't guaranteed to be thread-safe and aren't +// guaranteed to not modify their input strings, and in fact are implemented +// differently in this regard on different platforms. Don't use them, but +// adhere to their behavior. +FilePath FilePath::DirName() const { + FilePath new_path(path_); + new_path.StripTrailingSeparatorsInternal(); + + // The drive letter, if any, always needs to remain in the output. If there + // is no drive letter, as will always be the case on platforms which do not + // support drive letters, letter will be npos, or -1, so the comparisons and + // resizes below using letter will still be valid. + StringType::size_type letter = FindDriveLetter(new_path.path_); + + StringType::size_type last_separator = + new_path.path_.find_last_of(kSeparators, StringType::npos, + kSeparatorsLength - 1); + if (last_separator == StringType::npos) { + // path_ is in the current directory. + new_path.path_.resize(letter + 1); + } else if (last_separator == letter + 1) { + // path_ is in the root directory. + new_path.path_.resize(letter + 2); + } else if (last_separator == letter + 2 && + IsSeparator(new_path.path_[letter + 1])) { + // path_ is in "//" (possibly with a drive letter); leave the double + // separator intact indicating alternate root. + new_path.path_.resize(letter + 3); + } else if (last_separator != 0) { + bool trim_to_basename = true; +#if BUILDFLAG(IS_POSIX) + // On Posix, more than two leading separators are always collapsed to one. + // See + // https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13 + // So, do not strip any of the separators, let + // StripTrailingSeparatorsInternal() take care of the extra. + if (AreAllSeparators(new_path.path_.substr(0, last_separator + 1))) { + new_path.path_.resize(last_separator + 1); + trim_to_basename = false; + } +#endif // BUILDFLAG(IS_POSIX) + if (trim_to_basename) { + // path_ is somewhere else, trim the basename. + new_path.path_.resize(last_separator); + } + } + + new_path.StripTrailingSeparatorsInternal(); + if (!new_path.path_.length()) + new_path.path_ = kCurrentDirectory; + + return new_path; +} + +FilePath FilePath::BaseName() const { + FilePath new_path(path_); + new_path.StripTrailingSeparatorsInternal(); + + // The drive letter, if any, is always stripped. + StringType::size_type letter = FindDriveLetter(new_path.path_); + if (letter != StringType::npos) { + new_path.path_.erase(0, letter + 1); + } + + // Keep everything after the final separator, but if the pathname is only + // one character and it's a separator, leave it alone. + StringType::size_type last_separator = + new_path.path_.find_last_of(kSeparators, StringType::npos, + kSeparatorsLength - 1); + if (last_separator != StringType::npos && + last_separator < new_path.path_.length() - 1) { + new_path.path_.erase(0, last_separator + 1); + } + + return new_path; +} + +StringType FilePath::Extension() const { + FilePath base(BaseName()); + const StringType::size_type dot = ExtensionSeparatorPosition(base.path_); + if (dot == StringType::npos) + return StringType(); + + return base.path_.substr(dot, StringType::npos); +} + +StringType FilePath::FinalExtension() const { + FilePath base(BaseName()); + const StringType::size_type dot = FinalExtensionSeparatorPosition(base.path_); + if (dot == StringType::npos) + return StringType(); + + return base.path_.substr(dot, StringType::npos); +} + +FilePath FilePath::RemoveExtension() const { + if (Extension().empty()) + return *this; + + const StringType::size_type dot = ExtensionSeparatorPosition(path_); + if (dot == StringType::npos) + return *this; + + return FilePath(path_.substr(0, dot)); +} + +FilePath FilePath::RemoveFinalExtension() const { + if (FinalExtension().empty()) + return *this; + + const StringType::size_type dot = FinalExtensionSeparatorPosition(path_); + if (dot == StringType::npos) + return *this; + + return FilePath(path_.substr(0, dot)); +} + +FilePath FilePath::InsertBeforeExtension(StringPieceType suffix) const { + if (suffix.empty()) + return FilePath(path_); + + if (IsEmptyOrSpecialCase(BaseName().value())) + return FilePath(); + + return FilePath( + base::StrCat({RemoveExtension().value(), suffix, Extension()})); +} + +FilePath FilePath::InsertBeforeExtensionASCII(StringPiece suffix) + const { + DCHECK(IsStringASCII(suffix)); +#if BUILDFLAG(IS_WIN) + return InsertBeforeExtension(UTF8ToWide(suffix)); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + return InsertBeforeExtension(suffix); +#endif +} + +FilePath FilePath::AddExtension(StringPieceType extension) const { + if (IsEmptyOrSpecialCase(BaseName().value())) + return FilePath(); + + // If the new extension is "" or ".", then just return the current FilePath. + if (extension.empty() || + (extension.size() == 1 && extension[0] == kExtensionSeparator)) + return *this; + + StringType str = path_; + if (extension[0] != kExtensionSeparator && + *(str.end() - 1) != kExtensionSeparator) { + str.append(1, kExtensionSeparator); + } + str.append(extension); + return FilePath(str); +} + +FilePath FilePath::AddExtensionASCII(StringPiece extension) const { + DCHECK(IsStringASCII(extension)); +#if BUILDFLAG(IS_WIN) + return AddExtension(UTF8ToWide(extension)); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + return AddExtension(extension); +#endif +} + +FilePath FilePath::ReplaceExtension(StringPieceType extension) const { + if (IsEmptyOrSpecialCase(BaseName().value())) + return FilePath(); + + FilePath no_ext = RemoveExtension(); + // If the new extension is "" or ".", then just remove the current extension. + if (extension.empty() || + (extension.size() == 1 && extension[0] == kExtensionSeparator)) + return no_ext; + + StringType str = no_ext.value(); + if (extension[0] != kExtensionSeparator) + str.append(1, kExtensionSeparator); + str.append(extension); + return FilePath(str); +} + +bool FilePath::MatchesExtension(StringPieceType extension) const { + DCHECK(extension.empty() || extension[0] == kExtensionSeparator); + + StringType current_extension = Extension(); + + if (current_extension.length() != extension.length()) + return false; + + return FilePath::CompareEqualIgnoreCase(extension, current_extension); +} + +bool FilePath::MatchesFinalExtension(StringPieceType extension) const { + DCHECK(extension.empty() || extension[0] == kExtensionSeparator); + + StringType current_final_extension = FinalExtension(); + + if (current_final_extension.length() != extension.length()) + return false; + + return FilePath::CompareEqualIgnoreCase(extension, current_final_extension); +} + +FilePath FilePath::Append(StringPieceType component) const { + StringPieceType appended = component; + StringType without_nuls; + + StringType::size_type nul_pos = component.find(kStringTerminator); + if (nul_pos != StringPieceType::npos) { + without_nuls = StringType(component.substr(0, nul_pos)); + appended = StringPieceType(without_nuls); + } + + DCHECK(!IsPathAbsolute(appended)); + + if (path_.compare(kCurrentDirectory) == 0 && !appended.empty()) { + // Append normally doesn't do any normalization, but as a special case, + // when appending to kCurrentDirectory, just return a new path for the + // component argument. Appending component to kCurrentDirectory would + // serve no purpose other than needlessly lengthening the path, and + // it's likely in practice to wind up with FilePath objects containing + // only kCurrentDirectory when calling DirName on a single relative path + // component. + return FilePath(appended); + } + + FilePath new_path(path_); + new_path.StripTrailingSeparatorsInternal(); + + // Don't append a separator if the path is empty (indicating the current + // directory) or if the path component is empty (indicating nothing to + // append). + if (!appended.empty() && !new_path.path_.empty()) { + // Don't append a separator if the path still ends with a trailing + // separator after stripping (indicating the root directory). + if (!IsSeparator(new_path.path_.back())) { + // Don't append a separator if the path is just a drive letter. + if (FindDriveLetter(new_path.path_) + 1 != new_path.path_.length()) { + new_path.path_.append(1, kSeparators[0]); + } + } + } + + new_path.path_.append(appended); + return new_path; +} + +FilePath FilePath::Append(const FilePath& component) const { + return Append(component.value()); +} + +#if !defined(MOZ_ZUCCHINI) +FilePath FilePath::Append(const SafeBaseName& component) const { + return Append(component.path().value()); +} +#endif // !defined(MOZ_ZUCCHINI) + +FilePath FilePath::AppendASCII(StringPiece component) const { + DCHECK(base::IsStringASCII(component)); +#if BUILDFLAG(IS_WIN) + return Append(UTF8ToWide(component)); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + return Append(component); +#endif +} + +bool FilePath::IsAbsolute() const { + return IsPathAbsolute(path_); +} + +bool FilePath::IsNetwork() const { + return path_.length() > 1 && FilePath::IsSeparator(path_[0]) && + FilePath::IsSeparator(path_[1]); +} + +bool FilePath::EndsWithSeparator() const { + if (empty()) + return false; + return IsSeparator(path_.back()); +} + +FilePath FilePath::AsEndingWithSeparator() const { + if (EndsWithSeparator() || path_.empty()) + return *this; + + StringType path_str; + path_str.reserve(path_.length() + 1); // Only allocate string once. + + path_str = path_; + path_str.append(&kSeparators[0], 1); + return FilePath(path_str); +} + +FilePath FilePath::StripTrailingSeparators() const { + FilePath new_path(path_); + new_path.StripTrailingSeparatorsInternal(); + + return new_path; +} + +bool FilePath::ReferencesParent() const { + if (path_.find(kParentDirectory) == StringType::npos) { + // GetComponents is quite expensive, so avoid calling it in the majority + // of cases where there isn't a kParentDirectory anywhere in the path. + return false; + } + + std::vector components = GetComponents(); + std::vector::const_iterator it = components.begin(); + for (; it != components.end(); ++it) { + const StringType& component = *it; + // Windows has odd, undocumented behavior with path components containing + // only whitespace and . characters. So, if all we see is . and + // whitespace, then we treat any .. sequence as referencing parent. + // For simplicity we enforce this on all platforms. + if (component.find_first_not_of(FILE_PATH_LITERAL(". \n\r\t")) == + std::string::npos && + component.find(kParentDirectory) != std::string::npos) { + return true; + } + } + return false; +} + +#if BUILDFLAG(IS_WIN) + +std::u16string FilePath::LossyDisplayName() const { + return AsString16(path_); +} + +std::string FilePath::MaybeAsASCII() const { + return base::IsStringASCII(path_) ? WideToASCII(path_) : std::string(); +} + +std::string FilePath::AsUTF8Unsafe() const { + return WideToUTF8(value()); +} + +std::u16string FilePath::AsUTF16Unsafe() const { + return WideToUTF16(value()); +} + +// static +FilePath FilePath::FromASCII(StringPiece ascii) { + DCHECK(base::IsStringASCII(ascii)); + return FilePath(ASCIIToWide(ascii)); +} + +// static +FilePath FilePath::FromUTF8Unsafe(StringPiece utf8) { + return FilePath(UTF8ToWide(utf8)); +} + +// static +FilePath FilePath::FromUTF16Unsafe(StringPiece16 utf16) { + return FilePath(AsWStringPiece(utf16)); +} + +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + +// See file_path.h for a discussion of the encoding of paths on POSIX +// platforms. These encoding conversion functions are not quite correct. + +std::u16string FilePath::LossyDisplayName() const { + return WideToUTF16(SysNativeMBToWide(path_)); +} + +std::string FilePath::MaybeAsASCII() const { + if (base::IsStringASCII(path_)) + return path_; + return std::string(); +} + +std::string FilePath::AsUTF8Unsafe() const { +#if defined(SYSTEM_NATIVE_UTF8) + return value(); +#else + return WideToUTF8(SysNativeMBToWide(value())); +#endif +} + +std::u16string FilePath::AsUTF16Unsafe() const { +#if defined(SYSTEM_NATIVE_UTF8) + return UTF8ToUTF16(value()); +#else + return WideToUTF16(SysNativeMBToWide(value())); +#endif +} + +// static +FilePath FilePath::FromASCII(StringPiece ascii) { + DCHECK(base::IsStringASCII(ascii)); + return FilePath(ascii); +} + +// static +FilePath FilePath::FromUTF8Unsafe(StringPiece utf8) { +#if defined(SYSTEM_NATIVE_UTF8) + return FilePath(utf8); +#else + return FilePath(SysWideToNativeMB(UTF8ToWide(utf8))); +#endif +} + +// static +FilePath FilePath::FromUTF16Unsafe(StringPiece16 utf16) { +#if defined(SYSTEM_NATIVE_UTF8) + return FilePath(UTF16ToUTF8(utf16)); +#else + return FilePath(SysWideToNativeMB(UTF16ToWide(utf16))); +#endif +} + +#endif // BUILDFLAG(IS_WIN) + +#if !defined(MOZ_ZUCCHINI) +void FilePath::WriteToPickle(Pickle* pickle) const { +#if BUILDFLAG(IS_WIN) + pickle->WriteString16(AsStringPiece16(path_)); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + pickle->WriteString(path_); +#else +#error Unsupported platform +#endif +} + +bool FilePath::ReadFromPickle(PickleIterator* iter) { +#if BUILDFLAG(IS_WIN) + std::u16string path; + if (!iter->ReadString16(&path)) + return false; + path_ = UTF16ToWide(path); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + if (!iter->ReadString(&path_)) + return false; +#else +#error Unsupported platform +#endif + + if (path_.find(kStringTerminator) != StringType::npos) + return false; + + return true; +} +#endif // !defined(MOZ_ZUCCHINI) + +#if BUILDFLAG(IS_WIN) +// Windows specific implementation of file string comparisons. + +int FilePath::CompareIgnoreCase(StringPieceType string1, + StringPieceType string2) { + // CharUpperW within user32 is used here because it will provide unicode + // conversions regardless of locale. The STL alternative, towupper, has a + // locale consideration that prevents it from converting all characters by + // default. + CHECK(win::IsUser32AndGdi32Available()); + // Perform character-wise upper case comparison rather than using the + // fully Unicode-aware CompareString(). For details see: + // http://blogs.msdn.com/michkap/archive/2005/10/17/481600.aspx + StringPieceType::const_iterator i1 = string1.begin(); + StringPieceType::const_iterator i2 = string2.begin(); + StringPieceType::const_iterator string1end = string1.end(); + StringPieceType::const_iterator string2end = string2.end(); + for ( ; i1 != string1end && i2 != string2end; ++i1, ++i2) { + wchar_t c1 = + (wchar_t)LOWORD(::CharUpperW((LPWSTR)(DWORD_PTR)MAKELONG(*i1, 0))); + wchar_t c2 = + (wchar_t)LOWORD(::CharUpperW((LPWSTR)(DWORD_PTR)MAKELONG(*i2, 0))); + if (c1 < c2) + return -1; + if (c1 > c2) + return 1; + } + if (i1 != string1end) + return 1; + if (i2 != string2end) + return -1; + return 0; +} + +#elif BUILDFLAG(IS_APPLE) +// Mac OS X specific implementation of file string comparisons. + +// cf. https://developer.apple.com/library/archive/technotes/tn/tn1150.html#UnicodeSubtleties +// +// "When using CreateTextEncoding to create a text encoding, you should set +// the TextEncodingBase to kTextEncodingUnicodeV2_0, set the +// TextEncodingVariant to kUnicodeCanonicalDecompVariant, and set the +// TextEncodingFormat to kUnicode16BitFormat. Using these values ensures that +// the Unicode will be in the same form as on an HFS Plus volume, even as the +// Unicode standard evolves." +// +// Another technical article for X 10.4 updates this: one should use +// the new (unambiguous) kUnicodeHFSPlusDecompVariant. +// cf. http://developer.apple.com/mac/library/releasenotes/TextFonts/RN-TEC/index.html +// +// This implementation uses CFStringGetFileSystemRepresentation() to get the +// decomposed form, and an adapted version of the FastUnicodeCompare as +// described in the tech note to compare the strings. + +// Character conversion table for FastUnicodeCompare() +// +// The lower case table consists of a 256-entry high-byte table followed by +// some number of 256-entry subtables. The high-byte table contains either an +// offset to the subtable for characters with that high byte or zero, which +// means that there are no case mappings or ignored characters in that block. +// Ignored characters are mapped to zero. +// +// cf. downloadable file linked in +// https://developer.apple.com/library/archive/technotes/tn/tn1150.html#Downloads + +namespace { + +// clang-format off +const UInt16 lower_case_table[11 * 256] = { + // High-byte indices ( == 0 iff no case mapping and no ignorables ) + + /* 0 */ 0x0100, 0x0200, 0x0000, 0x0300, 0x0400, 0x0500, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 1 */ 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 2 */ 0x0700, 0x0800, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 3 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 4 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 5 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 6 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 7 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 8 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 9 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* A */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* B */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* C */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* D */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* E */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* F */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0900, 0x0A00, + + // Table 1 (for high byte 0x00) + + /* 0 */ 0xFFFF, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, + 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + /* 1 */ 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, + 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + /* 2 */ 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, + 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + /* 3 */ 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, + 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + /* 4 */ 0x0040, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + /* 5 */ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + /* 6 */ 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, + 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + /* 7 */ 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, + 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + /* 8 */ 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, + 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + /* 9 */ 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, + 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + /* A */ 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + /* B */ 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + /* C */ 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00E6, 0x00C7, + 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + /* D */ 0x00F0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, + 0x00F8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00FE, 0x00DF, + /* E */ 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, + 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + /* F */ 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, + 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF, + + // Table 2 (for high byte 0x01) + + /* 0 */ 0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, + 0x0108, 0x0109, 0x010A, 0x010B, 0x010C, 0x010D, 0x010E, 0x010F, + /* 1 */ 0x0111, 0x0111, 0x0112, 0x0113, 0x0114, 0x0115, 0x0116, 0x0117, + 0x0118, 0x0119, 0x011A, 0x011B, 0x011C, 0x011D, 0x011E, 0x011F, + /* 2 */ 0x0120, 0x0121, 0x0122, 0x0123, 0x0124, 0x0125, 0x0127, 0x0127, + 0x0128, 0x0129, 0x012A, 0x012B, 0x012C, 0x012D, 0x012E, 0x012F, + /* 3 */ 0x0130, 0x0131, 0x0133, 0x0133, 0x0134, 0x0135, 0x0136, 0x0137, + 0x0138, 0x0139, 0x013A, 0x013B, 0x013C, 0x013D, 0x013E, 0x0140, + /* 4 */ 0x0140, 0x0142, 0x0142, 0x0143, 0x0144, 0x0145, 0x0146, 0x0147, + 0x0148, 0x0149, 0x014B, 0x014B, 0x014C, 0x014D, 0x014E, 0x014F, + /* 5 */ 0x0150, 0x0151, 0x0153, 0x0153, 0x0154, 0x0155, 0x0156, 0x0157, + 0x0158, 0x0159, 0x015A, 0x015B, 0x015C, 0x015D, 0x015E, 0x015F, + /* 6 */ 0x0160, 0x0161, 0x0162, 0x0163, 0x0164, 0x0165, 0x0167, 0x0167, + 0x0168, 0x0169, 0x016A, 0x016B, 0x016C, 0x016D, 0x016E, 0x016F, + /* 7 */ 0x0170, 0x0171, 0x0172, 0x0173, 0x0174, 0x0175, 0x0176, 0x0177, + 0x0178, 0x0179, 0x017A, 0x017B, 0x017C, 0x017D, 0x017E, 0x017F, + /* 8 */ 0x0180, 0x0253, 0x0183, 0x0183, 0x0185, 0x0185, 0x0254, 0x0188, + 0x0188, 0x0256, 0x0257, 0x018C, 0x018C, 0x018D, 0x01DD, 0x0259, + /* 9 */ 0x025B, 0x0192, 0x0192, 0x0260, 0x0263, 0x0195, 0x0269, 0x0268, + 0x0199, 0x0199, 0x019A, 0x019B, 0x026F, 0x0272, 0x019E, 0x0275, + /* A */ 0x01A0, 0x01A1, 0x01A3, 0x01A3, 0x01A5, 0x01A5, 0x01A6, 0x01A8, + 0x01A8, 0x0283, 0x01AA, 0x01AB, 0x01AD, 0x01AD, 0x0288, 0x01AF, + /* B */ 0x01B0, 0x028A, 0x028B, 0x01B4, 0x01B4, 0x01B6, 0x01B6, 0x0292, + 0x01B9, 0x01B9, 0x01BA, 0x01BB, 0x01BD, 0x01BD, 0x01BE, 0x01BF, + /* C */ 0x01C0, 0x01C1, 0x01C2, 0x01C3, 0x01C6, 0x01C6, 0x01C6, 0x01C9, + 0x01C9, 0x01C9, 0x01CC, 0x01CC, 0x01CC, 0x01CD, 0x01CE, 0x01CF, + /* D */ 0x01D0, 0x01D1, 0x01D2, 0x01D3, 0x01D4, 0x01D5, 0x01D6, 0x01D7, + 0x01D8, 0x01D9, 0x01DA, 0x01DB, 0x01DC, 0x01DD, 0x01DE, 0x01DF, + /* E */ 0x01E0, 0x01E1, 0x01E2, 0x01E3, 0x01E5, 0x01E5, 0x01E6, 0x01E7, + 0x01E8, 0x01E9, 0x01EA, 0x01EB, 0x01EC, 0x01ED, 0x01EE, 0x01EF, + /* F */ 0x01F0, 0x01F3, 0x01F3, 0x01F3, 0x01F4, 0x01F5, 0x01F6, 0x01F7, + 0x01F8, 0x01F9, 0x01FA, 0x01FB, 0x01FC, 0x01FD, 0x01FE, 0x01FF, + + // Table 3 (for high byte 0x03) + + /* 0 */ 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, + 0x0308, 0x0309, 0x030A, 0x030B, 0x030C, 0x030D, 0x030E, 0x030F, + /* 1 */ 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, + 0x0318, 0x0319, 0x031A, 0x031B, 0x031C, 0x031D, 0x031E, 0x031F, + /* 2 */ 0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 0x0327, + 0x0328, 0x0329, 0x032A, 0x032B, 0x032C, 0x032D, 0x032E, 0x032F, + /* 3 */ 0x0330, 0x0331, 0x0332, 0x0333, 0x0334, 0x0335, 0x0336, 0x0337, + 0x0338, 0x0339, 0x033A, 0x033B, 0x033C, 0x033D, 0x033E, 0x033F, + /* 4 */ 0x0340, 0x0341, 0x0342, 0x0343, 0x0344, 0x0345, 0x0346, 0x0347, + 0x0348, 0x0349, 0x034A, 0x034B, 0x034C, 0x034D, 0x034E, 0x034F, + /* 5 */ 0x0350, 0x0351, 0x0352, 0x0353, 0x0354, 0x0355, 0x0356, 0x0357, + 0x0358, 0x0359, 0x035A, 0x035B, 0x035C, 0x035D, 0x035E, 0x035F, + /* 6 */ 0x0360, 0x0361, 0x0362, 0x0363, 0x0364, 0x0365, 0x0366, 0x0367, + 0x0368, 0x0369, 0x036A, 0x036B, 0x036C, 0x036D, 0x036E, 0x036F, + /* 7 */ 0x0370, 0x0371, 0x0372, 0x0373, 0x0374, 0x0375, 0x0376, 0x0377, + 0x0378, 0x0379, 0x037A, 0x037B, 0x037C, 0x037D, 0x037E, 0x037F, + /* 8 */ 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0386, 0x0387, + 0x0388, 0x0389, 0x038A, 0x038B, 0x038C, 0x038D, 0x038E, 0x038F, + /* 9 */ 0x0390, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, + 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, + /* A */ 0x03C0, 0x03C1, 0x03A2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, + 0x03C8, 0x03C9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, + /* B */ 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, + 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, + /* C */ 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, + 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x03CF, + /* D */ 0x03D0, 0x03D1, 0x03D2, 0x03D3, 0x03D4, 0x03D5, 0x03D6, 0x03D7, + 0x03D8, 0x03D9, 0x03DA, 0x03DB, 0x03DC, 0x03DD, 0x03DE, 0x03DF, + /* E */ 0x03E0, 0x03E1, 0x03E3, 0x03E3, 0x03E5, 0x03E5, 0x03E7, 0x03E7, + 0x03E9, 0x03E9, 0x03EB, 0x03EB, 0x03ED, 0x03ED, 0x03EF, 0x03EF, + /* F */ 0x03F0, 0x03F1, 0x03F2, 0x03F3, 0x03F4, 0x03F5, 0x03F6, 0x03F7, + 0x03F8, 0x03F9, 0x03FA, 0x03FB, 0x03FC, 0x03FD, 0x03FE, 0x03FF, + + // Table 4 (for high byte 0x04) + + /* 0 */ 0x0400, 0x0401, 0x0452, 0x0403, 0x0454, 0x0455, 0x0456, 0x0407, + 0x0458, 0x0459, 0x045A, 0x045B, 0x040C, 0x040D, 0x040E, 0x045F, + /* 1 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0419, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + /* 2 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + /* 3 */ 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, + 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + /* 4 */ 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, + 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + /* 5 */ 0x0450, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, + 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x045D, 0x045E, 0x045F, + /* 6 */ 0x0461, 0x0461, 0x0463, 0x0463, 0x0465, 0x0465, 0x0467, 0x0467, + 0x0469, 0x0469, 0x046B, 0x046B, 0x046D, 0x046D, 0x046F, 0x046F, + /* 7 */ 0x0471, 0x0471, 0x0473, 0x0473, 0x0475, 0x0475, 0x0476, 0x0477, + 0x0479, 0x0479, 0x047B, 0x047B, 0x047D, 0x047D, 0x047F, 0x047F, + /* 8 */ 0x0481, 0x0481, 0x0482, 0x0483, 0x0484, 0x0485, 0x0486, 0x0487, + 0x0488, 0x0489, 0x048A, 0x048B, 0x048C, 0x048D, 0x048E, 0x048F, + /* 9 */ 0x0491, 0x0491, 0x0493, 0x0493, 0x0495, 0x0495, 0x0497, 0x0497, + 0x0499, 0x0499, 0x049B, 0x049B, 0x049D, 0x049D, 0x049F, 0x049F, + /* A */ 0x04A1, 0x04A1, 0x04A3, 0x04A3, 0x04A5, 0x04A5, 0x04A7, 0x04A7, + 0x04A9, 0x04A9, 0x04AB, 0x04AB, 0x04AD, 0x04AD, 0x04AF, 0x04AF, + /* B */ 0x04B1, 0x04B1, 0x04B3, 0x04B3, 0x04B5, 0x04B5, 0x04B7, 0x04B7, + 0x04B9, 0x04B9, 0x04BB, 0x04BB, 0x04BD, 0x04BD, 0x04BF, 0x04BF, + /* C */ 0x04C0, 0x04C1, 0x04C2, 0x04C4, 0x04C4, 0x04C5, 0x04C6, 0x04C8, + 0x04C8, 0x04C9, 0x04CA, 0x04CC, 0x04CC, 0x04CD, 0x04CE, 0x04CF, + /* D */ 0x04D0, 0x04D1, 0x04D2, 0x04D3, 0x04D4, 0x04D5, 0x04D6, 0x04D7, + 0x04D8, 0x04D9, 0x04DA, 0x04DB, 0x04DC, 0x04DD, 0x04DE, 0x04DF, + /* E */ 0x04E0, 0x04E1, 0x04E2, 0x04E3, 0x04E4, 0x04E5, 0x04E6, 0x04E7, + 0x04E8, 0x04E9, 0x04EA, 0x04EB, 0x04EC, 0x04ED, 0x04EE, 0x04EF, + /* F */ 0x04F0, 0x04F1, 0x04F2, 0x04F3, 0x04F4, 0x04F5, 0x04F6, 0x04F7, + 0x04F8, 0x04F9, 0x04FA, 0x04FB, 0x04FC, 0x04FD, 0x04FE, 0x04FF, + + // Table 5 (for high byte 0x05) + + /* 0 */ 0x0500, 0x0501, 0x0502, 0x0503, 0x0504, 0x0505, 0x0506, 0x0507, + 0x0508, 0x0509, 0x050A, 0x050B, 0x050C, 0x050D, 0x050E, 0x050F, + /* 1 */ 0x0510, 0x0511, 0x0512, 0x0513, 0x0514, 0x0515, 0x0516, 0x0517, + 0x0518, 0x0519, 0x051A, 0x051B, 0x051C, 0x051D, 0x051E, 0x051F, + /* 2 */ 0x0520, 0x0521, 0x0522, 0x0523, 0x0524, 0x0525, 0x0526, 0x0527, + 0x0528, 0x0529, 0x052A, 0x052B, 0x052C, 0x052D, 0x052E, 0x052F, + /* 3 */ 0x0530, 0x0561, 0x0562, 0x0563, 0x0564, 0x0565, 0x0566, 0x0567, + 0x0568, 0x0569, 0x056A, 0x056B, 0x056C, 0x056D, 0x056E, 0x056F, + /* 4 */ 0x0570, 0x0571, 0x0572, 0x0573, 0x0574, 0x0575, 0x0576, 0x0577, + 0x0578, 0x0579, 0x057A, 0x057B, 0x057C, 0x057D, 0x057E, 0x057F, + /* 5 */ 0x0580, 0x0581, 0x0582, 0x0583, 0x0584, 0x0585, 0x0586, 0x0557, + 0x0558, 0x0559, 0x055A, 0x055B, 0x055C, 0x055D, 0x055E, 0x055F, + /* 6 */ 0x0560, 0x0561, 0x0562, 0x0563, 0x0564, 0x0565, 0x0566, 0x0567, + 0x0568, 0x0569, 0x056A, 0x056B, 0x056C, 0x056D, 0x056E, 0x056F, + /* 7 */ 0x0570, 0x0571, 0x0572, 0x0573, 0x0574, 0x0575, 0x0576, 0x0577, + 0x0578, 0x0579, 0x057A, 0x057B, 0x057C, 0x057D, 0x057E, 0x057F, + /* 8 */ 0x0580, 0x0581, 0x0582, 0x0583, 0x0584, 0x0585, 0x0586, 0x0587, + 0x0588, 0x0589, 0x058A, 0x058B, 0x058C, 0x058D, 0x058E, 0x058F, + /* 9 */ 0x0590, 0x0591, 0x0592, 0x0593, 0x0594, 0x0595, 0x0596, 0x0597, + 0x0598, 0x0599, 0x059A, 0x059B, 0x059C, 0x059D, 0x059E, 0x059F, + /* A */ 0x05A0, 0x05A1, 0x05A2, 0x05A3, 0x05A4, 0x05A5, 0x05A6, 0x05A7, + 0x05A8, 0x05A9, 0x05AA, 0x05AB, 0x05AC, 0x05AD, 0x05AE, 0x05AF, + /* B */ 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, + 0x05B8, 0x05B9, 0x05BA, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF, + /* C */ 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05C4, 0x05C5, 0x05C6, 0x05C7, + 0x05C8, 0x05C9, 0x05CA, 0x05CB, 0x05CC, 0x05CD, 0x05CE, 0x05CF, + /* D */ 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, + 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + /* E */ 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, + 0x05E8, 0x05E9, 0x05EA, 0x05EB, 0x05EC, 0x05ED, 0x05EE, 0x05EF, + /* F */ 0x05F0, 0x05F1, 0x05F2, 0x05F3, 0x05F4, 0x05F5, 0x05F6, 0x05F7, + 0x05F8, 0x05F9, 0x05FA, 0x05FB, 0x05FC, 0x05FD, 0x05FE, 0x05FF, + + // Table 6 (for high byte 0x10) + + /* 0 */ 0x1000, 0x1001, 0x1002, 0x1003, 0x1004, 0x1005, 0x1006, 0x1007, + 0x1008, 0x1009, 0x100A, 0x100B, 0x100C, 0x100D, 0x100E, 0x100F, + /* 1 */ 0x1010, 0x1011, 0x1012, 0x1013, 0x1014, 0x1015, 0x1016, 0x1017, + 0x1018, 0x1019, 0x101A, 0x101B, 0x101C, 0x101D, 0x101E, 0x101F, + /* 2 */ 0x1020, 0x1021, 0x1022, 0x1023, 0x1024, 0x1025, 0x1026, 0x1027, + 0x1028, 0x1029, 0x102A, 0x102B, 0x102C, 0x102D, 0x102E, 0x102F, + /* 3 */ 0x1030, 0x1031, 0x1032, 0x1033, 0x1034, 0x1035, 0x1036, 0x1037, + 0x1038, 0x1039, 0x103A, 0x103B, 0x103C, 0x103D, 0x103E, 0x103F, + /* 4 */ 0x1040, 0x1041, 0x1042, 0x1043, 0x1044, 0x1045, 0x1046, 0x1047, + 0x1048, 0x1049, 0x104A, 0x104B, 0x104C, 0x104D, 0x104E, 0x104F, + /* 5 */ 0x1050, 0x1051, 0x1052, 0x1053, 0x1054, 0x1055, 0x1056, 0x1057, + 0x1058, 0x1059, 0x105A, 0x105B, 0x105C, 0x105D, 0x105E, 0x105F, + /* 6 */ 0x1060, 0x1061, 0x1062, 0x1063, 0x1064, 0x1065, 0x1066, 0x1067, + 0x1068, 0x1069, 0x106A, 0x106B, 0x106C, 0x106D, 0x106E, 0x106F, + /* 7 */ 0x1070, 0x1071, 0x1072, 0x1073, 0x1074, 0x1075, 0x1076, 0x1077, + 0x1078, 0x1079, 0x107A, 0x107B, 0x107C, 0x107D, 0x107E, 0x107F, + /* 8 */ 0x1080, 0x1081, 0x1082, 0x1083, 0x1084, 0x1085, 0x1086, 0x1087, + 0x1088, 0x1089, 0x108A, 0x108B, 0x108C, 0x108D, 0x108E, 0x108F, + /* 9 */ 0x1090, 0x1091, 0x1092, 0x1093, 0x1094, 0x1095, 0x1096, 0x1097, + 0x1098, 0x1099, 0x109A, 0x109B, 0x109C, 0x109D, 0x109E, 0x109F, + /* A */ 0x10D0, 0x10D1, 0x10D2, 0x10D3, 0x10D4, 0x10D5, 0x10D6, 0x10D7, + 0x10D8, 0x10D9, 0x10DA, 0x10DB, 0x10DC, 0x10DD, 0x10DE, 0x10DF, + /* B */ 0x10E0, 0x10E1, 0x10E2, 0x10E3, 0x10E4, 0x10E5, 0x10E6, 0x10E7, + 0x10E8, 0x10E9, 0x10EA, 0x10EB, 0x10EC, 0x10ED, 0x10EE, 0x10EF, + /* C */ 0x10F0, 0x10F1, 0x10F2, 0x10F3, 0x10F4, 0x10F5, 0x10C6, 0x10C7, + 0x10C8, 0x10C9, 0x10CA, 0x10CB, 0x10CC, 0x10CD, 0x10CE, 0x10CF, + /* D */ 0x10D0, 0x10D1, 0x10D2, 0x10D3, 0x10D4, 0x10D5, 0x10D6, 0x10D7, + 0x10D8, 0x10D9, 0x10DA, 0x10DB, 0x10DC, 0x10DD, 0x10DE, 0x10DF, + /* E */ 0x10E0, 0x10E1, 0x10E2, 0x10E3, 0x10E4, 0x10E5, 0x10E6, 0x10E7, + 0x10E8, 0x10E9, 0x10EA, 0x10EB, 0x10EC, 0x10ED, 0x10EE, 0x10EF, + /* F */ 0x10F0, 0x10F1, 0x10F2, 0x10F3, 0x10F4, 0x10F5, 0x10F6, 0x10F7, + 0x10F8, 0x10F9, 0x10FA, 0x10FB, 0x10FC, 0x10FD, 0x10FE, 0x10FF, + + // Table 7 (for high byte 0x20) + + /* 0 */ 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, + 0x2008, 0x2009, 0x200A, 0x200B, 0x0000, 0x0000, 0x0000, 0x0000, + /* 1 */ 0x2010, 0x2011, 0x2012, 0x2013, 0x2014, 0x2015, 0x2016, 0x2017, + 0x2018, 0x2019, 0x201A, 0x201B, 0x201C, 0x201D, 0x201E, 0x201F, + /* 2 */ 0x2020, 0x2021, 0x2022, 0x2023, 0x2024, 0x2025, 0x2026, 0x2027, + 0x2028, 0x2029, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x202F, + /* 3 */ 0x2030, 0x2031, 0x2032, 0x2033, 0x2034, 0x2035, 0x2036, 0x2037, + 0x2038, 0x2039, 0x203A, 0x203B, 0x203C, 0x203D, 0x203E, 0x203F, + /* 4 */ 0x2040, 0x2041, 0x2042, 0x2043, 0x2044, 0x2045, 0x2046, 0x2047, + 0x2048, 0x2049, 0x204A, 0x204B, 0x204C, 0x204D, 0x204E, 0x204F, + /* 5 */ 0x2050, 0x2051, 0x2052, 0x2053, 0x2054, 0x2055, 0x2056, 0x2057, + 0x2058, 0x2059, 0x205A, 0x205B, 0x205C, 0x205D, 0x205E, 0x205F, + /* 6 */ 0x2060, 0x2061, 0x2062, 0x2063, 0x2064, 0x2065, 0x2066, 0x2067, + 0x2068, 0x2069, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 7 */ 0x2070, 0x2071, 0x2072, 0x2073, 0x2074, 0x2075, 0x2076, 0x2077, + 0x2078, 0x2079, 0x207A, 0x207B, 0x207C, 0x207D, 0x207E, 0x207F, + /* 8 */ 0x2080, 0x2081, 0x2082, 0x2083, 0x2084, 0x2085, 0x2086, 0x2087, + 0x2088, 0x2089, 0x208A, 0x208B, 0x208C, 0x208D, 0x208E, 0x208F, + /* 9 */ 0x2090, 0x2091, 0x2092, 0x2093, 0x2094, 0x2095, 0x2096, 0x2097, + 0x2098, 0x2099, 0x209A, 0x209B, 0x209C, 0x209D, 0x209E, 0x209F, + /* A */ 0x20A0, 0x20A1, 0x20A2, 0x20A3, 0x20A4, 0x20A5, 0x20A6, 0x20A7, + 0x20A8, 0x20A9, 0x20AA, 0x20AB, 0x20AC, 0x20AD, 0x20AE, 0x20AF, + /* B */ 0x20B0, 0x20B1, 0x20B2, 0x20B3, 0x20B4, 0x20B5, 0x20B6, 0x20B7, + 0x20B8, 0x20B9, 0x20BA, 0x20BB, 0x20BC, 0x20BD, 0x20BE, 0x20BF, + /* C */ 0x20C0, 0x20C1, 0x20C2, 0x20C3, 0x20C4, 0x20C5, 0x20C6, 0x20C7, + 0x20C8, 0x20C9, 0x20CA, 0x20CB, 0x20CC, 0x20CD, 0x20CE, 0x20CF, + /* D */ 0x20D0, 0x20D1, 0x20D2, 0x20D3, 0x20D4, 0x20D5, 0x20D6, 0x20D7, + 0x20D8, 0x20D9, 0x20DA, 0x20DB, 0x20DC, 0x20DD, 0x20DE, 0x20DF, + /* E */ 0x20E0, 0x20E1, 0x20E2, 0x20E3, 0x20E4, 0x20E5, 0x20E6, 0x20E7, + 0x20E8, 0x20E9, 0x20EA, 0x20EB, 0x20EC, 0x20ED, 0x20EE, 0x20EF, + /* F */ 0x20F0, 0x20F1, 0x20F2, 0x20F3, 0x20F4, 0x20F5, 0x20F6, 0x20F7, + 0x20F8, 0x20F9, 0x20FA, 0x20FB, 0x20FC, 0x20FD, 0x20FE, 0x20FF, + + // Table 8 (for high byte 0x21) + + /* 0 */ 0x2100, 0x2101, 0x2102, 0x2103, 0x2104, 0x2105, 0x2106, 0x2107, + 0x2108, 0x2109, 0x210A, 0x210B, 0x210C, 0x210D, 0x210E, 0x210F, + /* 1 */ 0x2110, 0x2111, 0x2112, 0x2113, 0x2114, 0x2115, 0x2116, 0x2117, + 0x2118, 0x2119, 0x211A, 0x211B, 0x211C, 0x211D, 0x211E, 0x211F, + /* 2 */ 0x2120, 0x2121, 0x2122, 0x2123, 0x2124, 0x2125, 0x2126, 0x2127, + 0x2128, 0x2129, 0x212A, 0x212B, 0x212C, 0x212D, 0x212E, 0x212F, + /* 3 */ 0x2130, 0x2131, 0x2132, 0x2133, 0x2134, 0x2135, 0x2136, 0x2137, + 0x2138, 0x2139, 0x213A, 0x213B, 0x213C, 0x213D, 0x213E, 0x213F, + /* 4 */ 0x2140, 0x2141, 0x2142, 0x2143, 0x2144, 0x2145, 0x2146, 0x2147, + 0x2148, 0x2149, 0x214A, 0x214B, 0x214C, 0x214D, 0x214E, 0x214F, + /* 5 */ 0x2150, 0x2151, 0x2152, 0x2153, 0x2154, 0x2155, 0x2156, 0x2157, + 0x2158, 0x2159, 0x215A, 0x215B, 0x215C, 0x215D, 0x215E, 0x215F, + /* 6 */ 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, + 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, + /* 7 */ 0x2170, 0x2171, 0x2172, 0x2173, 0x2174, 0x2175, 0x2176, 0x2177, + 0x2178, 0x2179, 0x217A, 0x217B, 0x217C, 0x217D, 0x217E, 0x217F, + /* 8 */ 0x2180, 0x2181, 0x2182, 0x2183, 0x2184, 0x2185, 0x2186, 0x2187, + 0x2188, 0x2189, 0x218A, 0x218B, 0x218C, 0x218D, 0x218E, 0x218F, + /* 9 */ 0x2190, 0x2191, 0x2192, 0x2193, 0x2194, 0x2195, 0x2196, 0x2197, + 0x2198, 0x2199, 0x219A, 0x219B, 0x219C, 0x219D, 0x219E, 0x219F, + /* A */ 0x21A0, 0x21A1, 0x21A2, 0x21A3, 0x21A4, 0x21A5, 0x21A6, 0x21A7, + 0x21A8, 0x21A9, 0x21AA, 0x21AB, 0x21AC, 0x21AD, 0x21AE, 0x21AF, + /* B */ 0x21B0, 0x21B1, 0x21B2, 0x21B3, 0x21B4, 0x21B5, 0x21B6, 0x21B7, + 0x21B8, 0x21B9, 0x21BA, 0x21BB, 0x21BC, 0x21BD, 0x21BE, 0x21BF, + /* C */ 0x21C0, 0x21C1, 0x21C2, 0x21C3, 0x21C4, 0x21C5, 0x21C6, 0x21C7, + 0x21C8, 0x21C9, 0x21CA, 0x21CB, 0x21CC, 0x21CD, 0x21CE, 0x21CF, + /* D */ 0x21D0, 0x21D1, 0x21D2, 0x21D3, 0x21D4, 0x21D5, 0x21D6, 0x21D7, + 0x21D8, 0x21D9, 0x21DA, 0x21DB, 0x21DC, 0x21DD, 0x21DE, 0x21DF, + /* E */ 0x21E0, 0x21E1, 0x21E2, 0x21E3, 0x21E4, 0x21E5, 0x21E6, 0x21E7, + 0x21E8, 0x21E9, 0x21EA, 0x21EB, 0x21EC, 0x21ED, 0x21EE, 0x21EF, + /* F */ 0x21F0, 0x21F1, 0x21F2, 0x21F3, 0x21F4, 0x21F5, 0x21F6, 0x21F7, + 0x21F8, 0x21F9, 0x21FA, 0x21FB, 0x21FC, 0x21FD, 0x21FE, 0x21FF, + + // Table 9 (for high byte 0xFE) + + /* 0 */ 0xFE00, 0xFE01, 0xFE02, 0xFE03, 0xFE04, 0xFE05, 0xFE06, 0xFE07, + 0xFE08, 0xFE09, 0xFE0A, 0xFE0B, 0xFE0C, 0xFE0D, 0xFE0E, 0xFE0F, + /* 1 */ 0xFE10, 0xFE11, 0xFE12, 0xFE13, 0xFE14, 0xFE15, 0xFE16, 0xFE17, + 0xFE18, 0xFE19, 0xFE1A, 0xFE1B, 0xFE1C, 0xFE1D, 0xFE1E, 0xFE1F, + /* 2 */ 0xFE20, 0xFE21, 0xFE22, 0xFE23, 0xFE24, 0xFE25, 0xFE26, 0xFE27, + 0xFE28, 0xFE29, 0xFE2A, 0xFE2B, 0xFE2C, 0xFE2D, 0xFE2E, 0xFE2F, + /* 3 */ 0xFE30, 0xFE31, 0xFE32, 0xFE33, 0xFE34, 0xFE35, 0xFE36, 0xFE37, + 0xFE38, 0xFE39, 0xFE3A, 0xFE3B, 0xFE3C, 0xFE3D, 0xFE3E, 0xFE3F, + /* 4 */ 0xFE40, 0xFE41, 0xFE42, 0xFE43, 0xFE44, 0xFE45, 0xFE46, 0xFE47, + 0xFE48, 0xFE49, 0xFE4A, 0xFE4B, 0xFE4C, 0xFE4D, 0xFE4E, 0xFE4F, + /* 5 */ 0xFE50, 0xFE51, 0xFE52, 0xFE53, 0xFE54, 0xFE55, 0xFE56, 0xFE57, + 0xFE58, 0xFE59, 0xFE5A, 0xFE5B, 0xFE5C, 0xFE5D, 0xFE5E, 0xFE5F, + /* 6 */ 0xFE60, 0xFE61, 0xFE62, 0xFE63, 0xFE64, 0xFE65, 0xFE66, 0xFE67, + 0xFE68, 0xFE69, 0xFE6A, 0xFE6B, 0xFE6C, 0xFE6D, 0xFE6E, 0xFE6F, + /* 7 */ 0xFE70, 0xFE71, 0xFE72, 0xFE73, 0xFE74, 0xFE75, 0xFE76, 0xFE77, + 0xFE78, 0xFE79, 0xFE7A, 0xFE7B, 0xFE7C, 0xFE7D, 0xFE7E, 0xFE7F, + /* 8 */ 0xFE80, 0xFE81, 0xFE82, 0xFE83, 0xFE84, 0xFE85, 0xFE86, 0xFE87, + 0xFE88, 0xFE89, 0xFE8A, 0xFE8B, 0xFE8C, 0xFE8D, 0xFE8E, 0xFE8F, + /* 9 */ 0xFE90, 0xFE91, 0xFE92, 0xFE93, 0xFE94, 0xFE95, 0xFE96, 0xFE97, + 0xFE98, 0xFE99, 0xFE9A, 0xFE9B, 0xFE9C, 0xFE9D, 0xFE9E, 0xFE9F, + /* A */ 0xFEA0, 0xFEA1, 0xFEA2, 0xFEA3, 0xFEA4, 0xFEA5, 0xFEA6, 0xFEA7, + 0xFEA8, 0xFEA9, 0xFEAA, 0xFEAB, 0xFEAC, 0xFEAD, 0xFEAE, 0xFEAF, + /* B */ 0xFEB0, 0xFEB1, 0xFEB2, 0xFEB3, 0xFEB4, 0xFEB5, 0xFEB6, 0xFEB7, + 0xFEB8, 0xFEB9, 0xFEBA, 0xFEBB, 0xFEBC, 0xFEBD, 0xFEBE, 0xFEBF, + /* C */ 0xFEC0, 0xFEC1, 0xFEC2, 0xFEC3, 0xFEC4, 0xFEC5, 0xFEC6, 0xFEC7, + 0xFEC8, 0xFEC9, 0xFECA, 0xFECB, 0xFECC, 0xFECD, 0xFECE, 0xFECF, + /* D */ 0xFED0, 0xFED1, 0xFED2, 0xFED3, 0xFED4, 0xFED5, 0xFED6, 0xFED7, + 0xFED8, 0xFED9, 0xFEDA, 0xFEDB, 0xFEDC, 0xFEDD, 0xFEDE, 0xFEDF, + /* E */ 0xFEE0, 0xFEE1, 0xFEE2, 0xFEE3, 0xFEE4, 0xFEE5, 0xFEE6, 0xFEE7, + 0xFEE8, 0xFEE9, 0xFEEA, 0xFEEB, 0xFEEC, 0xFEED, 0xFEEE, 0xFEEF, + /* F */ 0xFEF0, 0xFEF1, 0xFEF2, 0xFEF3, 0xFEF4, 0xFEF5, 0xFEF6, 0xFEF7, + 0xFEF8, 0xFEF9, 0xFEFA, 0xFEFB, 0xFEFC, 0xFEFD, 0xFEFE, 0x0000, + + // Table 10 (for high byte 0xFF) + + /* 0 */ 0xFF00, 0xFF01, 0xFF02, 0xFF03, 0xFF04, 0xFF05, 0xFF06, 0xFF07, + 0xFF08, 0xFF09, 0xFF0A, 0xFF0B, 0xFF0C, 0xFF0D, 0xFF0E, 0xFF0F, + /* 1 */ 0xFF10, 0xFF11, 0xFF12, 0xFF13, 0xFF14, 0xFF15, 0xFF16, 0xFF17, + 0xFF18, 0xFF19, 0xFF1A, 0xFF1B, 0xFF1C, 0xFF1D, 0xFF1E, 0xFF1F, + /* 2 */ 0xFF20, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, + 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, + /* 3 */ 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, + 0xFF58, 0xFF59, 0xFF5A, 0xFF3B, 0xFF3C, 0xFF3D, 0xFF3E, 0xFF3F, + /* 4 */ 0xFF40, 0xFF41, 0xFF42, 0xFF43, 0xFF44, 0xFF45, 0xFF46, 0xFF47, + 0xFF48, 0xFF49, 0xFF4A, 0xFF4B, 0xFF4C, 0xFF4D, 0xFF4E, 0xFF4F, + /* 5 */ 0xFF50, 0xFF51, 0xFF52, 0xFF53, 0xFF54, 0xFF55, 0xFF56, 0xFF57, + 0xFF58, 0xFF59, 0xFF5A, 0xFF5B, 0xFF5C, 0xFF5D, 0xFF5E, 0xFF5F, + /* 6 */ 0xFF60, 0xFF61, 0xFF62, 0xFF63, 0xFF64, 0xFF65, 0xFF66, 0xFF67, + 0xFF68, 0xFF69, 0xFF6A, 0xFF6B, 0xFF6C, 0xFF6D, 0xFF6E, 0xFF6F, + /* 7 */ 0xFF70, 0xFF71, 0xFF72, 0xFF73, 0xFF74, 0xFF75, 0xFF76, 0xFF77, + 0xFF78, 0xFF79, 0xFF7A, 0xFF7B, 0xFF7C, 0xFF7D, 0xFF7E, 0xFF7F, + /* 8 */ 0xFF80, 0xFF81, 0xFF82, 0xFF83, 0xFF84, 0xFF85, 0xFF86, 0xFF87, + 0xFF88, 0xFF89, 0xFF8A, 0xFF8B, 0xFF8C, 0xFF8D, 0xFF8E, 0xFF8F, + /* 9 */ 0xFF90, 0xFF91, 0xFF92, 0xFF93, 0xFF94, 0xFF95, 0xFF96, 0xFF97, + 0xFF98, 0xFF99, 0xFF9A, 0xFF9B, 0xFF9C, 0xFF9D, 0xFF9E, 0xFF9F, + /* A */ 0xFFA0, 0xFFA1, 0xFFA2, 0xFFA3, 0xFFA4, 0xFFA5, 0xFFA6, 0xFFA7, + 0xFFA8, 0xFFA9, 0xFFAA, 0xFFAB, 0xFFAC, 0xFFAD, 0xFFAE, 0xFFAF, + /* B */ 0xFFB0, 0xFFB1, 0xFFB2, 0xFFB3, 0xFFB4, 0xFFB5, 0xFFB6, 0xFFB7, + 0xFFB8, 0xFFB9, 0xFFBA, 0xFFBB, 0xFFBC, 0xFFBD, 0xFFBE, 0xFFBF, + /* C */ 0xFFC0, 0xFFC1, 0xFFC2, 0xFFC3, 0xFFC4, 0xFFC5, 0xFFC6, 0xFFC7, + 0xFFC8, 0xFFC9, 0xFFCA, 0xFFCB, 0xFFCC, 0xFFCD, 0xFFCE, 0xFFCF, + /* D */ 0xFFD0, 0xFFD1, 0xFFD2, 0xFFD3, 0xFFD4, 0xFFD5, 0xFFD6, 0xFFD7, + 0xFFD8, 0xFFD9, 0xFFDA, 0xFFDB, 0xFFDC, 0xFFDD, 0xFFDE, 0xFFDF, + /* E */ 0xFFE0, 0xFFE1, 0xFFE2, 0xFFE3, 0xFFE4, 0xFFE5, 0xFFE6, 0xFFE7, + 0xFFE8, 0xFFE9, 0xFFEA, 0xFFEB, 0xFFEC, 0xFFED, 0xFFEE, 0xFFEF, + /* F */ 0xFFF0, 0xFFF1, 0xFFF2, 0xFFF3, 0xFFF4, 0xFFF5, 0xFFF6, 0xFFF7, + 0xFFF8, 0xFFF9, 0xFFFA, 0xFFFB, 0xFFFC, 0xFFFD, 0xFFFE, 0xFFFF, +}; +// clang-format on + +// Returns the next non-ignorable codepoint within `string` starting from the +// position indicated by `index`, or zero if there are no more. +// The passed-in `index` is automatically advanced as the characters in the +// input HFS-decomposed UTF-8 strings are read. +inline base_icu::UChar32 HFSReadNextNonIgnorableCodepoint(const char* string, + size_t length, + size_t* index) { + base_icu::UChar32 codepoint = 0; + while (*index < length && codepoint == 0) { + // CBU8_NEXT returns a value < 0 in error cases. For purposes of string + // comparison, we just use that value and flag it with DCHECK. + CBU8_NEXT(reinterpret_cast(string), *index, length, + codepoint); + DCHECK_GT(codepoint, 0); + + // Note: Here, there are no lower case conversion implemented in the + // Supplementary Multilingual Plane (codepoint > 0xFFFF). + + if (codepoint > 0 && codepoint <= 0xFFFF) { + // Check if there is a subtable for this upper byte. + int lookup_offset = lower_case_table[codepoint >> 8]; + if (lookup_offset != 0) + codepoint = lower_case_table[lookup_offset + (codepoint & 0x00FF)]; + // Note: `codepoint` may be again 0 at this point if the character was + // an ignorable. + } + } + return codepoint; +} + +} // namespace + +// Special UTF-8 version of FastUnicodeCompare. Cf: +// http://developer.apple.com/mac/library/technotes/tn/tn1150.html#StringComparisonAlgorithm +// The input strings must be in the special HFS decomposed form. +int FilePath::HFSFastUnicodeCompare(StringPieceType string1, + StringPieceType string2) { + size_t length1 = string1.length(); + size_t length2 = string2.length(); + size_t index1 = 0; + size_t index2 = 0; + + for (;;) { + base_icu::UChar32 codepoint1 = + HFSReadNextNonIgnorableCodepoint(string1.data(), length1, &index1); + base_icu::UChar32 codepoint2 = + HFSReadNextNonIgnorableCodepoint(string2.data(), length2, &index2); + if (codepoint1 != codepoint2) + return (codepoint1 < codepoint2) ? -1 : 1; + if (codepoint1 == 0) { + DCHECK_EQ(index1, length1); + DCHECK_EQ(index2, length2); + return 0; + } + } +} + +StringType FilePath::GetHFSDecomposedForm(StringPieceType string) { + StringType result; + ScopedCFTypeRef cfstring(CFStringCreateWithBytesNoCopy( + NULL, reinterpret_cast(string.data()), + checked_cast(string.length()), kCFStringEncodingUTF8, false, + kCFAllocatorNull)); + if (cfstring) { + // Query the maximum length needed to store the result. In most cases this + // will overestimate the required space. The return value also already + // includes the space needed for a terminating 0. + CFIndex length = CFStringGetMaximumSizeOfFileSystemRepresentation(cfstring); + DCHECK_GT(length, 0); // should be at least 1 for the 0-terminator. + // Reserve enough space for CFStringGetFileSystemRepresentation to write + // into. Also set the length to the maximum so that we can shrink it later. + // (Increasing rather than decreasing it would clobber the string contents!) + result.reserve(static_cast(length)); + result.resize(static_cast(length) - 1); + Boolean success = CFStringGetFileSystemRepresentation(cfstring, + &result[0], + length); + if (success) { + // Reduce result.length() to actual string length. + result.resize(strlen(result.c_str())); + } else { + // An error occurred -> clear result. + result.clear(); + } + } + return result; +} + +int FilePath::CompareIgnoreCase(StringPieceType string1, + StringPieceType string2) { + // Quick checks for empty strings - these speed things up a bit and make the + // following code cleaner. + if (string1.empty()) + return string2.empty() ? 0 : -1; + if (string2.empty()) + return 1; + + StringType hfs1 = GetHFSDecomposedForm(string1); + StringType hfs2 = GetHFSDecomposedForm(string2); + + // GetHFSDecomposedForm() returns an empty string in an error case. + if (hfs1.empty() || hfs2.empty()) { + ScopedCFTypeRef cfstring1(CFStringCreateWithBytesNoCopy( + NULL, reinterpret_cast(string1.data()), + checked_cast(string1.length()), kCFStringEncodingUTF8, false, + kCFAllocatorNull)); + ScopedCFTypeRef cfstring2(CFStringCreateWithBytesNoCopy( + NULL, reinterpret_cast(string2.data()), + checked_cast(string2.length()), kCFStringEncodingUTF8, false, + kCFAllocatorNull)); + // If neither GetHFSDecomposedForm nor CFStringCreateWithBytesNoCopy + // succeed, fall back to strcmp. This can occur when the input string is + // invalid UTF-8. + if (!cfstring1 || !cfstring2) { + int comparison = memcmp(string1.data(), string2.data(), + std::min(string1.length(), string2.length())); + if (comparison < 0) + return -1; + if (comparison > 0) + return 1; + return 0; + } + + return static_cast( + CFStringCompare(cfstring1, cfstring2, kCFCompareCaseInsensitive)); + } + + return HFSFastUnicodeCompare(hfs1, hfs2); +} + +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + +// Generic Posix system comparisons. +int FilePath::CompareIgnoreCase(StringPieceType string1, + StringPieceType string2) { + size_t rlen = std::min(string1.size(), string2.size()); + int comparison = strncasecmp(string1.data(), string2.data(), rlen); + if (comparison < 0 || (comparison == 0 && string1.size() < string2.size())) + return -1; + if (comparison > 0 || (comparison == 0 && string1.size() > string2.size())) + return 1; + return 0; +} + +#endif // OS versions of CompareIgnoreCase() + + +void FilePath::StripTrailingSeparatorsInternal() { + // If there is no drive letter, start will be 1, which will prevent stripping + // the leading separator if there is only one separator. If there is a drive + // letter, start will be set appropriately to prevent stripping the first + // separator following the drive letter, if a separator immediately follows + // the drive letter. + StringType::size_type start = FindDriveLetter(path_) + 2; + + StringType::size_type last_stripped = StringType::npos; + for (StringType::size_type pos = path_.length(); + pos > start && IsSeparator(path_[pos - 1]); + --pos) { + // If the string only has two separators and they're at the beginning, + // don't strip them, unless the string began with more than two separators. + if (pos != start + 1 || last_stripped == start + 2 || + !IsSeparator(path_[start - 1])) { + path_.resize(pos - 1); + last_stripped = pos; + } + } +} + +FilePath FilePath::NormalizePathSeparators() const { + return NormalizePathSeparatorsTo(kSeparators[0]); +} + +void FilePath::WriteIntoTrace(perfetto::TracedValue context) const { + perfetto::WriteIntoTracedValue(std::move(context), value()); +} + +FilePath FilePath::NormalizePathSeparatorsTo(CharType separator) const { +#if defined(FILE_PATH_USES_WIN_SEPARATORS) + DCHECK_NE(kSeparators + kSeparatorsLength, + std::find(kSeparators, kSeparators + kSeparatorsLength, separator)); + StringType copy = path_; + for (size_t i = 0; i < kSeparatorsLength; ++i) { + std::replace(copy.begin(), copy.end(), kSeparators[i], separator); + } + return FilePath(copy); +#else + return *this; +#endif +} + +#if BUILDFLAG(IS_ANDROID) +bool FilePath::IsContentUri() const { + return StartsWith(path_, "content://", base::CompareCase::INSENSITIVE_ASCII); +} +#endif + +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_path.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_path.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_path.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_path.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,532 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// FilePath is a container for pathnames stored in a platform's native string +// type, providing containers for manipulation in according with the +// platform's conventions for pathnames. It supports the following path +// types: +// +// POSIX Windows +// --------------- ---------------------------------- +// Fundamental type char[] wchar_t[] +// Encoding unspecified* UTF-16 +// Separator / \, tolerant of / +// Drive letters no case-insensitive A-Z followed by : +// Alternate root // (surprise!) \\ (2 Separators), for UNC paths +// +// * The encoding need not be specified on POSIX systems, although some +// POSIX-compliant systems do specify an encoding. Mac OS X uses UTF-8. +// Chrome OS also uses UTF-8. +// Linux does not specify an encoding, but in practice, the locale's +// character set may be used. +// +// For more arcane bits of path trivia, see below. +// +// FilePath objects are intended to be used anywhere paths are. An +// application may pass FilePath objects around internally, masking the +// underlying differences between systems, only differing in implementation +// where interfacing directly with the system. For example, a single +// OpenFile(const FilePath &) function may be made available, allowing all +// callers to operate without regard to the underlying implementation. On +// POSIX-like platforms, OpenFile might wrap fopen, and on Windows, it might +// wrap _wfopen_s, perhaps both by calling file_path.value().c_str(). This +// allows each platform to pass pathnames around without requiring conversions +// between encodings, which has an impact on performance, but more imporantly, +// has an impact on correctness on platforms that do not have well-defined +// encodings for pathnames. +// +// Several methods are available to perform common operations on a FilePath +// object, such as determining the parent directory (DirName), isolating the +// final path component (BaseName), and appending a relative pathname string +// to an existing FilePath object (Append). These methods are highly +// recommended over attempting to split and concatenate strings directly. +// These methods are based purely on string manipulation and knowledge of +// platform-specific pathname conventions, and do not consult the filesystem +// at all, making them safe to use without fear of blocking on I/O operations. +// These methods do not function as mutators but instead return distinct +// instances of FilePath objects, and are therefore safe to use on const +// objects. The objects themselves are safe to share between threads. +// +// To aid in initialization of FilePath objects from string literals, a +// FILE_PATH_LITERAL macro is provided, which accounts for the difference +// between char[]-based pathnames on POSIX systems and wchar_t[]-based +// pathnames on Windows. +// +// As a precaution against premature truncation, paths can't contain NULs. +// +// Because a FilePath object should not be instantiated at the global scope, +// instead, use a FilePath::CharType[] and initialize it with +// FILE_PATH_LITERAL. At runtime, a FilePath object can be created from the +// character array. Example: +// +// | const FilePath::CharType kLogFileName[] = FILE_PATH_LITERAL("log.txt"); +// | +// | void Function() { +// | FilePath log_file_path(kLogFileName); +// | [...] +// | } +// +// WARNING: FilePaths should ALWAYS be displayed with LTR directionality, even +// when the UI language is RTL. This means you always need to pass filepaths +// through base::i18n::WrapPathWithLTRFormatting() before displaying it in the +// RTL UI. +// +// This is a very common source of bugs, please try to keep this in mind. +// +// ARCANE BITS OF PATH TRIVIA +// +// - A double leading slash is actually part of the POSIX standard. Systems +// are allowed to treat // as an alternate root, as Windows does for UNC +// (network share) paths. Most POSIX systems don't do anything special +// with two leading slashes, but FilePath handles this case properly +// in case it ever comes across such a system. FilePath needs this support +// for Windows UNC paths, anyway. +// References: +// The Open Group Base Specifications Issue 7, sections 3.267 ("Pathname") +// and 4.12 ("Pathname Resolution"), available at: +// http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_267 +// http://www.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_12 +// +// - Windows treats c:\\ the same way it treats \\. This was intended to +// allow older applications that require drive letters to support UNC paths +// like \\server\share\path, by permitting c:\\server\share\path as an +// equivalent. Since the OS treats these paths specially, FilePath needs +// to do the same. Since Windows can use either / or \ as the separator, +// FilePath treats c://, c:\\, //, and \\ all equivalently. +// Reference: +// The Old New Thing, "Why is a drive letter permitted in front of UNC +// paths (sometimes)?", available at: +// http://blogs.msdn.com/oldnewthing/archive/2005/11/22/495740.aspx + +#ifndef BASE_FILES_FILE_PATH_H_ +#define BASE_FILES_FILE_PATH_H_ + +#include +#include +#include +#include + +#include "base/base_export.h" +#include "base/strings/string_piece.h" +#include "base/trace_event/base_tracing_forward.h" +#include "build/build_config.h" + +// Windows-style drive letter support and pathname separator characters can be +// enabled and disabled independently, to aid testing. These #defines are +// here so that the same setting can be used in both the implementation and +// in the unit test. +#if BUILDFLAG(IS_WIN) +#define FILE_PATH_USES_DRIVE_LETTERS +#define FILE_PATH_USES_WIN_SEPARATORS +#endif // BUILDFLAG(IS_WIN) + +// To print path names portably use PRFilePath (based on PRIuS and friends from +// C99 and format_macros.h) like this: +// base::StringPrintf("Path is %" PRFilePath ".\n", path.value().c_str()); +#if BUILDFLAG(IS_WIN) +#define PRFilePath "ls" +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +#define PRFilePath "s" +#endif // BUILDFLAG(IS_WIN) + +// Macros for string literal initialization of FilePath::CharType[]. +#if BUILDFLAG(IS_WIN) + +// The `FILE_PATH_LITERAL_INTERNAL` indirection allows `FILE_PATH_LITERAL` to +// work correctly with macro parameters, for example +// `FILE_PATH_LITERAL(TEST_FILE)` where `TEST_FILE` is a macro #defined as +// "TestFile". +#define FILE_PATH_LITERAL_INTERNAL(x) L##x +#define FILE_PATH_LITERAL(x) FILE_PATH_LITERAL_INTERNAL(x) + +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +#define FILE_PATH_LITERAL(x) x +#endif // BUILDFLAG(IS_WIN) + +namespace base { + +class SafeBaseName; +class Pickle; +class PickleIterator; + +// An abstraction to isolate users from the differences between native +// pathnames on different platforms. +class BASE_EXPORT FilePath { + public: +#if BUILDFLAG(IS_WIN) + // On Windows, for Unicode-aware applications, native pathnames are wchar_t + // arrays encoded in UTF-16. + typedef std::wstring StringType; +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + // On most platforms, native pathnames are char arrays, and the encoding + // may or may not be specified. On Mac OS X, native pathnames are encoded + // in UTF-8. + typedef std::string StringType; +#endif // BUILDFLAG(IS_WIN) + + typedef StringType::value_type CharType; + typedef BasicStringPiece StringPieceType; + + // Null-terminated array of separators used to separate components in paths. + // Each character in this array is a valid separator, but kSeparators[0] is + // treated as the canonical separator and is used when composing pathnames. + static constexpr CharType kSeparators[] = +#if defined(FILE_PATH_USES_WIN_SEPARATORS) + FILE_PATH_LITERAL("\\/"); +#else // FILE_PATH_USES_WIN_SEPARATORS + FILE_PATH_LITERAL("/"); +#endif // FILE_PATH_USES_WIN_SEPARATORS + + // std::size(kSeparators), i.e., the number of separators in kSeparators plus + // one (the null terminator at the end of kSeparators). + static constexpr size_t kSeparatorsLength = std::size(kSeparators); + + // The special path component meaning "this directory." + static constexpr CharType kCurrentDirectory[] = FILE_PATH_LITERAL("."); + + // The special path component meaning "the parent directory." + static constexpr CharType kParentDirectory[] = FILE_PATH_LITERAL(".."); + + // The character used to identify a file extension. + static constexpr CharType kExtensionSeparator = FILE_PATH_LITERAL('.'); + + FilePath(); + FilePath(const FilePath& that); + explicit FilePath(StringPieceType path); + ~FilePath(); + FilePath& operator=(const FilePath& that); + + // Constructs FilePath with the contents of |that|, which is left in valid but + // unspecified state. + FilePath(FilePath&& that) noexcept; + // Replaces the contents with those of |that|, which is left in valid but + // unspecified state. +#if !defined(MOZ_ZUCCHINI) + FilePath& operator=(FilePath&& that) noexcept; +#else + FilePath& operator=(FilePath&& that); +#endif // !defined(MOZ_ZUCCHINI) + + bool operator==(const FilePath& that) const; + + bool operator!=(const FilePath& that) const; + + // Required for some STL containers and operations + bool operator<(const FilePath& that) const { + return path_ < that.path_; + } + + const StringType& value() const { return path_; } + + [[nodiscard]] bool empty() const { return path_.empty(); } + + void clear() { path_.clear(); } + + // Returns true if |character| is in kSeparators. + static bool IsSeparator(CharType character); + + // Returns a vector of all of the components of the provided path. It is + // equivalent to calling DirName().value() on the path's root component, + // and BaseName().value() on each child component. + // + // To make sure this is lossless so we can differentiate absolute and + // relative paths, the root slash will be included even though no other + // slashes will be. The precise behavior is: + // + // Posix: "/foo/bar" -> [ "/", "foo", "bar" ] + // Windows: "C:\foo\bar" -> [ "C:", "\\", "foo", "bar" ] + std::vector GetComponents() const; + + // Returns true if this FilePath is a parent or ancestor of the |child|. + // Absolute and relative paths are accepted i.e. /foo is a parent to /foo/bar, + // and foo is a parent to foo/bar. Any ancestor is considered a parent i.e. /a + // is a parent to both /a/b and /a/b/c. Does not convert paths to absolute, + // follow symlinks or directory navigation (e.g. ".."). A path is *NOT* its + // own parent. + bool IsParent(const FilePath& child) const; + + // If IsParent(child) holds, appends to path (if non-NULL) the + // relative path to child and returns true. For example, if parent + // holds "/Users/johndoe/Library/Application Support", child holds + // "/Users/johndoe/Library/Application Support/Google/Chrome/Default", and + // *path holds "/Users/johndoe/Library/Caches", then after + // parent.AppendRelativePath(child, path) is called *path will hold + // "/Users/johndoe/Library/Caches/Google/Chrome/Default". Otherwise, + // returns false. + bool AppendRelativePath(const FilePath& child, FilePath* path) const; + + // Returns a FilePath corresponding to the directory containing the path + // named by this object, stripping away the file component. If this object + // only contains one component, returns a FilePath identifying + // kCurrentDirectory. If this object already refers to the root directory, + // returns a FilePath identifying the root directory. Please note that this + // doesn't resolve directory navigation, e.g. the result for "../a" is "..". + [[nodiscard]] FilePath DirName() const; + + // Returns a FilePath corresponding to the last path component of this + // object, either a file or a directory. If this object already refers to + // the root directory, returns a FilePath identifying the root directory; + // this is the only situation in which BaseName will return an absolute path. + [[nodiscard]] FilePath BaseName() const; + + // Returns the extension of a file path. This method works very similarly to + // FinalExtension(), except when the file path ends with a common + // double-extension. For common double-extensions like ".tar.gz" and + // ".user.js", this method returns the combined extension. + // + // Common means that detecting double-extensions is based on a hard-coded + // allow-list (including but not limited to ".*.gz" and ".user.js") and isn't + // solely dependent on the number of dots. Specifically, even if somebody + // invents a new Blah compression algorithm: + // - calling this function with "foo.tar.bz2" will return ".tar.bz2", but + // - calling this function with "foo.tar.blah" will return just ".blah" + // until ".*.blah" is added to the hard-coded allow-list. + // + // That hard-coded allow-list is case-insensitive: ".GZ" and ".gz" are + // equivalent. However, the StringType returned is not canonicalized for + // case: "foo.TAR.bz2" input will produce ".TAR.bz2", not ".tar.bz2", and + // "bar.EXT", which is not a double-extension, will produce ".EXT". + // + // The following code should always work regardless of the value of path. + // new_path = path.RemoveExtension().value().append(path.Extension()); + // ASSERT(new_path == path.value()); + // + // NOTE: this is different from the original file_util implementation which + // returned the extension without a leading "." ("jpg" instead of ".jpg"). + [[nodiscard]] StringType Extension() const; + + // Returns the final extension of a file path, or an empty string if the file + // path has no extension. In most cases, the final extension of a file path + // refers to the part of the file path from the last dot to the end (including + // the dot itself). For example, this method applied to "/pics/jojo.jpg" + // and "/pics/jojo." returns ".jpg" and ".", respectively. However, if the + // base name of the file path is either "." or "..", this method returns an + // empty string. + // + // TODO(davidben): Check all our extension-sensitive code to see if + // we can rename this to Extension() and the other to something like + // LongExtension(), defaulting to short extensions and leaving the + // long "extensions" to logic like base::GetUniquePathNumber(). + [[nodiscard]] StringType FinalExtension() const; + + // Returns "C:\pics\jojo" for path "C:\pics\jojo.jpg" + // NOTE: this is slightly different from the similar file_util implementation + // which returned simply 'jojo'. + [[nodiscard]] FilePath RemoveExtension() const; + + // Removes the path's file extension, as in RemoveExtension(), but + // ignores double extensions. + [[nodiscard]] FilePath RemoveFinalExtension() const; + + // Inserts |suffix| after the file name portion of |path| but before the + // extension. Returns "" if BaseName() == "." or "..". + // Examples: + // path == "C:\pics\jojo.jpg" suffix == " (1)", returns "C:\pics\jojo (1).jpg" + // path == "jojo.jpg" suffix == " (1)", returns "jojo (1).jpg" + // path == "C:\pics\jojo" suffix == " (1)", returns "C:\pics\jojo (1)" + // path == "C:\pics.old\jojo" suffix == " (1)", returns "C:\pics.old\jojo (1)" + [[nodiscard]] FilePath InsertBeforeExtension(StringPieceType suffix) const; + [[nodiscard]] FilePath InsertBeforeExtensionASCII(StringPiece suffix) const; + + // Adds |extension| to |file_name|. Returns the current FilePath if + // |extension| is empty. Returns "" if BaseName() == "." or "..". + [[nodiscard]] FilePath AddExtension(StringPieceType extension) const; + + // Like above, but takes the extension as an ASCII string. See AppendASCII for + // details on how this is handled. + [[nodiscard]] FilePath AddExtensionASCII(StringPiece extension) const; + + // Replaces the extension of |file_name| with |extension|. If |file_name| + // does not have an extension, then |extension| is added. If |extension| is + // empty, then the extension is removed from |file_name|. + // Returns "" if BaseName() == "." or "..". + [[nodiscard]] FilePath ReplaceExtension(StringPieceType extension) const; + + // Returns true if file path's Extension() matches `extension`. The test is + // case insensitive. Don't forget the leading period if appropriate. + bool MatchesExtension(StringPieceType extension) const; + + // Returns true if file path's FinalExtension() matches `extension`. The + // test is case insensitive. Don't forget the leading period if appropriate. + bool MatchesFinalExtension(StringPieceType extension) const; + + // Returns a FilePath by appending a separator and the supplied path + // component to this object's path. Append takes care to avoid adding + // excessive separators if this object's path already ends with a separator. + // If this object's path is kCurrentDirectory ('.'), a new FilePath + // corresponding only to |component| is returned. |component| must be a + // relative path; it is an error to pass an absolute path. + [[nodiscard]] FilePath Append(StringPieceType component) const; + [[nodiscard]] FilePath Append(const FilePath& component) const; + [[nodiscard]] FilePath Append(const SafeBaseName& component) const; + + // Although Windows StringType is std::wstring, since the encoding it uses for + // paths is well defined, it can handle ASCII path components as well. + // Mac uses UTF8, and since ASCII is a subset of that, it works there as well. + // On Linux, although it can use any 8-bit encoding for paths, we assume that + // ASCII is a valid subset, regardless of the encoding, since many operating + // system paths will always be ASCII. + [[nodiscard]] FilePath AppendASCII(StringPiece component) const; + + // Returns true if this FilePath contains an absolute path. On Windows, an + // absolute path begins with either a drive letter specification followed by + // a separator character, or with two separator characters. On POSIX + // platforms, an absolute path begins with a separator character. + bool IsAbsolute() const; + + // Returns true if this FilePath is a network path which starts with 2 path + // separators. See class documentation for 'Alternate root'. + bool IsNetwork() const; + + // Returns true if the patch ends with a path separator character. + [[nodiscard]] bool EndsWithSeparator() const; + + // Returns a copy of this FilePath that ends with a trailing separator. If + // the input path is empty, an empty FilePath will be returned. + [[nodiscard]] FilePath AsEndingWithSeparator() const; + + // Returns a copy of this FilePath that does not end with a trailing + // separator. + [[nodiscard]] FilePath StripTrailingSeparators() const; + + // Returns true if this FilePath contains an attempt to reference a parent + // directory (e.g. has a path component that is ".."). + bool ReferencesParent() const; + + // Return a Unicode human-readable version of this path. + // Warning: you can *not*, in general, go from a display name back to a real + // path. Only use this when displaying paths to users, not just when you + // want to stuff a std::u16string into some other API. + std::u16string LossyDisplayName() const; + + // Return the path as ASCII, or the empty string if the path is not ASCII. + // This should only be used for cases where the FilePath is representing a + // known-ASCII filename. + std::string MaybeAsASCII() const; + + // Return the path as UTF-8. + // + // This function is *unsafe* as there is no way to tell what encoding is + // used in file names on POSIX systems other than Mac and Chrome OS, + // although UTF-8 is practically used everywhere these days. To mitigate + // the encoding issue, this function internally calls + // SysNativeMBToWide() on POSIX systems other than Mac and Chrome OS, + // per assumption that the current locale's encoding is used in file + // names, but this isn't a perfect solution. + // + // Once it becomes safe to to stop caring about non-UTF-8 file names, + // the SysNativeMBToWide() hack will be removed from the code, along + // with "Unsafe" in the function name. + std::string AsUTF8Unsafe() const; + + // Similar to AsUTF8Unsafe, but returns UTF-16 instead. + std::u16string AsUTF16Unsafe() const; + + // Returns a FilePath object from a path name in ASCII. + static FilePath FromASCII(StringPiece ascii); + + // Returns a FilePath object from a path name in UTF-8. This function + // should only be used for cases where you are sure that the input + // string is UTF-8. + // + // Like AsUTF8Unsafe(), this function is unsafe. This function + // internally calls SysWideToNativeMB() on POSIX systems other than Mac + // and Chrome OS, to mitigate the encoding issue. See the comment at + // AsUTF8Unsafe() for details. + static FilePath FromUTF8Unsafe(StringPiece utf8); + + // Similar to FromUTF8Unsafe, but accepts UTF-16 instead. + static FilePath FromUTF16Unsafe(StringPiece16 utf16); + + void WriteToPickle(Pickle* pickle) const; + bool ReadFromPickle(PickleIterator* iter); + + // Normalize all path separators to backslash on Windows + // (if FILE_PATH_USES_WIN_SEPARATORS is true), or do nothing on POSIX systems. + [[nodiscard]] FilePath NormalizePathSeparators() const; + + // Normalize all path separattors to given type on Windows + // (if FILE_PATH_USES_WIN_SEPARATORS is true), or do nothing on POSIX systems. + [[nodiscard]] FilePath NormalizePathSeparatorsTo(CharType separator) const; + + // Compare two strings in the same way the file system does. + // Note that these always ignore case, even on file systems that are case- + // sensitive. If case-sensitive comparison is ever needed, add corresponding + // methods here. + // The methods are written as a static method so that they can also be used + // on parts of a file path, e.g., just the extension. + // CompareIgnoreCase() returns -1, 0 or 1 for less-than, equal-to and + // greater-than respectively. + static int CompareIgnoreCase(StringPieceType string1, + StringPieceType string2); + static bool CompareEqualIgnoreCase(StringPieceType string1, + StringPieceType string2) { + return CompareIgnoreCase(string1, string2) == 0; + } + static bool CompareLessIgnoreCase(StringPieceType string1, + StringPieceType string2) { + return CompareIgnoreCase(string1, string2) < 0; + } + + // Serialise this object into a trace. + void WriteIntoTrace(perfetto::TracedValue context) const; + +#if BUILDFLAG(IS_APPLE) + // Returns the string in the special canonical decomposed form as defined for + // HFS, which is close to, but not quite, decomposition form D. See + // http://developer.apple.com/mac/library/technotes/tn/tn1150.html#UnicodeSubtleties + // for further comments. + // Returns the epmty string if the conversion failed. + static StringType GetHFSDecomposedForm(StringPieceType string); + + // Special UTF-8 version of FastUnicodeCompare. Cf: + // http://developer.apple.com/mac/library/technotes/tn/tn1150.html#StringComparisonAlgorithm + // IMPORTANT: The input strings must be in the special HFS decomposed form! + // (cf. above GetHFSDecomposedForm method) + static int HFSFastUnicodeCompare(StringPieceType string1, + StringPieceType string2); +#endif + +#if BUILDFLAG(IS_ANDROID) + // On android, file selection dialog can return a file with content uri + // scheme(starting with content://). Content uri needs to be opened with + // ContentResolver to guarantee that the app has appropriate permissions + // to access it. + // Returns true if the path is a content uri, or false otherwise. + bool IsContentUri() const; +#endif + + // NOTE: When adding a new public method, consider adding it to + // file_path_fuzzer.cc as well. + + private: + // Remove trailing separators from this object. If the path is absolute, it + // will never be stripped any more than to refer to the absolute root + // directory, so "////" will become "/", not "". A leading pair of + // separators is never stripped, to support alternate roots. This is used to + // support UNC paths on Windows. + void StripTrailingSeparatorsInternal(); + + StringType path_; +}; + +BASE_EXPORT std::ostream& operator<<(std::ostream& out, + const FilePath& file_path); + +} // namespace base + +namespace std { + +template <> +struct hash { + typedef base::FilePath argument_type; + typedef std::size_t result_type; + result_type operator()(argument_type const& f) const { + return hash()(f.value()); + } +}; + +} // namespace std + +#endif // BASE_FILES_FILE_PATH_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_posix.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_posix.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_posix.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_posix.cc 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,625 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file.h" + +// The only 32-bit platform that uses this file is Android. On Android APIs +// >= 21, this standard define is the right way to express that you want a +// 64-bit offset in struct stat, and the stat64 struct and functions aren't +// useful. +#define _FILE_OFFSET_BITS 64 + +#include +#include +#include +#include +#include + +static_assert(sizeof(base::stat_wrapper_t::st_size) >= 8); + +#include "base/check_op.h" +#include "base/notreached.h" +#include "base/numerics/safe_conversions.h" +#include "base/posix/eintr_wrapper.h" +#include "base/strings/utf_string_conversions.h" +#include "base/threading/scoped_blocking_call.h" +#include "build/build_config.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + +#if BUILDFLAG(IS_ANDROID) +#include "base/os_compat_android.h" +#endif + +namespace base { + +// Make sure our Whence mappings match the system headers. +static_assert(File::FROM_BEGIN == SEEK_SET && File::FROM_CURRENT == SEEK_CUR && + File::FROM_END == SEEK_END, + "whence mapping must match the system headers"); + +namespace { + +// NaCl doesn't provide the following system calls, so either simulate them or +// wrap them in order to minimize the number of #ifdef's in this file. +#if !BUILDFLAG(IS_NACL) && !BUILDFLAG(IS_AIX) +bool IsOpenAppend(PlatformFile file) { + return (fcntl(file, F_GETFL) & O_APPEND) != 0; +} + +int CallFtruncate(PlatformFile file, int64_t length) { +#if BUILDFLAG(IS_BSD) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_FUCHSIA) + static_assert(sizeof(off_t) >= sizeof(int64_t), + "off_t is not a 64-bit integer"); + return HANDLE_EINTR(ftruncate(file, length)); +#else + return HANDLE_EINTR(ftruncate64(file, length)); +#endif +} + +#if !defined(MOZ_ZUCCHINI) +int CallFutimes(PlatformFile file, const struct timeval times[2]) { +#ifdef __USE_XOPEN2K8 + // futimens should be available, but futimes might not be + // http://pubs.opengroup.org/onlinepubs/9699919799/ + + timespec ts_times[2]; + ts_times[0].tv_sec = times[0].tv_sec; + ts_times[0].tv_nsec = times[0].tv_usec * 1000; + ts_times[1].tv_sec = times[1].tv_sec; + ts_times[1].tv_nsec = times[1].tv_usec * 1000; + + return futimens(file, ts_times); +#else + return futimes(file, times); +#endif +} +#endif // !defined(MOZ_ZUCCHINI) + +#if !BUILDFLAG(IS_FUCHSIA) +short FcntlFlockType(absl::optional mode) { + if (!mode.has_value()) + return F_UNLCK; + switch (mode.value()) { + case File::LockMode::kShared: + return F_RDLCK; + case File::LockMode::kExclusive: + return F_WRLCK; + } + NOTREACHED(); +#if defined(MOZ_ZUCCHINI) + return F_RDLCK; +#endif // defined(MOZ_ZUCCHINI) +} + +File::Error CallFcntlFlock(PlatformFile file, + absl::optional mode) { + struct flock lock; + lock.l_type = FcntlFlockType(std::move(mode)); + lock.l_whence = SEEK_SET; + lock.l_start = 0; + lock.l_len = 0; // Lock entire file. + if (HANDLE_EINTR(fcntl(file, F_SETLK, &lock)) == -1) + return File::GetLastFileError(); + return File::FILE_OK; +} +#endif + +#else // BUILDFLAG(IS_NACL) && !BUILDFLAG(IS_AIX) + +bool IsOpenAppend(PlatformFile file) { + // NaCl doesn't implement fcntl. Since NaCl's write conforms to the POSIX + // standard and always appends if the file is opened with O_APPEND, just + // return false here. + return false; +} + +int CallFtruncate(PlatformFile file, int64_t length) { + NOTIMPLEMENTED(); // NaCl doesn't implement ftruncate. + return 0; +} + +int CallFutimes(PlatformFile file, const struct timeval times[2]) { + NOTIMPLEMENTED(); // NaCl doesn't implement futimes. + return 0; +} + +File::Error CallFcntlFlock(PlatformFile file, + absl::optional mode) { + NOTIMPLEMENTED(); // NaCl doesn't implement flock struct. + return File::FILE_ERROR_INVALID_OPERATION; +} +#endif // BUILDFLAG(IS_NACL) + +} // namespace + +void File::Info::FromStat(const stat_wrapper_t& stat_info) { + is_directory = S_ISDIR(stat_info.st_mode); + is_symbolic_link = S_ISLNK(stat_info.st_mode); + size = stat_info.st_size; + + // Get last modification time, last access time, and creation time from + // |stat_info|. + // Note: st_ctime is actually last status change time when the inode was last + // updated, which happens on any metadata change. It is not the file's + // creation time. However, other than on Mac & iOS where the actual file + // creation time is included as st_birthtime, the rest of POSIX platforms have + // no portable way to get the creation time. +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA) + time_t last_modified_sec = stat_info.st_mtim.tv_sec; + int64_t last_modified_nsec = stat_info.st_mtim.tv_nsec; + time_t last_accessed_sec = stat_info.st_atim.tv_sec; + int64_t last_accessed_nsec = stat_info.st_atim.tv_nsec; + time_t creation_time_sec = stat_info.st_ctim.tv_sec; + int64_t creation_time_nsec = stat_info.st_ctim.tv_nsec; +#elif BUILDFLAG(IS_ANDROID) + time_t last_modified_sec = stat_info.st_mtime; + int64_t last_modified_nsec = stat_info.st_mtime_nsec; + time_t last_accessed_sec = stat_info.st_atime; + int64_t last_accessed_nsec = stat_info.st_atime_nsec; + time_t creation_time_sec = stat_info.st_ctime; + int64_t creation_time_nsec = stat_info.st_ctime_nsec; +#elif BUILDFLAG(IS_APPLE) + time_t last_modified_sec = stat_info.st_mtimespec.tv_sec; + int64_t last_modified_nsec = stat_info.st_mtimespec.tv_nsec; + time_t last_accessed_sec = stat_info.st_atimespec.tv_sec; + int64_t last_accessed_nsec = stat_info.st_atimespec.tv_nsec; + time_t creation_time_sec = stat_info.st_birthtimespec.tv_sec; + int64_t creation_time_nsec = stat_info.st_birthtimespec.tv_nsec; +#elif BUILDFLAG(IS_BSD) + time_t last_modified_sec = stat_info.st_mtimespec.tv_sec; + int64_t last_modified_nsec = stat_info.st_mtimespec.tv_nsec; + time_t last_accessed_sec = stat_info.st_atimespec.tv_sec; + int64_t last_accessed_nsec = stat_info.st_atimespec.tv_nsec; + time_t creation_time_sec = stat_info.st_ctimespec.tv_sec; + int64_t creation_time_nsec = stat_info.st_ctimespec.tv_nsec; +#else + time_t last_modified_sec = stat_info.st_mtime; + int64_t last_modified_nsec = 0; + time_t last_accessed_sec = stat_info.st_atime; + int64_t last_accessed_nsec = 0; + time_t creation_time_sec = stat_info.st_ctime; + int64_t creation_time_nsec = 0; +#endif + + last_modified = + Time::FromTimeT(last_modified_sec) + + Microseconds(last_modified_nsec / Time::kNanosecondsPerMicrosecond); + + last_accessed = + Time::FromTimeT(last_accessed_sec) + + Microseconds(last_accessed_nsec / Time::kNanosecondsPerMicrosecond); + + creation_time = + Time::FromTimeT(creation_time_sec) + + Microseconds(creation_time_nsec / Time::kNanosecondsPerMicrosecond); +} + +bool File::IsValid() const { + return file_.is_valid(); +} + +PlatformFile File::GetPlatformFile() const { + return file_.get(); +} + +PlatformFile File::TakePlatformFile() { + return file_.release(); +} + +void File::Close() { + if (!IsValid()) + return; + + SCOPED_FILE_TRACE("Close"); + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + file_.reset(); +} + +int64_t File::Seek(Whence whence, int64_t offset) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + + SCOPED_FILE_TRACE_WITH_SIZE("Seek", offset); + +#if BUILDFLAG(IS_ANDROID) + static_assert(sizeof(int64_t) == sizeof(off64_t), "off64_t must be 64 bits"); + return lseek64(file_.get(), static_cast(offset), + static_cast(whence)); +#else + static_assert(sizeof(int64_t) == sizeof(off_t), "off_t must be 64 bits"); + return lseek(file_.get(), static_cast(offset), + static_cast(whence)); +#endif +} + +int File::Read(int64_t offset, char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + if (size < 0 || !IsValueInRangeForNumericType(offset + size - 1)) + return -1; + + SCOPED_FILE_TRACE_WITH_SIZE("Read", size); + + int bytes_read = 0; + long rv; + do { + rv = HANDLE_EINTR(pread(file_.get(), data + bytes_read, + static_cast(size - bytes_read), + static_cast(offset + bytes_read))); + if (rv <= 0) + break; + + bytes_read += rv; + } while (bytes_read < size); + + return bytes_read ? bytes_read : checked_cast(rv); +} + +int File::ReadAtCurrentPos(char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + if (size < 0) + return -1; + + SCOPED_FILE_TRACE_WITH_SIZE("ReadAtCurrentPos", size); + + int bytes_read = 0; + long rv; + do { + rv = HANDLE_EINTR(read(file_.get(), data + bytes_read, + static_cast(size - bytes_read))); + if (rv <= 0) + break; + + bytes_read += rv; + } while (bytes_read < size); + + return bytes_read ? bytes_read : checked_cast(rv); +} + +int File::ReadNoBestEffort(int64_t offset, char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + if (size < 0 || !IsValueInRangeForNumericType(offset)) + return -1; + + SCOPED_FILE_TRACE_WITH_SIZE("ReadNoBestEffort", size); + return checked_cast( + HANDLE_EINTR(pread(file_.get(), data, static_cast(size), + static_cast(offset)))); +} + +int File::ReadAtCurrentPosNoBestEffort(char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + if (size < 0) + return -1; + + SCOPED_FILE_TRACE_WITH_SIZE("ReadAtCurrentPosNoBestEffort", size); + return checked_cast( + HANDLE_EINTR(read(file_.get(), data, static_cast(size)))); +} + +int File::Write(int64_t offset, const char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + if (IsOpenAppend(file_.get())) + return WriteAtCurrentPos(data, size); + + DCHECK(IsValid()); + if (size < 0) + return -1; + + SCOPED_FILE_TRACE_WITH_SIZE("Write", size); + + int bytes_written = 0; + long rv; + do { +#if BUILDFLAG(IS_ANDROID) + // In case __USE_FILE_OFFSET64 is not used, we need to call pwrite64() + // instead of pwrite(). + static_assert(sizeof(int64_t) == sizeof(off64_t), + "off64_t must be 64 bits"); + rv = HANDLE_EINTR(pwrite64(file_.get(), data + bytes_written, + static_cast(size - bytes_written), + offset + bytes_written)); +#else + rv = HANDLE_EINTR(pwrite(file_.get(), data + bytes_written, + static_cast(size - bytes_written), + offset + bytes_written)); +#endif + if (rv <= 0) + break; + + bytes_written += rv; + } while (bytes_written < size); + + return bytes_written ? bytes_written : checked_cast(rv); +} + +int File::WriteAtCurrentPos(const char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + if (size < 0) + return -1; + + SCOPED_FILE_TRACE_WITH_SIZE("WriteAtCurrentPos", size); + + int bytes_written = 0; + long rv; + do { + rv = HANDLE_EINTR(write(file_.get(), data + bytes_written, + static_cast(size - bytes_written))); + if (rv <= 0) + break; + + bytes_written += rv; + } while (bytes_written < size); + + return bytes_written ? bytes_written : checked_cast(rv); +} + +int File::WriteAtCurrentPosNoBestEffort(const char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + if (size < 0) + return -1; + + SCOPED_FILE_TRACE_WITH_SIZE("WriteAtCurrentPosNoBestEffort", size); + return checked_cast( + HANDLE_EINTR(write(file_.get(), data, static_cast(size)))); +} + +int64_t File::GetLength() { + DCHECK(IsValid()); + + SCOPED_FILE_TRACE("GetLength"); + + stat_wrapper_t file_info; + if (Fstat(file_.get(), &file_info)) + return -1; + + return file_info.st_size; +} + +bool File::SetLength(int64_t length) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + + SCOPED_FILE_TRACE_WITH_SIZE("SetLength", length); + return !CallFtruncate(file_.get(), length); +} + +#if !defined(MOZ_ZUCCHINI) +bool File::SetTimes(Time last_access_time, Time last_modified_time) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + + SCOPED_FILE_TRACE("SetTimes"); + + timeval times[2]; + times[0] = last_access_time.ToTimeVal(); + times[1] = last_modified_time.ToTimeVal(); + + return !CallFutimes(file_.get(), times); +} +#endif // !defined(MOZ_ZUCCHINI) + +bool File::GetInfo(Info* info) { + DCHECK(IsValid()); + + SCOPED_FILE_TRACE("GetInfo"); + + stat_wrapper_t file_info; + if (Fstat(file_.get(), &file_info)) + return false; + + info->FromStat(file_info); + return true; +} + +#if !BUILDFLAG(IS_FUCHSIA) +File::Error File::Lock(File::LockMode mode) { + SCOPED_FILE_TRACE("Lock"); + return CallFcntlFlock(file_.get(), mode); +} + +File::Error File::Unlock() { + SCOPED_FILE_TRACE("Unlock"); + return CallFcntlFlock(file_.get(), absl::optional()); +} +#endif + +File File::Duplicate() const { + if (!IsValid()) + return File(); + + SCOPED_FILE_TRACE("Duplicate"); + + ScopedPlatformFile other_fd(HANDLE_EINTR(dup(GetPlatformFile()))); + if (!other_fd.is_valid()) + return File(File::GetLastFileError()); + + return File(std::move(other_fd), async()); +} + +// Static. +File::Error File::OSErrorToFileError(int saved_errno) { + switch (saved_errno) { + case EACCES: + case EISDIR: + case EROFS: + case EPERM: + return FILE_ERROR_ACCESS_DENIED; + case EBUSY: +#if !BUILDFLAG(IS_NACL) // ETXTBSY not defined by NaCl. + case ETXTBSY: +#endif + return FILE_ERROR_IN_USE; + case EEXIST: + return FILE_ERROR_EXISTS; + case EIO: + return FILE_ERROR_IO; + case ENOENT: + return FILE_ERROR_NOT_FOUND; + case ENFILE: // fallthrough + case EMFILE: + return FILE_ERROR_TOO_MANY_OPENED; + case ENOMEM: + return FILE_ERROR_NO_MEMORY; + case ENOSPC: + return FILE_ERROR_NO_SPACE; + case ENOTDIR: + return FILE_ERROR_NOT_A_DIRECTORY; + default: + // This function should only be called for errors. + DCHECK_NE(0, saved_errno); + return FILE_ERROR_FAILED; + } +} + +// NaCl doesn't implement system calls to open files directly. +#if !BUILDFLAG(IS_NACL) +// TODO(erikkay): does it make sense to support FLAG_EXCLUSIVE_* here? +void File::DoInitialize(const FilePath& path, uint32_t flags) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(!IsValid()); + + int open_flags = 0; + if (flags & FLAG_CREATE) + open_flags = O_CREAT | O_EXCL; + + created_ = false; + + if (flags & FLAG_CREATE_ALWAYS) { + DCHECK(!open_flags); + DCHECK(flags & FLAG_WRITE); + open_flags = O_CREAT | O_TRUNC; + } + + if (flags & FLAG_OPEN_TRUNCATED) { + DCHECK(!open_flags); + DCHECK(flags & FLAG_WRITE); + open_flags = O_TRUNC; + } + + if (!open_flags && !(flags & FLAG_OPEN) && !(flags & FLAG_OPEN_ALWAYS)) { + NOTREACHED(); + errno = EOPNOTSUPP; + error_details_ = FILE_ERROR_FAILED; + return; + } + + if (flags & FLAG_WRITE && flags & FLAG_READ) { + open_flags |= O_RDWR; + } else if (flags & FLAG_WRITE) { + open_flags |= O_WRONLY; + } else if (!(flags & FLAG_READ) && !(flags & FLAG_WRITE_ATTRIBUTES) && + !(flags & FLAG_APPEND) && !(flags & FLAG_OPEN_ALWAYS)) { + // Note: For FLAG_WRITE_ATTRIBUTES and no other read/write flags, we'll + // open the file in O_RDONLY mode (== 0, see static_assert below), so that + // we get a fd that can be used for SetTimes(). + NOTREACHED(); + } + + if (flags & FLAG_TERMINAL_DEVICE) + open_flags |= O_NOCTTY | O_NDELAY; + + if (flags & FLAG_APPEND && flags & FLAG_READ) + open_flags |= O_APPEND | O_RDWR; + else if (flags & FLAG_APPEND) + open_flags |= O_APPEND | O_WRONLY; + + static_assert(O_RDONLY == 0, "O_RDONLY must equal zero"); + + mode_t mode = S_IRUSR | S_IWUSR; +#if BUILDFLAG(IS_CHROMEOS) + mode |= S_IRGRP | S_IROTH; +#endif + + int descriptor = HANDLE_EINTR(open(path.value().c_str(), open_flags, mode)); + + if (flags & FLAG_OPEN_ALWAYS) { + if (descriptor < 0) { + open_flags |= O_CREAT; + descriptor = HANDLE_EINTR(open(path.value().c_str(), open_flags, mode)); + if (descriptor >= 0) + created_ = true; + } + } + + if (descriptor < 0) { + error_details_ = File::GetLastFileError(); + return; + } + + if (flags & (FLAG_CREATE_ALWAYS | FLAG_CREATE)) + created_ = true; + + if (flags & FLAG_DELETE_ON_CLOSE) + unlink(path.value().c_str()); + + async_ = ((flags & FLAG_ASYNC) == FLAG_ASYNC); + error_details_ = FILE_OK; + file_.reset(descriptor); +} +#endif // !BUILDFLAG(IS_NACL) + +bool File::Flush() { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + SCOPED_FILE_TRACE("Flush"); + +#if BUILDFLAG(IS_NACL) + NOTIMPLEMENTED(); // NaCl doesn't implement fsync. + return true; +#elif BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_CHROMEOS) || \ + BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_LINUX) + return !HANDLE_EINTR(fdatasync(file_.get())); +#elif BUILDFLAG(IS_APPLE) + // On macOS and iOS, fsync() is guaranteed to send the file's data to the + // underlying storage device, but may return before the device actually writes + // the data to the medium. When used by database systems, this may result in + // unexpected data loss. + // https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man2/fsync.2.html + if (!HANDLE_EINTR(fcntl(file_.get(), F_FULLFSYNC))) + return true; + + // Some filesystms do not support fcntl(F_FULLFSYNC). We handle these cases by + // falling back to fsync(). Unfortunately, lack of F_FULLFSYNC support results + // in various error codes, so we cannot use the error code as a definitive + // indicator that F_FULLFSYNC was not supported. So, if fcntl() errors out for + // any reason, we may end up making an unnecessary system call. + // + // See the CL description at https://crrev.com/c/1400159 for details. + return !HANDLE_EINTR(fsync(file_.get())); +#else + return !HANDLE_EINTR(fsync(file_.get())); +#endif +} + +void File::SetPlatformFile(PlatformFile file) { + DCHECK(!file_.is_valid()); + file_.reset(file); +} + +// static +File::Error File::GetLastFileError() { + return base::File::OSErrorToFileError(errno); +} + +int File::Stat(const char* path, stat_wrapper_t* sb) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + return stat(path, sb); +} +int File::Fstat(int fd, stat_wrapper_t* sb) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + return fstat(fd, sb); +} +int File::Lstat(const char* path, stat_wrapper_t* sb) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + return lstat(path, sb); +} + +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_tracing.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_tracing.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_tracing.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_tracing.cc 2025-12-01 18:15:49.000000000 +0000 @@ -0,0 +1,63 @@ +// Copyright 2015 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file_tracing.h" + +#include + +#include "base/files/file.h" +#include "base/trace_event/base_tracing.h" + +namespace base { + +namespace { +std::atomic g_provider; +} + +FileTracing::Provider* GetProvider() { + return g_provider.load(std::memory_order_acquire); +} + +// static +bool FileTracing::IsCategoryEnabled() { + FileTracing::Provider* provider = GetProvider(); + return provider && provider->FileTracingCategoryIsEnabled(); +} + +// static +void FileTracing::SetProvider(FileTracing::Provider* provider) { + g_provider.store(provider, std::memory_order_release); +} + +FileTracing::ScopedEnabler::ScopedEnabler() { + FileTracing::Provider* provider = GetProvider(); + if (provider) + provider->FileTracingEnable(this); +} + +FileTracing::ScopedEnabler::~ScopedEnabler() { + FileTracing::Provider* provider = GetProvider(); + if (provider) + provider->FileTracingDisable(this); + // TODO(crbug.com/1021571): Remove this once fixed. + PERFETTO_INTERNAL_ADD_EMPTY_EVENT(); +} + +FileTracing::ScopedTrace::~ScopedTrace() { + if (id_) { + FileTracing::Provider* provider = GetProvider(); + if (provider) + provider->FileTracingEventEnd(name_, id_); + } +} + +void FileTracing::ScopedTrace::Initialize(const char* name, + const File* file, + int64_t size) { + id_ = &file->trace_enabler_; + name_ = name; + GetProvider()->FileTracingEventBegin(name_, id_, file->tracing_path_, size); +} + +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_tracing.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_tracing.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_tracing.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_tracing.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,96 @@ +// Copyright 2015 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_FILES_FILE_TRACING_H_ +#define BASE_FILES_FILE_TRACING_H_ + +#include + +#include "base/base_export.h" +#include "base/memory/raw_ptr.h" + +#define FILE_TRACING_PREFIX "File" + +#define SCOPED_FILE_TRACE_WITH_SIZE(name, size) \ + FileTracing::ScopedTrace scoped_file_trace; \ + if (FileTracing::IsCategoryEnabled()) \ + scoped_file_trace.Initialize(FILE_TRACING_PREFIX "::" name, this, size) + +#define SCOPED_FILE_TRACE(name) SCOPED_FILE_TRACE_WITH_SIZE(name, 0) + +namespace base { + +class File; +class FilePath; + +class BASE_EXPORT FileTracing { + public: + // Whether the file tracing category is enabled. + static bool IsCategoryEnabled(); + + class Provider { + public: + virtual ~Provider() = default; + + // Whether the file tracing category is currently enabled. + virtual bool FileTracingCategoryIsEnabled() const = 0; + + // Enables file tracing for |id|. Must be called before recording events. + virtual void FileTracingEnable(const void* id) = 0; + + // Disables file tracing for |id|. + virtual void FileTracingDisable(const void* id) = 0; + + // Begins an event for |id| with |name|. |path| tells where in the directory + // structure the event is happening (and may be blank). |size| is the number + // of bytes involved in the event. + virtual void FileTracingEventBegin(const char* name, + const void* id, + const FilePath& path, + int64_t size) = 0; + + // Ends an event for |id| with |name|. + virtual void FileTracingEventEnd(const char* name, const void* id) = 0; + }; + + // Sets a global file tracing provider to query categories and record events. + static void SetProvider(Provider* provider); + + // Enables file tracing while in scope. + class ScopedEnabler { + public: + ScopedEnabler(); + ~ScopedEnabler(); + }; + + class ScopedTrace { + public: + ScopedTrace() = default; + ScopedTrace(const ScopedTrace&) = delete; + ScopedTrace& operator=(const ScopedTrace&) = delete; + ~ScopedTrace(); + + // Called only if the tracing category is enabled. |name| is the name of the + // event to trace (e.g. "Read", "Write") and must have an application + // lifetime (e.g. static or literal). |file| is the file being traced; must + // outlive this class. |size| is the size (in bytes) of this event. + void Initialize(const char* name, const File* file, int64_t size); + + private: + // The ID of this trace. Based on the |file| passed to |Initialize()|. Must + // outlive this class. + raw_ptr id_ = nullptr; + + // The name of the event to trace (e.g. "Read", "Write"). Prefixed with + // "File". + const char* name_; + }; + + FileTracing(const FileTracing&) = delete; + FileTracing& operator=(const FileTracing&) = delete; +}; + +} // namespace base + +#endif // BASE_FILES_FILE_TRACING_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_util.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_util.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_util.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_util.cc 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,533 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file_util.h" + +#if !defined(MOZ_ZUCCHINI) +#include "base/task/sequenced_task_runner.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "build/build_config.h" + +#if BUILDFLAG(IS_WIN) +#include +#endif +#include + +#include +#include +#include +#include +#include + +#if !defined(MOZ_ZUCCHINI) +#include "base/bit_cast.h" +#include "base/check_op.h" +#include "base/containers/span.h" +#include "base/files/file_enumerator.h" +#include "base/files/file_path.h" +#include "base/functional/function_ref.h" +#include "base/notreached.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/posix/eintr_wrapper.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/strings/string_piece.h" +#include "base/strings/string_util.h" +#include "base/strings/stringprintf.h" +#include "base/strings/utf_string_conversions.h" +#include "base/task/bind_post_task.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/threading/scoped_blocking_call.h" + +#if BUILDFLAG(IS_WIN) +#include +#endif + +namespace base { + +namespace { + +#if !defined(MOZ_ZUCCHINI) +#if !BUILDFLAG(IS_WIN) + +void RunAndReply(OnceCallback action_callback, + OnceCallback reply_callback) { + bool result = std::move(action_callback).Run(); + if (!reply_callback.is_null()) + std::move(reply_callback).Run(result); +} + +#endif // !BUILDFLAG(IS_WIN) +#endif // !defined(MOZ_ZUCCHINI) + +bool ReadStreamToSpanWithMaxSize( + FILE* stream, + size_t max_size, + FunctionRef(size_t)> resize_span) { + if (!stream) { + return false; + } + + // Seeking to the beginning is best-effort -- it is expected to fail for + // certain non-file stream (e.g., pipes). + HANDLE_EINTR(fseek(stream, 0, SEEK_SET)); + + // Many files have incorrect size (proc files etc). Hence, the file is read + // sequentially as opposed to a one-shot read, using file size as a hint for + // chunk size if available. + constexpr size_t kDefaultChunkSize = 1 << 16; + size_t chunk_size = kDefaultChunkSize - 1; + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); +#if BUILDFLAG(IS_WIN) + BY_HANDLE_FILE_INFORMATION file_info = {}; + if (::GetFileInformationByHandle( + reinterpret_cast(_get_osfhandle(_fileno(stream))), + &file_info)) { + LARGE_INTEGER size; + size.HighPart = static_cast(file_info.nFileSizeHigh); + size.LowPart = file_info.nFileSizeLow; + if (size.QuadPart > 0) + chunk_size = static_cast(size.QuadPart); + } +#else // BUILDFLAG(IS_WIN) + // In cases where the reported file size is 0, use a smaller chunk size to + // minimize memory allocated and cost of string::resize() in case the read + // size is small (i.e. proc files). If the file is larger than this, the read + // loop will reset |chunk_size| to kDefaultChunkSize. + constexpr size_t kSmallChunkSize = 4096; + chunk_size = kSmallChunkSize - 1; + stat_wrapper_t file_info = {}; + if (!File::Fstat(fileno(stream), &file_info) && file_info.st_size > 0) + chunk_size = static_cast(file_info.st_size); +#endif // BUILDFLAG(IS_WIN) + + // We need to attempt to read at EOF for feof flag to be set so here we use + // |chunk_size| + 1. + chunk_size = std::min(chunk_size, max_size) + 1; + size_t bytes_read_this_pass; + size_t bytes_read_so_far = 0; + bool read_status = true; + span bytes_span = resize_span(chunk_size); + DCHECK_EQ(bytes_span.size(), chunk_size); + + while ((bytes_read_this_pass = fread(bytes_span.data() + bytes_read_so_far, 1, + chunk_size, stream)) > 0) { + if ((max_size - bytes_read_so_far) < bytes_read_this_pass) { + // Read more than max_size bytes, bail out. + bytes_read_so_far = max_size; + read_status = false; + break; + } + // In case EOF was not reached, iterate again but revert to the default + // chunk size. + if (bytes_read_so_far == 0) + chunk_size = kDefaultChunkSize; + + bytes_read_so_far += bytes_read_this_pass; + // Last fread syscall (after EOF) can be avoided via feof, which is just a + // flag check. + if (feof(stream)) + break; + bytes_span = resize_span(bytes_read_so_far + chunk_size); + DCHECK_EQ(bytes_span.size(), bytes_read_so_far + chunk_size); + } + read_status = read_status && !ferror(stream); + + // Trim the container down to the number of bytes that were actually read. + bytes_span = resize_span(bytes_read_so_far); + DCHECK_EQ(bytes_span.size(), bytes_read_so_far); + + return read_status; +} + +} // namespace + +#if !defined(MOZ_ZUCCHINI) +#if !BUILDFLAG(IS_WIN) + +OnceClosure GetDeleteFileCallback(const FilePath& path, + OnceCallback reply_callback) { + return BindOnce(&RunAndReply, BindOnce(&DeleteFile, path), + reply_callback.is_null() + ? std::move(reply_callback) + : BindPostTask(SequencedTaskRunner::GetCurrentDefault(), + std::move(reply_callback))); +} + +OnceClosure GetDeletePathRecursivelyCallback( + const FilePath& path, + OnceCallback reply_callback) { + return BindOnce(&RunAndReply, BindOnce(&DeletePathRecursively, path), + reply_callback.is_null() + ? std::move(reply_callback) + : BindPostTask(SequencedTaskRunner::GetCurrentDefault(), + std::move(reply_callback))); +} + +#endif // !BUILDFLAG(IS_WIN) + +int64_t ComputeDirectorySize(const FilePath& root_path) { + int64_t running_size = 0; + FileEnumerator file_iter(root_path, true, FileEnumerator::FILES); + while (!file_iter.Next().empty()) + running_size += file_iter.GetInfo().GetSize(); + return running_size; +} + +bool Move(const FilePath& from_path, const FilePath& to_path) { + if (from_path.ReferencesParent() || to_path.ReferencesParent()) + return false; + return internal::MoveUnsafe(from_path, to_path); +} + +bool CopyFileContents(File& infile, File& outfile) { +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) + bool retry_slow = false; + bool res = + internal::CopyFileContentsWithSendfile(infile, outfile, retry_slow); + if (res || !retry_slow) { + return res; + } + // Any failures which allow retrying using read/write will not have modified + // either file offset or size. +#endif + + static constexpr size_t kBufferSize = 32768; + std::vector buffer(kBufferSize); + + for (;;) { + int bytes_read = + infile.ReadAtCurrentPos(buffer.data(), static_cast(buffer.size())); + if (bytes_read < 0) { + return false; + } + if (bytes_read == 0) { + return true; + } + // Allow for partial writes + int bytes_written_per_read = 0; + do { + int bytes_written_partial = outfile.WriteAtCurrentPos( + &buffer[static_cast(bytes_written_per_read)], + bytes_read - bytes_written_per_read); + if (bytes_written_partial < 0) { + return false; + } + + bytes_written_per_read += bytes_written_partial; + } while (bytes_written_per_read < bytes_read); + } + + NOTREACHED(); + return false; +} + +bool ContentsEqual(const FilePath& filename1, const FilePath& filename2) { + // We open the file in binary format even if they are text files because + // we are just comparing that bytes are exactly same in both files and not + // doing anything smart with text formatting. +#if BUILDFLAG(IS_WIN) + std::ifstream file1(filename1.value().c_str(), + std::ios::in | std::ios::binary); + std::ifstream file2(filename2.value().c_str(), + std::ios::in | std::ios::binary); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + std::ifstream file1(filename1.value(), std::ios::in | std::ios::binary); + std::ifstream file2(filename2.value(), std::ios::in | std::ios::binary); +#endif // BUILDFLAG(IS_WIN) + + // Even if both files aren't openable (and thus, in some sense, "equal"), + // any unusable file yields a result of "false". + if (!file1.is_open() || !file2.is_open()) + return false; + + const int BUFFER_SIZE = 2056; + char buffer1[BUFFER_SIZE], buffer2[BUFFER_SIZE]; + do { + file1.read(buffer1, BUFFER_SIZE); + file2.read(buffer2, BUFFER_SIZE); + + if ((file1.eof() != file2.eof()) || + (file1.gcount() != file2.gcount()) || + (memcmp(buffer1, buffer2, static_cast(file1.gcount())))) { + file1.close(); + file2.close(); + return false; + } + } while (!file1.eof() || !file2.eof()); + + file1.close(); + file2.close(); + return true; +} + +bool TextContentsEqual(const FilePath& filename1, const FilePath& filename2) { +#if BUILDFLAG(IS_WIN) + std::ifstream file1(filename1.value().c_str(), std::ios::in); + std::ifstream file2(filename2.value().c_str(), std::ios::in); +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + std::ifstream file1(filename1.value(), std::ios::in); + std::ifstream file2(filename2.value(), std::ios::in); +#endif // BUILDFLAG(IS_WIN) + + // Even if both files aren't openable (and thus, in some sense, "equal"), + // any unusable file yields a result of "false". + if (!file1.is_open() || !file2.is_open()) + return false; + + do { + std::string line1, line2; + getline(file1, line1); + getline(file2, line2); + + // Check for mismatched EOF states, or any error state. + if ((file1.eof() != file2.eof()) || + file1.bad() || file2.bad()) { + return false; + } + + // Trim all '\r' and '\n' characters from the end of the line. + std::string::size_type end1 = line1.find_last_not_of("\r\n"); + if (end1 == std::string::npos) + line1.clear(); + else if (end1 + 1 < line1.length()) + line1.erase(end1 + 1); + + std::string::size_type end2 = line2.find_last_not_of("\r\n"); + if (end2 == std::string::npos) + line2.clear(); + else if (end2 + 1 < line2.length()) + line2.erase(end2 + 1); + + if (line1 != line2) + return false; + } while (!file1.eof() || !file2.eof()); + + return true; +} + +bool ReadStreamToString(FILE* stream, std::string* contents) { + return ReadStreamToStringWithMaxSize( + stream, std::numeric_limits::max(), contents); +} +#endif // !defined(MOZ_ZUCCHINI) + +bool ReadStreamToStringWithMaxSize(FILE* stream, + size_t max_size, + std::string* contents) { + if (contents) { + contents->clear(); + } + + std::string content_string; + bool read_successs = ReadStreamToSpanWithMaxSize( + stream, max_size, [&content_string](size_t size) { + content_string.resize(size); + return as_writable_bytes(make_span(content_string)); + }); + + if (contents) { + contents->swap(content_string); + } + return read_successs; +} + +#if !defined(MOZ_ZUCCHINI) +absl::optional> ReadFileToBytes(const FilePath& path) { + if (path.ReferencesParent()) { + return absl::nullopt; + } + + ScopedFILE file_stream(OpenFile(path, "rb")); + if (!file_stream) { + return absl::nullopt; + } + + std::vector bytes; + if (!ReadStreamToSpanWithMaxSize(file_stream.get(), + std::numeric_limits::max(), + [&bytes](size_t size) { + bytes.resize(size); + return make_span(bytes); + })) { + return absl::nullopt; + } + return bytes; +} +#endif // !defined(MOZ_ZUCCHINI) + +bool ReadFileToString(const FilePath& path, std::string* contents) { + return ReadFileToStringWithMaxSize(path, contents, + std::numeric_limits::max()); +} + +bool ReadFileToStringWithMaxSize(const FilePath& path, + std::string* contents, + size_t max_size) { + if (contents) + contents->clear(); + if (path.ReferencesParent()) + return false; + ScopedFILE file_stream(OpenFile(path, "rb")); + if (!file_stream) + return false; + return ReadStreamToStringWithMaxSize(file_stream.get(), max_size, contents); +} + +#if !defined(MOZ_ZUCCHINI) +bool IsDirectoryEmpty(const FilePath& dir_path) { + FileEnumerator files(dir_path, false, + FileEnumerator::FILES | FileEnumerator::DIRECTORIES); + if (files.Next().empty()) + return true; + return false; +} + +bool CreateTemporaryFile(FilePath* path) { + FilePath temp_dir; + return GetTempDir(&temp_dir) && CreateTemporaryFileInDir(temp_dir, path); +} + +ScopedFILE CreateAndOpenTemporaryStream(FilePath* path) { + FilePath directory; + if (!GetTempDir(&directory)) + return nullptr; + + return CreateAndOpenTemporaryStreamInDir(directory, path); +} +#endif // !defined(MOZ_ZUCCHINI) + +bool CreateDirectory(const FilePath& full_path) { + return CreateDirectoryAndGetError(full_path, nullptr); +} + +#if !defined(MOZ_ZUCCHINI) +bool GetFileSize(const FilePath& file_path, int64_t* file_size) { + File::Info info; + if (!GetFileInfo(file_path, &info)) + return false; + *file_size = info.size; + return true; +} + +bool TouchFile(const FilePath& path, + const Time& last_accessed, + const Time& last_modified) { + uint32_t flags = File::FLAG_OPEN | File::FLAG_WRITE_ATTRIBUTES; + +#if BUILDFLAG(IS_WIN) + // On Windows, FILE_FLAG_BACKUP_SEMANTICS is needed to open a directory. + if (DirectoryExists(path)) + flags |= File::FLAG_WIN_BACKUP_SEMANTICS; +#elif BUILDFLAG(IS_FUCHSIA) + // On Fuchsia, we need O_RDONLY for directories, or O_WRONLY for files. + // TODO(https://crbug.com/947802): Find a cleaner workaround for this. + flags |= (DirectoryExists(path) ? File::FLAG_READ : File::FLAG_WRITE); +#endif + + File file(path, flags); + if (!file.IsValid()) + return false; + + return file.SetTimes(last_accessed, last_modified); +} + +bool CloseFile(FILE* file) { + if (file == nullptr) + return true; + return fclose(file) == 0; +} + +bool TruncateFile(FILE* file) { + if (file == nullptr) + return false; + long current_offset = ftell(file); + if (current_offset == -1) + return false; +#if BUILDFLAG(IS_WIN) + int fd = _fileno(file); + if (_chsize(fd, current_offset) != 0) + return false; +#else + int fd = fileno(file); + if (ftruncate(fd, current_offset) != 0) + return false; +#endif + return true; +} + +bool WriteFile(const FilePath& filename, span data) { + int size = checked_cast(data.size()); + return WriteFile(filename, reinterpret_cast(data.data()), + size) == size; +} + +bool WriteFile(const FilePath& filename, StringPiece data) { + int size = checked_cast(data.size()); + return WriteFile(filename, data.data(), size) == size; +} + +int GetUniquePathNumber(const FilePath& path) { + DCHECK(!path.empty()); + if (!PathExists(path)) + return 0; + + std::string number; + for (int count = 1; count <= kMaxUniqueFiles; ++count) { + StringAppendF(&number, " (%d)", count); + if (!PathExists(path.InsertBeforeExtensionASCII(number))) + return count; + number.clear(); + } + + return -1; +} + +FilePath GetUniquePath(const FilePath& path) { + DCHECK(!path.empty()); + const int uniquifier = GetUniquePathNumber(path); + if (uniquifier > 0) + return path.InsertBeforeExtensionASCII(StringPrintf(" (%d)", uniquifier)); + return uniquifier == 0 ? path : FilePath(); +} + +namespace internal { + +bool PreReadFileSlow(const FilePath& file_path, int64_t max_bytes) { + DCHECK_GE(max_bytes, 0); + + File file(file_path, File::FLAG_OPEN | File::FLAG_READ | + File::FLAG_WIN_SEQUENTIAL_SCAN | + File::FLAG_WIN_SHARE_DELETE); + if (!file.IsValid()) + return false; + + constexpr int kBufferSize = 1024 * 1024; + // Ensures the buffer is deallocated at function exit. + std::unique_ptr buffer_deleter(new char[kBufferSize]); + char* const buffer = buffer_deleter.get(); + + while (max_bytes > 0) { + // The static_cast is safe because kBufferSize is int, and both values + // are non-negative. So, the minimum is guaranteed to fit in int. + const int read_size = + static_cast(std::min(max_bytes, kBufferSize)); + DCHECK_GE(read_size, 0); + DCHECK_LE(read_size, kBufferSize); + + const int read_bytes = file.ReadAtCurrentPos(buffer, read_size); + if (read_bytes < 0) + return false; + if (read_bytes == 0) + break; + + max_bytes -= read_bytes; + } + + return true; +} + +} // namespace internal +#endif // !defined(MOZ_ZUCCHINI) + +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_util.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_util.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_util.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_util.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,724 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This file contains utility functions for dealing with the local +// filesystem. + +#ifndef BASE_FILES_FILE_UTIL_H_ +#define BASE_FILES_FILE_UTIL_H_ + +#include +#include +#include + +#include +#include +#include + +#include "base/base_export.h" +#include "base/containers/span.h" +#include "base/files/file.h" +#include "base/files/file_path.h" +#include "base/files/scoped_file.h" +#include "base/functional/callback.h" +#include "build/build_config.h" +#include "third_party/abseil-cpp/absl/types/optional.h" + +#if BUILDFLAG(IS_WIN) +#include "base/win/windows_types.h" +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +#include +#include +#include "base/posix/eintr_wrapper.h" +#endif + +namespace base { + +class Environment; +class Time; + +//----------------------------------------------------------------------------- +// Functions that involve filesystem access or modification: + +// Returns an absolute version of a relative path. Returns an empty path on +// error. This function can result in I/O so it can be slow. +// +// On POSIX, this function calls realpath(), so: +// 1) it fails if the path does not exist. +// 2) it expands all symlink components of the path. +// 3) it removes "." and ".." directory components. +BASE_EXPORT FilePath MakeAbsoluteFilePath(const FilePath& input); + +#if BUILDFLAG(IS_POSIX) +// Prepends the current working directory if `input` is not already absolute, +// and removes "/./" and "/../" This is similar to MakeAbsoluteFilePath(), but +// MakeAbsoluteFilePath() expands all symlinks in the path and this does not. +// +// This may block if `input` is a relative path, when calling +// GetCurrentDirectory(). +// +// This doesn't return absl::nullopt unless (1) `input` is empty, or (2) +// `input` is a relative path and GetCurrentDirectory() fails. +[[nodiscard]] BASE_EXPORT absl::optional +MakeAbsoluteFilePathNoResolveSymbolicLinks(const FilePath& input); +#endif + +// Returns the total number of bytes used by all the files under |root_path|. +// If the path does not exist the function returns 0. +// +// This function is implemented using the FileEnumerator class so it is not +// particularly speedy on any platform. +BASE_EXPORT int64_t ComputeDirectorySize(const FilePath& root_path); + +// Deletes the given path, whether it's a file or a directory. +// If it's a directory, it's perfectly happy to delete all of the directory's +// contents, but it will not recursively delete subdirectories and their +// contents. +// Returns true if successful, false otherwise. It is considered successful to +// attempt to delete a file that does not exist. +// +// In POSIX environment and if |path| is a symbolic link, this deletes only +// the symlink. (even if the symlink points to a non-existent file) +BASE_EXPORT bool DeleteFile(const FilePath& path); + +// Deletes the given path, whether it's a file or a directory. +// If it's a directory, it's perfectly happy to delete all of the +// directory's contents, including subdirectories and their contents. +// Returns true if successful, false otherwise. It is considered successful +// to attempt to delete a file that does not exist. +// +// In POSIX environment and if |path| is a symbolic link, this deletes only +// the symlink. (even if the symlink points to a non-existent file) +// +// WARNING: USING THIS EQUIVALENT TO "rm -rf", SO USE WITH CAUTION. +BASE_EXPORT bool DeletePathRecursively(const FilePath& path); + +// Returns a closure that, when run on any sequence that allows blocking calls, +// will kick off a potentially asynchronous operation to delete `path`, whose +// behavior is similar to `DeleteFile()` and `DeletePathRecursively()` +// respectively. +// +// In contrast to `DeleteFile()` and `DeletePathRecursively()`, the thread pool +// may be used in case retries are needed. On Windows, in particular, retries +// will be attempted for some time to allow other programs (e.g., anti-virus +// scanners or malware) to close any open handles to `path` or its contents. If +// `reply_callback` is not null, it will be posted to the caller's sequence with +// true if `path` was fully deleted or false otherwise. +// +// WARNING: It is NOT safe to use `path` until `reply_callback` is run, as the +// retry task may still be actively trying to delete it. +BASE_EXPORT OnceClosure +GetDeleteFileCallback(const FilePath& path, + OnceCallback reply_callback = {}); +BASE_EXPORT OnceClosure +GetDeletePathRecursivelyCallback(const FilePath& path, + OnceCallback reply_callback = {}); + +#if BUILDFLAG(IS_WIN) +// Schedules to delete the given path, whether it's a file or a directory, until +// the operating system is restarted. +// Note: +// 1) The file/directory to be deleted should exist in a temp folder. +// 2) The directory to be deleted must be empty. +BASE_EXPORT bool DeleteFileAfterReboot(const FilePath& path); + +// Prevents opening the file at `path` with EXECUTE access by adding a deny ACE +// on the filesystem. This allows the file handle to be safely passed to an +// untrusted process. See also `File::FLAG_WIN_NO_EXECUTE`. +BASE_EXPORT bool PreventExecuteMapping(const FilePath& path); + +// Set `path_key` to the second of two valid paths that support safely marking a +// file as non-execute. The first allowed path is always PATH_TEMP. This is +// needed to avoid layering violations, as the user data dir is an embedder +// concept and only known later at runtime. +BASE_EXPORT void SetExtraNoExecuteAllowedPath(int path_key); +#endif // BUILDFLAG(IS_WIN) + +// Moves the given path, whether it's a file or a directory. +// If a simple rename is not possible, such as in the case where the paths are +// on different volumes, this will attempt to copy and delete. Returns +// true for success. +// This function fails if either path contains traversal components ('..'). +BASE_EXPORT bool Move(const FilePath& from_path, const FilePath& to_path); + +// Renames file |from_path| to |to_path|. Both paths must be on the same +// volume, or the function will fail. Destination file will be created +// if it doesn't exist. Prefer this function over Move when dealing with +// temporary files. On Windows it preserves attributes of the target file. +// Returns true on success, leaving *error unchanged. +// Returns false on failure and sets *error appropriately, if it is non-NULL. +BASE_EXPORT bool ReplaceFile(const FilePath& from_path, + const FilePath& to_path, + File::Error* error); + +// Copies a single file. Use CopyDirectory() to copy directories. +// This function fails if either path contains traversal components ('..'). +// This function also fails if |to_path| is a directory. +// +// On POSIX, if |to_path| is a symlink, CopyFile() will follow the symlink. This +// may have security implications. Use with care. +// +// If |to_path| already exists and is a regular file, it will be overwritten, +// though its permissions will stay the same. +// +// If |to_path| does not exist, it will be created. The new file's permissions +// varies per platform: +// +// - This function keeps the metadata on Windows. The read only bit is not kept. +// - On Mac and iOS, |to_path| retains |from_path|'s permissions, except user +// read/write permissions are always set. +// - On Linux and Android, |to_path| has user read/write permissions only. i.e. +// Always 0600. +// - On ChromeOS, |to_path| has user read/write permissions and group/others +// read permissions. i.e. Always 0644. +BASE_EXPORT bool CopyFile(const FilePath& from_path, const FilePath& to_path); + +// Copies the contents of one file into another. +// The files are taken as is: the copy is done starting from the current offset +// of |infile| until the end of |infile| is reached, into the current offset of +// |outfile|. +BASE_EXPORT bool CopyFileContents(File& infile, File& outfile); + +// Copies the given path, and optionally all subdirectories and their contents +// as well. +// +// If there are files existing under to_path, always overwrite. Returns true +// if successful, false otherwise. Wildcards on the names are not supported. +// +// This function has the same metadata behavior as CopyFile(). +// +// If you only need to copy a file use CopyFile, it's faster. +BASE_EXPORT bool CopyDirectory(const FilePath& from_path, + const FilePath& to_path, + bool recursive); + +// Like CopyDirectory() except trying to overwrite an existing file will not +// work and will return false. +BASE_EXPORT bool CopyDirectoryExcl(const FilePath& from_path, + const FilePath& to_path, + bool recursive); + +// Returns true if the given path exists on the local filesystem, +// false otherwise. +BASE_EXPORT bool PathExists(const FilePath& path); + +// Returns true if the given path is readable by the user, false otherwise. +BASE_EXPORT bool PathIsReadable(const FilePath& path); + +// Returns true if the given path is writable by the user, false otherwise. +BASE_EXPORT bool PathIsWritable(const FilePath& path); + +// Returns true if the given path exists and is a directory, false otherwise. +BASE_EXPORT bool DirectoryExists(const FilePath& path); + +// Returns true if the contents of the two files given are equal, false +// otherwise. If either file can't be read, returns false. +BASE_EXPORT bool ContentsEqual(const FilePath& filename1, + const FilePath& filename2); + +// Returns true if the contents of the two text files given are equal, false +// otherwise. This routine treats "\r\n" and "\n" as equivalent. +BASE_EXPORT bool TextContentsEqual(const FilePath& filename1, + const FilePath& filename2); + +// Reads the file at |path| and returns a vector of bytes on success, and +// nullopt on error. For security reasons, a |path| containing path traversal +// components ('..') is treated as a read error, returning nullopt. +BASE_EXPORT absl::optional> ReadFileToBytes( + const FilePath& path); + +// Reads the file at |path| into |contents| and returns true on success and +// false on error. For security reasons, a |path| containing path traversal +// components ('..') is treated as a read error and |contents| is set to empty. +// In case of I/O error, |contents| holds the data that could be read from the +// file before the error occurred. +// |contents| may be NULL, in which case this function is useful for its side +// effect of priming the disk cache (could be used for unit tests). +BASE_EXPORT bool ReadFileToString(const FilePath& path, std::string* contents); + +// Reads the file at |path| into |contents| and returns true on success and +// false on error. For security reasons, a |path| containing path traversal +// components ('..') is treated as a read error and |contents| is set to empty. +// In case of I/O error, |contents| holds the data that could be read from the +// file before the error occurred. When the file size exceeds |max_size|, the +// function returns false with |contents| holding the file truncated to +// |max_size|. +// |contents| may be NULL, in which case this function is useful for its side +// effect of priming the disk cache (could be used for unit tests). +BASE_EXPORT bool ReadFileToStringWithMaxSize(const FilePath& path, + std::string* contents, + size_t max_size); + +// As ReadFileToString, but reading from an open stream after seeking to its +// start (if supported by the stream). This can also be used to read the whole +// file from a file descriptor by converting the file descriptor into a stream +// by using base::FileToFILE() before calling this function. +BASE_EXPORT bool ReadStreamToString(FILE* stream, std::string* contents); + +// As ReadFileToStringWithMaxSize, but reading from an open stream after seeking +// to its start (if supported by the stream). +BASE_EXPORT bool ReadStreamToStringWithMaxSize(FILE* stream, + size_t max_size, + std::string* contents); + +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + +// Read exactly |bytes| bytes from file descriptor |fd|, storing the result +// in |buffer|. This function is protected against EINTR and partial reads. +// Returns true iff |bytes| bytes have been successfully read from |fd|. +BASE_EXPORT bool ReadFromFD(int fd, char* buffer, size_t bytes); + +// Performs the same function as CreateAndOpenTemporaryStreamInDir(), but +// returns the file-descriptor wrapped in a ScopedFD, rather than the stream +// wrapped in a ScopedFILE. +// The caller is responsible for deleting the file `path` points to, if +// appropriate. +BASE_EXPORT ScopedFD CreateAndOpenFdForTemporaryFileInDir(const FilePath& dir, + FilePath* path); + +#endif // BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + +#if BUILDFLAG(IS_POSIX) + +// ReadFileToStringNonBlocking is identical to ReadFileToString except it +// guarantees that it will not block. This guarantee is provided on POSIX by +// opening the file as O_NONBLOCK. This variant should only be used on files +// which are guaranteed not to block (such as kernel files). Or in situations +// where a partial read would be acceptable because the backing store returned +// EWOULDBLOCK. +BASE_EXPORT bool ReadFileToStringNonBlocking(const base::FilePath& file, + std::string* ret); + +// Creates a symbolic link at |symlink| pointing to |target|. Returns +// false on failure. +BASE_EXPORT bool CreateSymbolicLink(const FilePath& target, + const FilePath& symlink); + +// Reads the given |symlink| and returns the raw string in |target|. +// Returns false upon failure. +// IMPORTANT NOTE: if the string stored in the symlink is a relative file path, +// it should be interpreted relative to the symlink's directory, NOT the current +// working directory. ReadSymbolicLinkAbsolute() may be the better choice. +BASE_EXPORT bool ReadSymbolicLink(const FilePath& symlink, FilePath* target); + +// Same as ReadSymbolicLink(), but properly converts it into an absolute path if +// the link is relative. +// Can fail if readlink() fails, or if +// MakeAbsoluteFilePathNoResolveSymbolicLinks() fails on the resulting absolute +// path. +BASE_EXPORT absl::optional ReadSymbolicLinkAbsolute( + const FilePath& symlink); + +// Bits and masks of the file permission. +enum FilePermissionBits { + FILE_PERMISSION_MASK = S_IRWXU | S_IRWXG | S_IRWXO, + FILE_PERMISSION_USER_MASK = S_IRWXU, + FILE_PERMISSION_GROUP_MASK = S_IRWXG, + FILE_PERMISSION_OTHERS_MASK = S_IRWXO, + + FILE_PERMISSION_READ_BY_USER = S_IRUSR, + FILE_PERMISSION_WRITE_BY_USER = S_IWUSR, + FILE_PERMISSION_EXECUTE_BY_USER = S_IXUSR, + FILE_PERMISSION_READ_BY_GROUP = S_IRGRP, + FILE_PERMISSION_WRITE_BY_GROUP = S_IWGRP, + FILE_PERMISSION_EXECUTE_BY_GROUP = S_IXGRP, + FILE_PERMISSION_READ_BY_OTHERS = S_IROTH, + FILE_PERMISSION_WRITE_BY_OTHERS = S_IWOTH, + FILE_PERMISSION_EXECUTE_BY_OTHERS = S_IXOTH, +}; + +// Reads the permission of the given |path|, storing the file permission +// bits in |mode|. If |path| is symbolic link, |mode| is the permission of +// a file which the symlink points to. +BASE_EXPORT bool GetPosixFilePermissions(const FilePath& path, int* mode); +// Sets the permission of the given |path|. If |path| is symbolic link, sets +// the permission of a file which the symlink points to. +BASE_EXPORT bool SetPosixFilePermissions(const FilePath& path, int mode); + +// Returns true iff |executable| can be found in any directory specified by the +// environment variable in |env|. +BASE_EXPORT bool ExecutableExistsInPath(Environment* env, + const FilePath::StringType& executable); + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_AIX) +// Determine if files under a given |path| can be mapped and then mprotect'd +// PROT_EXEC. This depends on the mount options used for |path|, which vary +// among different Linux distributions and possibly local configuration. It also +// depends on details of kernel--ChromeOS uses the noexec option for /dev/shm +// but its kernel allows mprotect with PROT_EXEC anyway. +BASE_EXPORT bool IsPathExecutable(const FilePath& path); +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_AIX) + +#endif // BUILDFLAG(IS_POSIX) + +// Returns true if the given directory is empty +BASE_EXPORT bool IsDirectoryEmpty(const FilePath& dir_path); + +// Get the temporary directory provided by the system. +// +// WARNING: In general, you should use CreateTemporaryFile variants below +// instead of this function. Those variants will ensure that the proper +// permissions are set so that other users on the system can't edit them while +// they're open (which can lead to security issues). +BASE_EXPORT bool GetTempDir(FilePath* path); + +// Get the home directory. This is more complicated than just getenv("HOME") +// as it knows to fall back on getpwent() etc. +// +// You should not generally call this directly. Instead use DIR_HOME with the +// path service which will use this function but cache the value. +// Path service may also override DIR_HOME. +BASE_EXPORT FilePath GetHomeDir(); + +// Returns a new temporary file in |dir| with a unique name. The file is opened +// for exclusive read, write, and delete access. +// On success, |temp_file| is populated with the full path to the created file. +// +// NOTE: Exclusivity is unique to Windows. On Windows, the returned file +// supports File::DeleteOnClose. On other platforms, the caller is responsible +// for deleting the file `temp_file` points to, if appropriate. +BASE_EXPORT File CreateAndOpenTemporaryFileInDir(const FilePath& dir, + FilePath* temp_file); + +// Creates a temporary file. The full path is placed in `path`, and the +// function returns true if was successful in creating the file. The file will +// be empty and all handles closed after this function returns. +// The caller is responsible for deleting the file `path` points to, if +// appropriate. +BASE_EXPORT bool CreateTemporaryFile(FilePath* path); + +// Same as CreateTemporaryFile() but the file is created in `dir`. +// The caller is responsible for deleting the file `temp_file` points to, if +// appropriate. +BASE_EXPORT bool CreateTemporaryFileInDir(const FilePath& dir, + FilePath* temp_file); + +// Returns the file name for a temporary file by using a platform-specific +// naming scheme that incorporates |identifier|. +BASE_EXPORT FilePath +FormatTemporaryFileName(FilePath::StringPieceType identifier); + +// Create and open a temporary file stream for exclusive read, write, and delete +// access. The full path is placed in `path`. Returns the opened file stream, or +// null in case of error. +// NOTE: Exclusivity is unique to Windows. On Windows, the returned file +// supports File::DeleteOnClose. On other platforms, the caller is responsible +// for deleting the file `path` points to, if appropriate. +BASE_EXPORT ScopedFILE CreateAndOpenTemporaryStream(FilePath* path); + +// Similar to CreateAndOpenTemporaryStream(), but the file is created in `dir`. +BASE_EXPORT ScopedFILE CreateAndOpenTemporaryStreamInDir(const FilePath& dir, + FilePath* path); + +#if BUILDFLAG(IS_WIN) +// Retrieves the path `%systemroot%\SystemTemp`, if available, else retrieves +// `%programfiles%`. +// Returns the path in `temp` and `true` if the path is writable by the caller, +// which is usually only when the caller is running as admin or system. +// Returns `false` otherwise. +// Both paths are only accessible to admin and system processes, and are +// therefore secure. +BASE_EXPORT bool GetSecureSystemTemp(FilePath* temp); +#endif // BUILDFLAG(IS_WIN) + +// Do NOT USE in new code. Use ScopedTempDir instead. +// TODO(crbug.com/561597) Remove existing usage and make this an implementation +// detail inside ScopedTempDir. +// +// Create a new directory. If prefix is provided, the new directory name is in +// the format of prefixyyyy. +// NOTE: prefix is ignored in the POSIX implementation. +// If success, return true and output the full path of the directory created. +// +// For Windows, this directory is usually created in a secure location if the +// caller is admin. This is because the default %TEMP% folder for Windows is +// insecure, since low privilege users can get the path of folders under %TEMP% +// after creation and are able to create subfolders and files within these +// folders which can lead to privilege escalation. +BASE_EXPORT bool CreateNewTempDirectory(const FilePath::StringType& prefix, + FilePath* new_temp_path); + +// Create a directory within another directory. +// Extra characters will be appended to |prefix| to ensure that the +// new directory does not have the same name as an existing directory. +BASE_EXPORT bool CreateTemporaryDirInDir(const FilePath& base_dir, + const FilePath::StringType& prefix, + FilePath* new_dir); + +// Creates a directory, as well as creating any parent directories, if they +// don't exist. Returns 'true' on successful creation, or if the directory +// already exists. The directory is only readable by the current user. +// Returns true on success, leaving *error unchanged. +// Returns false on failure and sets *error appropriately, if it is non-NULL. +BASE_EXPORT bool CreateDirectoryAndGetError(const FilePath& full_path, + File::Error* error); + +// Backward-compatible convenience method for the above. +BASE_EXPORT bool CreateDirectory(const FilePath& full_path); + +// Returns the file size. Returns true on success. +BASE_EXPORT bool GetFileSize(const FilePath& file_path, int64_t* file_size); + +// Sets |real_path| to |path| with symbolic links and junctions expanded. +// On windows, make sure the path starts with a lettered drive. +// |path| must reference a file. Function will fail if |path| points to +// a directory or to a nonexistent path. On windows, this function will +// fail if |real_path| would be longer than MAX_PATH characters. +BASE_EXPORT bool NormalizeFilePath(const FilePath& path, FilePath* real_path); + +#if BUILDFLAG(IS_WIN) + +// Given a path in NT native form ("\Device\HarddiskVolumeXX\..."), +// return in |drive_letter_path| the equivalent path that starts with +// a drive letter ("C:\..."). Return false if no such path exists. +BASE_EXPORT bool DevicePathToDriveLetterPath(const FilePath& device_path, + FilePath* drive_letter_path); + +// Method that wraps the win32 GetLongPathName API, normalizing the specified +// path to its long form. An example where this is needed is when comparing +// temp file paths. If a username isn't a valid 8.3 short file name (even just a +// lengthy name like "user with long name"), Windows will set the TMP and TEMP +// environment variables to be 8.3 paths. ::GetTempPath (called in +// base::GetTempDir) just uses the value specified by TMP or TEMP, and so can +// return a short path. Returns an empty path on error. +BASE_EXPORT FilePath MakeLongFilePath(const FilePath& input); + +// Creates a hard link named |to_file| to the file |from_file|. Both paths +// must be on the same volume, and |from_file| may not name a directory. +// Returns true if the hard link is created, false if it fails. +BASE_EXPORT bool CreateWinHardLink(const FilePath& to_file, + const FilePath& from_file); +#endif + +// This function will return if the given file is a symlink or not. +BASE_EXPORT bool IsLink(const FilePath& file_path); + +// Returns information about the given file path. Also see |File::GetInfo|. +BASE_EXPORT bool GetFileInfo(const FilePath& file_path, File::Info* info); + +// Sets the time of the last access and the time of the last modification. +BASE_EXPORT bool TouchFile(const FilePath& path, + const Time& last_accessed, + const Time& last_modified); + +// Wrapper for fopen-like calls. Returns non-NULL FILE* on success. The +// underlying file descriptor (POSIX) or handle (Windows) is unconditionally +// configured to not be propagated to child processes. +BASE_EXPORT FILE* OpenFile(const FilePath& filename, const char* mode); + +// Closes file opened by OpenFile. Returns true on success. +BASE_EXPORT bool CloseFile(FILE* file); + +// Associates a standard FILE stream with an existing File. Note that this +// functions take ownership of the existing File. +BASE_EXPORT FILE* FileToFILE(File file, const char* mode); + +// Returns a new handle to the file underlying |file_stream|. +BASE_EXPORT File FILEToFile(FILE* file_stream); + +// Truncates an open file to end at the location of the current file pointer. +// This is a cross-platform analog to Windows' SetEndOfFile() function. +BASE_EXPORT bool TruncateFile(FILE* file); + +// Reads at most the given number of bytes from the file into the buffer. +// Returns the number of read bytes, or -1 on error. +BASE_EXPORT int ReadFile(const FilePath& filename, char* data, int max_size); + +// Writes the given buffer into the file, overwriting any data that was +// previously there. Returns the number of bytes written, or -1 on error. +// If file doesn't exist, it gets created with read/write permissions for all. +// Note that the other variants of WriteFile() below may be easier to use. +BASE_EXPORT int WriteFile(const FilePath& filename, const char* data, + int size); + +// Writes |data| into the file, overwriting any data that was previously there. +// Returns true if and only if all of |data| was written. If the file does not +// exist, it gets created with read/write permissions for all. +BASE_EXPORT bool WriteFile(const FilePath& filename, span data); + +// Another WriteFile() variant that takes a StringPiece so callers don't have to +// do manual conversions from a char span to a uint8_t span. +BASE_EXPORT bool WriteFile(const FilePath& filename, StringPiece data); + +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +// Appends |data| to |fd|. Does not close |fd| when done. Returns true iff all +// of |data| were written to |fd|. +BASE_EXPORT bool WriteFileDescriptor(int fd, span data); + +// WriteFileDescriptor() variant that takes a StringPiece so callers don't have +// to do manual conversions from a char span to a uint8_t span. +BASE_EXPORT bool WriteFileDescriptor(int fd, StringPiece data); + +// Allocates disk space for the file referred to by |fd| for the byte range +// starting at |offset| and continuing for |size| bytes. The file size will be +// changed if |offset|+|len| is greater than the file size. Zeros will fill the +// new space. +// After a successful call, subsequent writes into the specified range are +// guaranteed not to fail because of lack of disk space. +BASE_EXPORT bool AllocateFileRegion(File* file, int64_t offset, size_t size); +#endif + +// Appends |data| to |filename|. Returns true iff |data| were written to +// |filename|. +BASE_EXPORT bool AppendToFile(const FilePath& filename, + span data); + +// AppendToFile() variant that takes a StringPiece so callers don't have to do +// manual conversions from a char span to a uint8_t span. +BASE_EXPORT bool AppendToFile(const FilePath& filename, StringPiece data); + +// Gets the current working directory for the process. +BASE_EXPORT bool GetCurrentDirectory(FilePath* path); + +// Sets the current working directory for the process. +BASE_EXPORT bool SetCurrentDirectory(const FilePath& path); + +// The largest value attempted by GetUniquePath{Number,}. +enum { kMaxUniqueFiles = 100 }; + +// Returns the number N that makes |path| unique when formatted as " (N)" in a +// suffix to its basename before any file extension, where N is a number between +// 1 and 100 (inclusive). Returns 0 if |path| does not exist (meaning that it is +// unique as-is), or -1 if no such number can be found. +BASE_EXPORT int GetUniquePathNumber(const FilePath& path); + +// Returns |path| if it does not exist. Otherwise, returns |path| with the +// suffix " (N)" appended to its basename before any file extension, where N is +// a number between 1 and 100 (inclusive). Returns an empty path if no such +// number can be found. +BASE_EXPORT FilePath GetUniquePath(const FilePath& path); + +// Sets the given |fd| to non-blocking mode. +// Returns true if it was able to set it in the non-blocking mode, otherwise +// false. +BASE_EXPORT bool SetNonBlocking(int fd); + +// Hints the OS to prefetch the first |max_bytes| of |file_path| into its cache. +// +// If called at the appropriate time, this can reduce the latency incurred by +// feature code that needs to read the file. +// +// |max_bytes| specifies how many bytes should be pre-fetched. It may exceed the +// file's size. Passing in std::numeric_limits::max() is a convenient +// way to get the entire file pre-fetched. +// +// |is_executable| specifies whether the file is to be prefetched as +// executable code or as data. Windows treats the file backed pages in RAM +// differently, and specifying the wrong value results in two copies in RAM. +// +// Returns true if at least part of the requested range was successfully +// prefetched. +// +// Calling this before using ::LoadLibrary() on Windows is more efficient memory +// wise, but we must be sure no other threads try to LoadLibrary() the file +// while we are doing the mapping and prefetching, or the process will get a +// private copy of the DLL via COW. +BASE_EXPORT bool PreReadFile( + const FilePath& file_path, + bool is_executable, + int64_t max_bytes = std::numeric_limits::max()); + +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + +// Creates a pipe. Returns true on success, otherwise false. +// On success, |read_fd| will be set to the fd of the read side, and +// |write_fd| will be set to the one of write side. If |non_blocking| +// is set the pipe will be created with O_NONBLOCK|O_CLOEXEC flags set +// otherwise flag is set to zero (default). +BASE_EXPORT bool CreatePipe(ScopedFD* read_fd, + ScopedFD* write_fd, + bool non_blocking = false); + +// Creates a non-blocking, close-on-exec pipe. +// This creates a non-blocking pipe that is not intended to be shared with any +// child process. This will be done atomically if the operating system supports +// it. Returns true if it was able to create the pipe, otherwise false. +BASE_EXPORT bool CreateLocalNonBlockingPipe(int fds[2]); + +// Sets the given |fd| to close-on-exec mode. +// Returns true if it was able to set it in the close-on-exec mode, otherwise +// false. +BASE_EXPORT bool SetCloseOnExec(int fd); +#endif // BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + +#if BUILDFLAG(IS_MAC) +// Test that |path| can only be changed by a given user and members of +// a given set of groups. +// Specifically, test that all parts of |path| under (and including) |base|: +// * Exist. +// * Are owned by a specific user. +// * Are not writable by all users. +// * Are owned by a member of a given set of groups, or are not writable by +// their group. +// * Are not symbolic links. +// This is useful for checking that a config file is administrator-controlled. +// |base| must contain |path|. +BASE_EXPORT bool VerifyPathControlledByUser(const base::FilePath& base, + const base::FilePath& path, + uid_t owner_uid, + const std::set& group_gids); + +// Is |path| writable only by a user with administrator privileges? +// This function uses Mac OS conventions. The super user is assumed to have +// uid 0, and the administrator group is assumed to be named "admin". +// Testing that |path|, and every parent directory including the root of +// the filesystem, are owned by the superuser, controlled by the group +// "admin", are not writable by all users, and contain no symbolic links. +// Will return false if |path| does not exist. +BASE_EXPORT bool VerifyPathControlledByAdmin(const base::FilePath& path); +#endif // BUILDFLAG(IS_MAC) + +// Returns the maximum length of path component on the volume containing +// the directory |path|, in the number of FilePath::CharType, or -1 on failure. +BASE_EXPORT int GetMaximumPathComponentLength(const base::FilePath& path); + +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +// Get a temporary directory for shared memory files. The directory may depend +// on whether the destination is intended for executable files, which in turn +// depends on how /dev/shmem was mounted. As a result, you must supply whether +// you intend to create executable shmem segments so this function can find +// an appropriate location. +BASE_EXPORT bool GetShmemTempDir(bool executable, FilePath* path); +#endif + +// Internal -------------------------------------------------------------------- + +namespace internal { + +// Same as Move but allows paths with traversal components. +// Use only with extreme care. +BASE_EXPORT bool MoveUnsafe(const FilePath& from_path, + const FilePath& to_path); + +#if BUILDFLAG(IS_WIN) +// Copy from_path to to_path recursively and then delete from_path recursively. +// Returns true if all operations succeed. +// This function simulates Move(), but unlike Move() it works across volumes. +// This function is not transactional. +BASE_EXPORT bool CopyAndDeleteDirectory(const FilePath& from_path, + const FilePath& to_path); +#endif // BUILDFLAG(IS_WIN) + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) +// CopyFileContentsWithSendfile will use the sendfile(2) syscall to perform a +// file copy without moving the data between kernel and userspace. This is much +// more efficient than sequences of read(2)/write(2) calls. The |retry_slow| +// parameter instructs the caller that it should try to fall back to a normal +// sequences of read(2)/write(2) syscalls. +// +// The input file |infile| must be opened for reading and the output file +// |outfile| must be opened for writing. +BASE_EXPORT bool CopyFileContentsWithSendfile(File& infile, + File& outfile, + bool& retry_slow); +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || + // BUILDFLAG(IS_ANDROID) + +// Used by PreReadFile() when no kernel support for prefetching is available. +bool PreReadFileSlow(const FilePath& file_path, int64_t max_bytes); + +} // namespace internal +} // namespace base + +#endif // BASE_FILES_FILE_UTIL_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_util_mac.mm firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_util_mac.mm --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_util_mac.mm 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_util_mac.mm 2025-12-01 18:15:47.000000000 +0000 @@ -0,0 +1,71 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file_util.h" + +#import +#include +#include +#include + +#include "base/check_op.h" +#include "base/files/file_path.h" +#include "base/mac/foundation_util.h" +#include "base/strings/string_util.h" +#include "base/threading/scoped_blocking_call.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace base { + +bool CopyFile(const FilePath& from_path, const FilePath& to_path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + if (from_path.ReferencesParent() || to_path.ReferencesParent()) + return false; + return (copyfile(from_path.value().c_str(), to_path.value().c_str(), + /*state=*/nullptr, COPYFILE_DATA) == 0); +} + +bool GetTempDir(base::FilePath* path) { + // In order to facilitate hermetic runs on macOS, first check + // MAC_CHROMIUM_TMPDIR. This is used instead of TMPDIR for historical reasons. + // This was originally done for https://crbug.com/698759 (TMPDIR too long for + // process singleton socket path), but is hopefully obsolete as of + // https://crbug.com/1266817 (allows a longer process singleton socket path). + // Continue tracking MAC_CHROMIUM_TMPDIR as that's what build infrastructure + // sets on macOS. + const char* env_tmpdir = getenv("MAC_CHROMIUM_TMPDIR"); + if (env_tmpdir) { + *path = base::FilePath(env_tmpdir); + return true; + } + + // If we didn't find it, fall back to the native function. + NSString* tmp = NSTemporaryDirectory(); + if (tmp == nil) + return false; + *path = base::mac::NSStringToFilePath(tmp); + return true; +} + +FilePath GetHomeDir() { + NSString* tmp = NSHomeDirectory(); + if (tmp != nil) { + FilePath mac_home_dir = base::mac::NSStringToFilePath(tmp); + if (!mac_home_dir.empty()) + return mac_home_dir; + } + + // Fall back on temp dir if no home directory is defined. + FilePath rv; + if (GetTempDir(&rv)) + return rv; + + // Last resort. + return FilePath("/tmp"); +} + +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_util_posix.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_util_posix.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_util_posix.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_util_posix.cc 2025-12-01 18:15:47.000000000 +0000 @@ -0,0 +1,1393 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file_util.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "base/base_export.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/base_switches.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/bits.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/command_line.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/containers/adapters.h" +#include "base/containers/contains.h" +#include "base/containers/stack.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/environment.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/files/file_enumerator.h" +#include "base/files/file_path.h" +#include "base/files/scoped_file.h" +#include "base/logging.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/memory/singleton.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/notreached.h" +#include "base/numerics/safe_conversions.h" +#include "base/path_service.h" +#include "base/posix/eintr_wrapper.h" +#include "base/strings/strcat.h" +#include "base/strings/string_piece.h" +#include "base/strings/string_split.h" +#include "base/strings/string_util.h" +#include "base/strings/sys_string_conversions.h" +#include "base/strings/utf_string_conversions.h" +#include "base/system/sys_info.h" +#include "base/threading/scoped_blocking_call.h" +#include "base/time/time.h" +#include "build/branding_buildflags.h" +#include "build/build_config.h" + +#if BUILDFLAG(IS_APPLE) +#include +#include "base/mac/foundation_util.h" +#endif + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) +#include +#endif + +#if BUILDFLAG(IS_ANDROID) +#include "base/android/content_uri_utils.h" +#include "base/os_compat_android.h" +#endif + +#if !BUILDFLAG(IS_IOS) +#include +#endif + +// We need to do this on AIX due to some inconsistencies in how AIX +// handles XOPEN_SOURCE and ALL_SOURCE. +#if BUILDFLAG(IS_AIX) +extern "C" char* mkdtemp(char* path); +#endif + +namespace base { + +namespace { + +#if !defined(MOZ_ZUCCHINI) +#if BUILDFLAG(IS_MAC) +// Helper for VerifyPathControlledByUser. +bool VerifySpecificPathControlledByUser(const FilePath& path, + uid_t owner_uid, + const std::set& group_gids) { + stat_wrapper_t stat_info; + if (File::Lstat(path.value().c_str(), &stat_info) != 0) { + DPLOG(ERROR) << "Failed to get information on path " + << path.value(); + return false; + } + + if (S_ISLNK(stat_info.st_mode)) { + DLOG(ERROR) << "Path " << path.value() << " is a symbolic link."; + return false; + } + + if (stat_info.st_uid != owner_uid) { + DLOG(ERROR) << "Path " << path.value() << " is owned by the wrong user."; + return false; + } + + if ((stat_info.st_mode & S_IWGRP) && + !Contains(group_gids, stat_info.st_gid)) { + DLOG(ERROR) << "Path " << path.value() + << " is writable by an unprivileged group."; + return false; + } + + if (stat_info.st_mode & S_IWOTH) { + DLOG(ERROR) << "Path " << path.value() << " is writable by any user."; + return false; + } + + return true; +} +#endif +#endif // !defined(MOZ_ZUCCHINI) + +base::FilePath GetTempTemplate() { + return FormatTemporaryFileName("XXXXXX"); +} + +#if !defined(MOZ_ZUCCHINI) +bool AdvanceEnumeratorWithStat(FileEnumerator* traversal, + FilePath* out_next_path, + stat_wrapper_t* out_next_stat) { + DCHECK(out_next_path); + DCHECK(out_next_stat); + *out_next_path = traversal->Next(); + if (out_next_path->empty()) + return false; + + *out_next_stat = traversal->GetInfo().stat(); + return true; +} + +bool DoCopyDirectory(const FilePath& from_path, + const FilePath& to_path, + bool recursive, + bool open_exclusive) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + // Some old callers of CopyDirectory want it to support wildcards. + // After some discussion, we decided to fix those callers. + // Break loudly here if anyone tries to do this. + DCHECK(to_path.value().find('*') == std::string::npos); + DCHECK(from_path.value().find('*') == std::string::npos); + + if (from_path.value().size() >= PATH_MAX) { + return false; + } + + // This function does not properly handle destinations within the source + FilePath real_to_path = to_path; + if (PathExists(real_to_path)) + real_to_path = MakeAbsoluteFilePath(real_to_path); + else + real_to_path = MakeAbsoluteFilePath(real_to_path.DirName()); + if (real_to_path.empty()) + return false; + + FilePath real_from_path = MakeAbsoluteFilePath(from_path); + if (real_from_path.empty()) + return false; + if (real_to_path == real_from_path || real_from_path.IsParent(real_to_path)) + return false; + + int traverse_type = FileEnumerator::FILES | FileEnumerator::SHOW_SYM_LINKS; + if (recursive) + traverse_type |= FileEnumerator::DIRECTORIES; + FileEnumerator traversal(from_path, recursive, traverse_type); + + // We have to mimic windows behavior here. |to_path| may not exist yet, + // start the loop with |to_path|. + stat_wrapper_t from_stat; + FilePath current = from_path; + if (File::Stat(from_path.value().c_str(), &from_stat) < 0) { + DPLOG(ERROR) << "CopyDirectory() couldn't stat source directory: " + << from_path.value(); + return false; + } + FilePath from_path_base = from_path; + if (recursive && DirectoryExists(to_path)) { + // If the destination already exists and is a directory, then the + // top level of source needs to be copied. + from_path_base = from_path.DirName(); + } + + // The Windows version of this function assumes that non-recursive calls + // will always have a directory for from_path. + // TODO(maruel): This is not necessary anymore. + DCHECK(recursive || S_ISDIR(from_stat.st_mode)); + + do { + // current is the source path, including from_path, so append + // the suffix after from_path to to_path to create the target_path. + FilePath target_path(to_path); + if (from_path_base != current && + !from_path_base.AppendRelativePath(current, &target_path)) { + return false; + } + + if (S_ISDIR(from_stat.st_mode)) { + mode_t mode = (from_stat.st_mode & 01777) | S_IRUSR | S_IXUSR | S_IWUSR; + if (mkdir(target_path.value().c_str(), mode) == 0) + continue; + if (errno == EEXIST && !open_exclusive) + continue; + + DPLOG(ERROR) << "CopyDirectory() couldn't create directory: " + << target_path.value(); + return false; + } + + if (!S_ISREG(from_stat.st_mode)) { + DLOG(WARNING) << "CopyDirectory() skipping non-regular file: " + << current.value(); + continue; + } + + // Add O_NONBLOCK so we can't block opening a pipe. + File infile(open(current.value().c_str(), O_RDONLY | O_NONBLOCK)); + if (!infile.IsValid()) { + DPLOG(ERROR) << "CopyDirectory() couldn't open file: " << current.value(); + return false; + } + + stat_wrapper_t stat_at_use; + if (File::Fstat(infile.GetPlatformFile(), &stat_at_use) < 0) { + DPLOG(ERROR) << "CopyDirectory() couldn't stat file: " << current.value(); + return false; + } + + if (!S_ISREG(stat_at_use.st_mode)) { + DLOG(WARNING) << "CopyDirectory() skipping non-regular file: " + << current.value(); + continue; + } + + int open_flags = O_WRONLY | O_CREAT; + // If |open_exclusive| is set then we should always create the destination + // file, so O_NONBLOCK is not necessary to ensure we don't block on the + // open call for the target file below, and since the destination will + // always be a regular file it wouldn't affect the behavior of the + // subsequent write calls anyway. + if (open_exclusive) + open_flags |= O_EXCL; + else + open_flags |= O_TRUNC | O_NONBLOCK; + // Each platform has different default file opening modes for CopyFile which + // we want to replicate here. On OS X, we use copyfile(3) which takes the + // source file's permissions into account. On the other platforms, we just + // use the base::File constructor. On Chrome OS, base::File uses a different + // set of permissions than it does on other POSIX platforms. +#if BUILDFLAG(IS_APPLE) + mode_t mode = 0600 | (stat_at_use.st_mode & 0177); +#elif BUILDFLAG(IS_CHROMEOS) + mode_t mode = 0644; +#else + mode_t mode = 0600; +#endif + File outfile(open(target_path.value().c_str(), open_flags, mode)); + if (!outfile.IsValid()) { + DPLOG(ERROR) << "CopyDirectory() couldn't create file: " + << target_path.value(); + return false; + } + + if (!CopyFileContents(infile, outfile)) { + DLOG(ERROR) << "CopyDirectory() couldn't copy file: " << current.value(); + return false; + } + } while (AdvanceEnumeratorWithStat(&traversal, ¤t, &from_stat)); + + return true; +} +#endif // !defined(MOZ_ZUCCHINI) + +// TODO(erikkay): The Windows version of this accepts paths like "foo/bar/*" +// which works both with and without the recursive flag. I'm not sure we need +// that functionality. If not, remove from file_util_win.cc, otherwise add it +// here. +bool DoDeleteFile(const FilePath& path, bool recursive) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + +#if BUILDFLAG(IS_ANDROID) + if (path.IsContentUri()) + return DeleteContentUri(path); +#endif // BUILDFLAG(IS_ANDROID) + + const char* path_str = path.value().c_str(); + stat_wrapper_t file_info; + if (File::Lstat(path_str, &file_info) != 0) { + // The Windows version defines this condition as success. + return (errno == ENOENT); + } + if (!S_ISDIR(file_info.st_mode)) + return (unlink(path_str) == 0) || (errno == ENOENT); + if (!recursive) + return (rmdir(path_str) == 0) || (errno == ENOENT); + + bool success = true; + stack directories; + directories.push(path.value()); + FileEnumerator traversal(path, true, + FileEnumerator::FILES | FileEnumerator::DIRECTORIES | + FileEnumerator::SHOW_SYM_LINKS); + for (FilePath current = traversal.Next(); !current.empty(); + current = traversal.Next()) { + if (traversal.GetInfo().IsDirectory()) + directories.push(current.value()); + else + success &= (unlink(current.value().c_str()) == 0) || (errno == ENOENT); + } + + while (!directories.empty()) { + FilePath dir = FilePath(directories.top()); + directories.pop(); + success &= (rmdir(dir.value().c_str()) == 0) || (errno == ENOENT); + } + return success; +} + +#if !BUILDFLAG(IS_APPLE) +// Appends |mode_char| to |mode| before the optional character set encoding; see +// https://www.gnu.org/software/libc/manual/html_node/Opening-Streams.html for +// details. +std::string AppendModeCharacter(StringPiece mode, char mode_char) { + std::string result(mode); + size_t comma_pos = result.find(','); + result.insert(comma_pos == std::string::npos ? result.length() : comma_pos, 1, + mode_char); + return result; +} +#endif + +} // namespace + +FilePath MakeAbsoluteFilePath(const FilePath& input) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + char full_path[PATH_MAX]; + if (realpath(input.value().c_str(), full_path) == nullptr) + return FilePath(); + return FilePath(full_path); +} + +absl::optional MakeAbsoluteFilePathNoResolveSymbolicLinks( + const FilePath& input) { + if (input.empty()) { + return absl::nullopt; + } + + FilePath collapsed_path; + std::vector components = input.GetComponents(); + base::span components_span(components); + // Start with root for absolute |input| and the current working directory for + // a relative |input|. + if (input.IsAbsolute()) { + collapsed_path = FilePath(components_span[0]); + components_span = components_span.subspan(1); + } else { + if (!GetCurrentDirectory(&collapsed_path)) { + return absl::nullopt; + } + } + + for (const auto& component : components_span) { + if (component == FilePath::kCurrentDirectory) { + continue; + } + + if (component == FilePath::kParentDirectory) { + // Pop the most recent component off the FilePath. Works correctly when + // the FilePath is root. + collapsed_path = collapsed_path.DirName(); + continue; + } + + // This is just a regular component. Append it. + collapsed_path = collapsed_path.Append(component); + } + + return collapsed_path; +} + +bool DeleteFile(const FilePath& path) { + return DoDeleteFile(path, /*recursive=*/false); +} + +bool DeletePathRecursively(const FilePath& path) { + return DoDeleteFile(path, /*recursive=*/true); +} + +#if !defined(MOZ_ZUCCHINI) +bool ReplaceFile(const FilePath& from_path, + const FilePath& to_path, + File::Error* error) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + if (rename(from_path.value().c_str(), to_path.value().c_str()) == 0) + return true; + if (error) + *error = File::GetLastFileError(); + return false; +} + +bool CopyDirectory(const FilePath& from_path, + const FilePath& to_path, + bool recursive) { + return DoCopyDirectory(from_path, to_path, recursive, false); +} + +bool CopyDirectoryExcl(const FilePath& from_path, + const FilePath& to_path, + bool recursive) { + return DoCopyDirectory(from_path, to_path, recursive, true); +} + +bool CreatePipe(ScopedFD* read_fd, ScopedFD* write_fd, bool non_blocking) { + int fds[2]; + bool created = + non_blocking ? CreateLocalNonBlockingPipe(fds) : (0 == pipe(fds)); + if (!created) + return false; + read_fd->reset(fds[0]); + write_fd->reset(fds[1]); + return true; +} + +bool CreateLocalNonBlockingPipe(int fds[2]) { +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) + return pipe2(fds, O_CLOEXEC | O_NONBLOCK) == 0; +#else + int raw_fds[2]; + if (pipe(raw_fds) != 0) + return false; + ScopedFD fd_out(raw_fds[0]); + ScopedFD fd_in(raw_fds[1]); + if (!SetCloseOnExec(fd_out.get())) + return false; + if (!SetCloseOnExec(fd_in.get())) + return false; + if (!SetNonBlocking(fd_out.get())) + return false; + if (!SetNonBlocking(fd_in.get())) + return false; + fds[0] = fd_out.release(); + fds[1] = fd_in.release(); + return true; +#endif +} + +bool SetNonBlocking(int fd) { + const int flags = fcntl(fd, F_GETFL); + if (flags == -1) + return false; + if (flags & O_NONBLOCK) + return true; + if (HANDLE_EINTR(fcntl(fd, F_SETFL, flags | O_NONBLOCK)) == -1) + return false; + return true; +} +#endif // !defined(MOZ_ZUCCHINI) + +bool SetCloseOnExec(int fd) { + const int flags = fcntl(fd, F_GETFD); + if (flags == -1) + return false; + if (flags & FD_CLOEXEC) + return true; + if (HANDLE_EINTR(fcntl(fd, F_SETFD, flags | FD_CLOEXEC)) == -1) + return false; + return true; +} + +bool PathExists(const FilePath& path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); +#if BUILDFLAG(IS_ANDROID) + if (path.IsContentUri()) { + return ContentUriExists(path); + } +#endif + return access(path.value().c_str(), F_OK) == 0; +} + +bool PathIsReadable(const FilePath& path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + return access(path.value().c_str(), R_OK) == 0; +} + +bool PathIsWritable(const FilePath& path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + return access(path.value().c_str(), W_OK) == 0; +} + +bool DirectoryExists(const FilePath& path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + stat_wrapper_t file_info; + if (File::Stat(path.value().c_str(), &file_info) != 0) + return false; + return S_ISDIR(file_info.st_mode); +} + +bool ReadFromFD(int fd, char* buffer, size_t bytes) { + size_t total_read = 0; + while (total_read < bytes) { + ssize_t bytes_read = + HANDLE_EINTR(read(fd, buffer + total_read, bytes - total_read)); + if (bytes_read <= 0) + break; + total_read += static_cast(bytes_read); + } + return total_read == bytes; +} + +ScopedFD CreateAndOpenFdForTemporaryFileInDir(const FilePath& directory, + FilePath* path) { + ScopedBlockingCall scoped_blocking_call( + FROM_HERE, + BlockingType::MAY_BLOCK); // For call to mkstemp(). + *path = directory.Append(GetTempTemplate()); + const std::string& tmpdir_string = path->value(); + // this should be OK since mkstemp just replaces characters in place + char* buffer = const_cast(tmpdir_string.c_str()); + + return ScopedFD(HANDLE_EINTR(mkstemp(buffer))); +} + +#if !BUILDFLAG(IS_FUCHSIA) +bool CreateSymbolicLink(const FilePath& target_path, + const FilePath& symlink_path) { + DCHECK(!symlink_path.empty()); + DCHECK(!target_path.empty()); + return ::symlink(target_path.value().c_str(), + symlink_path.value().c_str()) != -1; +} + +bool ReadSymbolicLink(const FilePath& symlink_path, FilePath* target_path) { + DCHECK(!symlink_path.empty()); + DCHECK(target_path); + char buf[PATH_MAX]; + ssize_t count = ::readlink(symlink_path.value().c_str(), buf, std::size(buf)); + +#if BUILDFLAG(IS_ANDROID) && defined(__LP64__) + // A few 64-bit Android L/M devices return INT_MAX instead of -1 here for + // errors; this is related to bionic's (incorrect) definition of ssize_t as + // being long int instead of int. Cast it so the compiler generates the + // comparison we want here. https://crbug.com/1101940 + bool error = static_cast(count) <= 0; +#else + bool error = count <= 0; +#endif + + if (error) { + target_path->clear(); + return false; + } + + *target_path = + FilePath(FilePath::StringType(buf, static_cast(count))); + return true; +} + +absl::optional ReadSymbolicLinkAbsolute( + const FilePath& symlink_path) { + FilePath target_path; + if (!ReadSymbolicLink(symlink_path, &target_path)) { + return absl::nullopt; + } + + // Relative symbolic links are relative to the symlink's directory. + if (!target_path.IsAbsolute()) { + target_path = symlink_path.DirName().Append(target_path); + } + + // Remove "/./" and "/../" to make this more friendly to path-allowlist-based + // sandboxes. + return MakeAbsoluteFilePathNoResolveSymbolicLinks(target_path); +} + +bool GetPosixFilePermissions(const FilePath& path, int* mode) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(mode); + + stat_wrapper_t file_info; + // Uses stat(), because on symbolic link, lstat() does not return valid + // permission bits in st_mode + if (File::Stat(path.value().c_str(), &file_info) != 0) + return false; + + *mode = file_info.st_mode & FILE_PERMISSION_MASK; + return true; +} + +bool SetPosixFilePermissions(const FilePath& path, + int mode) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK_EQ(mode & ~FILE_PERMISSION_MASK, 0); + + // Calls stat() so that we can preserve the higher bits like S_ISGID. + stat_wrapper_t stat_buf; + if (File::Stat(path.value().c_str(), &stat_buf) != 0) + return false; + + // Clears the existing permission bits, and adds the new ones. + // The casting here is because the Android NDK does not declare `st_mode` as a + // `mode_t`. + mode_t updated_mode_bits = static_cast(stat_buf.st_mode); + updated_mode_bits &= static_cast(~FILE_PERMISSION_MASK); + updated_mode_bits |= mode & FILE_PERMISSION_MASK; + + if (HANDLE_EINTR(chmod(path.value().c_str(), updated_mode_bits)) != 0) + return false; + + return true; +} + +#if !defined(MOZ_ZUCCHINI) +bool ExecutableExistsInPath(Environment* env, + const FilePath::StringType& executable) { + std::string path; + if (!env->GetVar("PATH", &path)) { + LOG(ERROR) << "No $PATH variable. Assuming no " << executable << "."; + return false; + } + + for (const StringPiece& cur_path : + SplitStringPiece(path, ":", KEEP_WHITESPACE, SPLIT_WANT_NONEMPTY)) { + FilePath file(cur_path); + int permissions; + if (GetPosixFilePermissions(file.Append(executable), &permissions) && + (permissions & FILE_PERMISSION_EXECUTE_BY_USER)) + return true; + } + return false; +} +#endif // !defined(MOZ_ZUCCHINI) + +#endif // !BUILDFLAG(IS_FUCHSIA) + +#if !BUILDFLAG(IS_APPLE) +// This is implemented in file_util_mac.mm for Mac. +bool GetTempDir(FilePath* path) { + const char* tmp = getenv("TMPDIR"); + if (tmp) { + *path = FilePath(tmp); + return true; + } + +#if BUILDFLAG(IS_ANDROID) + return PathService::Get(DIR_CACHE, path); +#else + *path = FilePath("/tmp"); + return true; +#endif +} +#endif // !BUILDFLAG(IS_APPLE) + +#if !BUILDFLAG(IS_APPLE) // Mac implementation is in file_util_mac.mm. +FilePath GetHomeDir() { +#if BUILDFLAG(IS_CHROMEOS) + if (SysInfo::IsRunningOnChromeOS()) { + // On Chrome OS chrome::DIR_USER_DATA is overridden with a primary user + // homedir once it becomes available. Return / as the safe option. + return FilePath("/"); + } +#endif + + const char* home_dir = getenv("HOME"); + if (home_dir && home_dir[0]) + return FilePath(home_dir); + +#if BUILDFLAG(IS_ANDROID) + DLOG(WARNING) << "OS_ANDROID: Home directory lookup not yet implemented."; +#endif + + FilePath rv; + if (GetTempDir(&rv)) + return rv; + + // Last resort. + return FilePath("/tmp"); +} +#endif // !BUILDFLAG(IS_APPLE) + +#if !defined(MOZ_ZUCCHINI) +File CreateAndOpenTemporaryFileInDir(const FilePath& dir, FilePath* temp_file) { + // For call to close() inside ScopedFD. + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + ScopedFD fd = CreateAndOpenFdForTemporaryFileInDir(dir, temp_file); + return fd.is_valid() ? File(std::move(fd)) : File(File::GetLastFileError()); +} + +bool CreateTemporaryFileInDir(const FilePath& dir, FilePath* temp_file) { + // For call to close() inside ScopedFD. + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + ScopedFD fd = CreateAndOpenFdForTemporaryFileInDir(dir, temp_file); + return fd.is_valid(); +} +#endif // !defined(MOZ_ZUCCHINI) + +FilePath FormatTemporaryFileName(FilePath::StringPieceType identifier) { +#if BUILDFLAG(IS_APPLE) + StringPiece prefix = base::mac::BaseBundleID(); +#elif BUILDFLAG(GOOGLE_CHROME_BRANDING) + StringPiece prefix = "com.google.Chrome"; +#else + StringPiece prefix = "org.chromium.Chromium"; +#endif + return FilePath(StrCat({".", prefix, ".", identifier})); +} + +#if !defined(MOZ_ZUCCHINI) +ScopedFILE CreateAndOpenTemporaryStreamInDir(const FilePath& dir, + FilePath* path) { + ScopedFD scoped_fd = CreateAndOpenFdForTemporaryFileInDir(dir, path); + if (!scoped_fd.is_valid()) + return nullptr; + + int fd = scoped_fd.release(); + FILE* file = fdopen(fd, "a+"); + if (!file) + close(fd); + return ScopedFILE(file); +} +#endif // !defined(MOZ_ZUCCHINI) + +static bool CreateTemporaryDirInDirImpl(const FilePath& base_dir, + const FilePath& name_tmpl, + FilePath* new_dir) { + ScopedBlockingCall scoped_blocking_call( + FROM_HERE, BlockingType::MAY_BLOCK); // For call to mkdtemp(). + DCHECK(EndsWith(name_tmpl.value(), "XXXXXX")) + << "Directory name template must end with \"XXXXXX\"."; + + FilePath sub_dir = base_dir.Append(name_tmpl); + std::string sub_dir_string = sub_dir.value(); + + // this should be OK since mkdtemp just replaces characters in place + char* buffer = const_cast(sub_dir_string.c_str()); + char* dtemp = mkdtemp(buffer); + if (!dtemp) { + DPLOG(ERROR) << "mkdtemp"; + return false; + } + *new_dir = FilePath(dtemp); + return true; +} + +bool CreateTemporaryDirInDir(const FilePath& base_dir, + const FilePath::StringType& prefix, + FilePath* new_dir) { + FilePath::StringType mkdtemp_template = prefix; + mkdtemp_template.append("XXXXXX"); + return CreateTemporaryDirInDirImpl(base_dir, FilePath(mkdtemp_template), + new_dir); +} + +bool CreateNewTempDirectory(const FilePath::StringType& prefix, + FilePath* new_temp_path) { + FilePath tmpdir; + if (!GetTempDir(&tmpdir)) + return false; + + return CreateTemporaryDirInDirImpl(tmpdir, GetTempTemplate(), new_temp_path); +} + +bool CreateDirectoryAndGetError(const FilePath& full_path, + File::Error* error) { + ScopedBlockingCall scoped_blocking_call( + FROM_HERE, BlockingType::MAY_BLOCK); // For call to mkdir(). + std::vector subpaths; + + // Collect a list of all parent directories. + FilePath last_path = full_path; + subpaths.push_back(full_path); + for (FilePath path = full_path.DirName(); + path.value() != last_path.value(); path = path.DirName()) { + subpaths.push_back(path); + last_path = path; + } + + // Iterate through the parents and create the missing ones. + for (const FilePath& subpath : base::Reversed(subpaths)) { + if (DirectoryExists(subpath)) + continue; + if (mkdir(subpath.value().c_str(), 0700) == 0) + continue; + // Mkdir failed, but it might have failed with EEXIST, or some other error + // due to the directory appearing out of thin air. This can occur if + // two processes are trying to create the same file system tree at the same + // time. Check to see if it exists and make sure it is a directory. + int saved_errno = errno; + if (!DirectoryExists(subpath)) { + if (error) + *error = File::OSErrorToFileError(saved_errno); + return false; + } + } + return true; +} + +#if !defined(MOZ_ZUCCHINI) +// ReadFileToStringNonBlockingNonBlocking will read a file to a string. This +// method should only be used on files which are known to be non-blocking such +// as procfs or sysfs nodes. Additionally, the file is opened as O_NONBLOCK so +// it WILL NOT block even if opened on a blocking file. It will return true if +// the file read until EOF and it will return false otherwise, errno will remain +// set on error conditions. |ret| will be populated with the contents of the +// file. +bool ReadFileToStringNonBlocking(const base::FilePath& file, std::string* ret) { + DCHECK(ret); + ret->clear(); + + base::ScopedFD fd(HANDLE_EINTR( + open(file.MaybeAsASCII().c_str(), O_CLOEXEC | O_NONBLOCK | O_RDONLY))); + if (!fd.is_valid()) { + return false; + } + + ssize_t bytes_read = 0; + do { + char buf[4096]; + bytes_read = HANDLE_EINTR(read(fd.get(), buf, sizeof(buf))); + if (bytes_read < 0) + return false; + if (bytes_read > 0) + ret->append(buf, static_cast(bytes_read)); + } while (bytes_read > 0); + + return true; +} + +bool NormalizeFilePath(const FilePath& path, FilePath* normalized_path) { + FilePath real_path_result = MakeAbsoluteFilePath(path); + if (real_path_result.empty()) + return false; + + // To be consistant with windows, fail if |real_path_result| is a + // directory. + if (DirectoryExists(real_path_result)) + return false; + + *normalized_path = real_path_result; + return true; +} + +// TODO(rkc): Refactor GetFileInfo and FileEnumerator to handle symlinks +// correctly. http://code.google.com/p/chromium-os/issues/detail?id=15948 +bool IsLink(const FilePath& file_path) { + stat_wrapper_t st; + // If we can't lstat the file, it's safe to assume that the file won't at + // least be a 'followable' link. + if (File::Lstat(file_path.value().c_str(), &st) != 0) + return false; + return S_ISLNK(st.st_mode); +} + +bool GetFileInfo(const FilePath& file_path, File::Info* results) { + stat_wrapper_t file_info; +#if BUILDFLAG(IS_ANDROID) + if (file_path.IsContentUri()) { + File file = OpenContentUriForRead(file_path); + if (!file.IsValid()) + return false; + return file.GetInfo(results); + } else { +#endif // BUILDFLAG(IS_ANDROID) + if (File::Stat(file_path.value().c_str(), &file_info) != 0) + return false; +#if BUILDFLAG(IS_ANDROID) + } +#endif // BUILDFLAG(IS_ANDROID) + + results->FromStat(file_info); + return true; +} +#endif // !defined(MOZ_ZUCCHINI) + +FILE* OpenFile(const FilePath& filename, const char* mode) { + // 'e' is unconditionally added below, so be sure there is not one already + // present before a comma in |mode|. + DCHECK( + strchr(mode, 'e') == nullptr || + (strchr(mode, ',') != nullptr && strchr(mode, 'e') > strchr(mode, ','))); + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + FILE* result = nullptr; +#if BUILDFLAG(IS_APPLE) + // macOS does not provide a mode character to set O_CLOEXEC; see + // https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/fopen.3.html. + const char* the_mode = mode; +#else + std::string mode_with_e(AppendModeCharacter(mode, 'e')); + const char* the_mode = mode_with_e.c_str(); +#endif + do { + result = fopen(filename.value().c_str(), the_mode); + } while (!result && errno == EINTR); +#if BUILDFLAG(IS_APPLE) + // Mark the descriptor as close-on-exec. + if (result) + SetCloseOnExec(fileno(result)); +#endif + return result; +} + +// NaCl doesn't implement system calls to open files directly. +#if !BUILDFLAG(IS_NACL) +FILE* FileToFILE(File file, const char* mode) { + PlatformFile unowned = file.GetPlatformFile(); + FILE* stream = fdopen(file.TakePlatformFile(), mode); + if (!stream) + ScopedFD to_be_closed(unowned); + return stream; +} + +File FILEToFile(FILE* file_stream) { + if (!file_stream) + return File(); + + PlatformFile fd = fileno(file_stream); + DCHECK_NE(fd, -1); + ScopedPlatformFile other_fd(HANDLE_EINTR(dup(fd))); + if (!other_fd.is_valid()) + return File(File::GetLastFileError()); + return File(std::move(other_fd)); +} +#endif // !BUILDFLAG(IS_NACL) + +#if !defined(MOZ_ZUCCHINI) +int ReadFile(const FilePath& filename, char* data, int max_size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + if (max_size < 0) + return -1; + int fd = HANDLE_EINTR(open(filename.value().c_str(), O_RDONLY)); + if (fd < 0) + return -1; + + long bytes_read = HANDLE_EINTR(read(fd, data, static_cast(max_size))); + if (IGNORE_EINTR(close(fd)) < 0) + return -1; + return checked_cast(bytes_read); +} + +int WriteFile(const FilePath& filename, const char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + if (size < 0) + return -1; + int fd = HANDLE_EINTR(creat(filename.value().c_str(), 0666)); + if (fd < 0) + return -1; + + int bytes_written = + WriteFileDescriptor(fd, StringPiece(data, static_cast(size))) + ? size + : -1; + if (IGNORE_EINTR(close(fd)) < 0) + return -1; + return bytes_written; +} + +bool WriteFileDescriptor(int fd, span data) { + // Allow for partial writes. + ssize_t bytes_written_total = 0; + ssize_t size = checked_cast(data.size()); + for (ssize_t bytes_written_partial = 0; bytes_written_total < size; + bytes_written_total += bytes_written_partial) { + bytes_written_partial = + HANDLE_EINTR(write(fd, data.data() + bytes_written_total, + static_cast(size - bytes_written_total))); + if (bytes_written_partial < 0) + return false; + } + + return true; +} + +bool WriteFileDescriptor(int fd, StringPiece data) { + return WriteFileDescriptor(fd, as_bytes(make_span(data))); +} +#endif // !defined(MOZ_ZUCCHINI) + +bool AllocateFileRegion(File* file, int64_t offset, size_t size) { + DCHECK(file); + + // Explicitly extend |file| to the maximum size. Zeros will fill the new + // space. It is assumed that the existing file is fully realized as + // otherwise the entire file would have to be read and possibly written. + const int64_t original_file_len = file->GetLength(); + if (original_file_len < 0) { + DPLOG(ERROR) << "fstat " << file->GetPlatformFile(); + return false; + } + + // Increase the actual length of the file, if necessary. This can fail if + // the disk is full and the OS doesn't support sparse files. + const int64_t new_file_len = offset + static_cast(size); + // If the first condition fails, the cast on the previous line was invalid + // (though not UB). + if (!IsValueInRangeForNumericType(size) || + !IsValueInRangeForNumericType(size) || + !IsValueInRangeForNumericType(new_file_len) || + !file->SetLength(std::max(original_file_len, new_file_len))) { + DPLOG(ERROR) << "ftruncate " << file->GetPlatformFile(); + return false; + } + + // Realize the extent of the file so that it can't fail (and crash) later + // when trying to write to a memory page that can't be created. This can + // fail if the disk is full and the file is sparse. + + // First try the more effective platform-specific way of allocating the disk + // space. It can fail because the filesystem doesn't support it. In that case, + // use the manual method below. + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) + if (HANDLE_EINTR(fallocate(file->GetPlatformFile(), 0, offset, + static_cast(size))) != -1) + return true; + DPLOG(ERROR) << "fallocate"; +#elif BUILDFLAG(IS_APPLE) + // MacOS doesn't support fallocate even though their new APFS filesystem + // does support sparse files. It does, however, have the functionality + // available via fcntl. + // See also: https://openradar.appspot.com/32720223 + fstore_t params = {F_ALLOCATEALL, F_PEOFPOSMODE, offset, + static_cast(size), 0}; + if (fcntl(file->GetPlatformFile(), F_PREALLOCATE, ¶ms) != -1) + return true; + DPLOG(ERROR) << "F_PREALLOCATE"; +#endif + + // Manually realize the extended file by writing bytes to it at intervals. + blksize_t block_size = 512; // Start with something safe. + stat_wrapper_t statbuf; + if (File::Fstat(file->GetPlatformFile(), &statbuf) == 0 && + statbuf.st_blksize > 0 && base::bits::IsPowerOfTwo(statbuf.st_blksize)) { + block_size = static_cast(statbuf.st_blksize); + } + + // Write starting at the next block boundary after the old file length. + const int64_t extension_start = checked_cast(base::bits::AlignUp( + static_cast(original_file_len), static_cast(block_size))); + for (int64_t i = extension_start; i < new_file_len; i += block_size) { + char existing_byte; + if (HANDLE_EINTR(pread(file->GetPlatformFile(), &existing_byte, 1, + static_cast(i))) != 1) { + return false; // Can't read? Not viable. + } + if (existing_byte != 0) { + continue; // Block has data so must already exist. + } + if (HANDLE_EINTR(pwrite(file->GetPlatformFile(), &existing_byte, 1, + static_cast(i))) != 1) { + return false; // Can't write? Not viable. + } + } + + return true; +} + +#if !defined(MOZ_ZUCCHINI) +bool AppendToFile(const FilePath& filename, span data) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + bool ret = true; + int fd = HANDLE_EINTR(open(filename.value().c_str(), O_WRONLY | O_APPEND)); + if (fd < 0) { + VPLOG(1) << "Unable to create file " << filename.value(); + return false; + } + + // This call will either write all of the data or return false. + if (!WriteFileDescriptor(fd, data)) { + VPLOG(1) << "Error while writing to file " << filename.value(); + ret = false; + } + + if (IGNORE_EINTR(close(fd)) < 0) { + VPLOG(1) << "Error while closing file " << filename.value(); + return false; + } + + return ret; +} + +bool AppendToFile(const FilePath& filename, StringPiece data) { + return AppendToFile(filename, as_bytes(make_span(data))); +} +#endif // !defined(MOZ_ZUCCHINI) + +bool GetCurrentDirectory(FilePath* dir) { + // getcwd can return ENOENT, which implies it checks against the disk. + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + char system_buffer[PATH_MAX] = ""; + if (!getcwd(system_buffer, sizeof(system_buffer))) { + return false; + } + *dir = FilePath(system_buffer); + return true; +} + +#if !defined(MOZ_ZUCCHINI) +bool SetCurrentDirectory(const FilePath& path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + return chdir(path.value().c_str()) == 0; +} + +#if BUILDFLAG(IS_MAC) +bool VerifyPathControlledByUser(const FilePath& base, + const FilePath& path, + uid_t owner_uid, + const std::set& group_gids) { + if (base != path && !base.IsParent(path)) { + DLOG(ERROR) << "|base| must be a subdirectory of |path|. base = \"" + << base.value() << "\", path = \"" << path.value() << "\""; + return false; + } + + std::vector base_components = base.GetComponents(); + std::vector path_components = path.GetComponents(); + std::vector::const_iterator ib, ip; + for (ib = base_components.begin(), ip = path_components.begin(); + ib != base_components.end(); ++ib, ++ip) { + // |base| must be a subpath of |path|, so all components should match. + // If these CHECKs fail, look at the test that base is a parent of + // path at the top of this function. + DCHECK(ip != path_components.end()); + DCHECK(*ip == *ib); + } + + FilePath current_path = base; + if (!VerifySpecificPathControlledByUser(current_path, owner_uid, group_gids)) + return false; + + for (; ip != path_components.end(); ++ip) { + current_path = current_path.Append(*ip); + if (!VerifySpecificPathControlledByUser( + current_path, owner_uid, group_gids)) + return false; + } + return true; +} + +bool VerifyPathControlledByAdmin(const FilePath& path) { + const unsigned kRootUid = 0; + const FilePath kFileSystemRoot("/"); + + // The name of the administrator group on mac os. + const char* const kAdminGroupNames[] = { + "admin", + "wheel" + }; + + // Reading the groups database may touch the file system. + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + std::set allowed_group_ids; + for (int i = 0, ie = std::size(kAdminGroupNames); i < ie; ++i) { + struct group *group_record = getgrnam(kAdminGroupNames[i]); + if (!group_record) { + DPLOG(ERROR) << "Could not get the group ID of group \"" + << kAdminGroupNames[i] << "\"."; + continue; + } + + allowed_group_ids.insert(group_record->gr_gid); + } + + return VerifyPathControlledByUser( + kFileSystemRoot, path, kRootUid, allowed_group_ids); +} +#endif // BUILDFLAG(IS_MAC) + +int GetMaximumPathComponentLength(const FilePath& path) { +#if BUILDFLAG(IS_FUCHSIA) + // Return a value we do not expect anyone ever to reach, but which is small + // enough to guard against e.g. bugs causing multi-megabyte paths. + return 1024; +#else + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + return saturated_cast(pathconf(path.value().c_str(), _PC_NAME_MAX)); +#endif +} + +#if !BUILDFLAG(IS_ANDROID) +// This is implemented in file_util_android.cc for that platform. +bool GetShmemTempDir(bool executable, FilePath* path) { +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_AIX) + bool disable_dev_shm = false; +#if !BUILDFLAG(IS_CHROMEOS) + disable_dev_shm = CommandLine::ForCurrentProcess()->HasSwitch( + switches::kDisableDevShmUsage); +#endif + bool use_dev_shm = true; + if (executable) { + static const bool s_dev_shm_executable = + IsPathExecutable(FilePath("/dev/shm")); + use_dev_shm = s_dev_shm_executable; + } + if (use_dev_shm && !disable_dev_shm) { + *path = FilePath("/dev/shm"); + return true; + } +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_AIX) + return GetTempDir(path); +} +#endif // !BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_APPLE) +// Mac has its own implementation, this is for all other Posix systems. +bool CopyFile(const FilePath& from_path, const FilePath& to_path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + File infile; +#if BUILDFLAG(IS_ANDROID) + if (from_path.IsContentUri()) { + infile = OpenContentUriForRead(from_path); + } else { + infile = File(from_path, File::FLAG_OPEN | File::FLAG_READ); + } +#else + infile = File(from_path, File::FLAG_OPEN | File::FLAG_READ); +#endif + if (!infile.IsValid()) + return false; + + File outfile(to_path, File::FLAG_WRITE | File::FLAG_CREATE_ALWAYS); + if (!outfile.IsValid()) + return false; + + return CopyFileContents(infile, outfile); +} +#endif // !BUILDFLAG(IS_APPLE) + +bool PreReadFile(const FilePath& file_path, + bool is_executable, + int64_t max_bytes) { + DCHECK_GE(max_bytes, 0); + + // posix_fadvise() is only available in the Android NDK in API 21+. Older + // versions may have the required kernel support, but don't have enough usage + // to justify backporting. +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || \ + (BUILDFLAG(IS_ANDROID) && __ANDROID_API__ >= 21) + File file(file_path, File::FLAG_OPEN | File::FLAG_READ); + if (!file.IsValid()) + return false; + + if (max_bytes == 0) { + // fadvise() pre-fetches the entire file when given a zero length. + return true; + } + + const PlatformFile fd = file.GetPlatformFile(); + const ::off_t len = base::saturated_cast<::off_t>(max_bytes); + return posix_fadvise(fd, /*offset=*/0, len, POSIX_FADV_WILLNEED) == 0; +#elif BUILDFLAG(IS_APPLE) + File file(file_path, File::FLAG_OPEN | File::FLAG_READ); + if (!file.IsValid()) + return false; + + if (max_bytes == 0) { + // fcntl(F_RDADVISE) fails when given a zero length. + return true; + } + + const PlatformFile fd = file.GetPlatformFile(); + ::radvisory read_advise_data = { + .ra_offset = 0, .ra_count = base::saturated_cast(max_bytes)}; + return fcntl(fd, F_RDADVISE, &read_advise_data) != -1; +#else + return internal::PreReadFileSlow(file_path, max_bytes); +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || + // (BUILDFLAG(IS_ANDROID) && + // __ANDROID_API__ >= 21) +} + +// ----------------------------------------------------------------------------- + +namespace internal { + +bool MoveUnsafe(const FilePath& from_path, const FilePath& to_path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + // Windows compatibility: if |to_path| exists, |from_path| and |to_path| + // must be the same type, either both files, or both directories. + stat_wrapper_t to_file_info; + if (File::Stat(to_path.value().c_str(), &to_file_info) == 0) { + stat_wrapper_t from_file_info; + if (File::Stat(from_path.value().c_str(), &from_file_info) != 0) + return false; + if (S_ISDIR(to_file_info.st_mode) != S_ISDIR(from_file_info.st_mode)) + return false; + } + + if (rename(from_path.value().c_str(), to_path.value().c_str()) == 0) + return true; + + if (!CopyDirectory(from_path, to_path, true)) + return false; + + DeletePathRecursively(from_path); + return true; +} + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) +bool CopyFileContentsWithSendfile(File& infile, + File& outfile, + bool& retry_slow) { + DCHECK(infile.IsValid()); + stat_wrapper_t in_file_info; + retry_slow = false; + + if (base::File::Fstat(infile.GetPlatformFile(), &in_file_info)) { + return false; + } + + int64_t file_size = in_file_info.st_size; + if (file_size < 0) + return false; + if (file_size == 0) { + // Non-regular files can return a file size of 0, things such as pipes, + // sockets, etc. Additionally, kernel seq_files(most procfs files) will also + // return 0 while still reporting as a regular file. Unfortunately, in some + // of these situations there are easy ways to detect them, in others there + // are not. No extra syscalls are needed if it's not a regular file. + // + // Because any attempt to detect it would likely require another syscall, + // let's just fall back to a slow copy which will invoke a single read(2) to + // determine if the file has contents or if it's really a zero length file. + retry_slow = true; + return false; + } + + size_t copied = 0; + ssize_t res = 0; + do { + // Don't specify an offset and the kernel will begin reading/writing to the + // current file offsets. + res = HANDLE_EINTR(sendfile( + outfile.GetPlatformFile(), infile.GetPlatformFile(), /*offset=*/nullptr, + /*length=*/static_cast(file_size) - copied)); + if (res <= 0) { + break; + } + + copied += static_cast(res); + } while (copied < static_cast(file_size)); + + // Fallback on non-fatal error cases. None of these errors can happen after + // data has started copying, a check is included for good measure. As a result + // file sizes and file offsets will not have changed. A slow fallback and + // proceed without issues. + retry_slow = (copied == 0 && res < 0 && + (errno == EINVAL || errno == ENOSYS || errno == EPERM)); + + return res >= 0; +} +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || + // BUILDFLAG(IS_ANDROID) + +} // namespace internal + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_AIX) +BASE_EXPORT bool IsPathExecutable(const FilePath& path) { + bool result = false; + FilePath tmp_file_path; + + ScopedFD fd = CreateAndOpenFdForTemporaryFileInDir(path, &tmp_file_path); + if (fd.is_valid()) { + DeleteFile(tmp_file_path); + long sysconf_result = sysconf(_SC_PAGESIZE); + CHECK_GE(sysconf_result, 0); + size_t pagesize = static_cast(sysconf_result); + CHECK_GE(sizeof(pagesize), sizeof(sysconf_result)); + void* mapping = mmap(nullptr, pagesize, PROT_READ, MAP_SHARED, fd.get(), 0); + if (mapping != MAP_FAILED) { + if (HANDLE_EINTR(mprotect(mapping, pagesize, PROT_READ | PROT_EXEC)) == 0) + result = true; + munmap(mapping, pagesize); + } + } + return result; +} +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_AIX) +#endif // !defined(MOZ_ZUCCHINI) +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_util_win.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_util_win.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_util_win.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_util_win.cc 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,1291 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file_util.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#if !defined(MOZ_ZUCCHINI) +#include "base/check.h" +#include "base/clang_profiling_buildflags.h" +#include "base/debug/alias.h" +#include "base/feature_list.h" +#include "base/features.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/files/file_enumerator.h" +#include "base/files/file_path.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/files/memory_mapped_file.h" +#include "base/functional/bind.h" +#include "base/functional/callback.h" +#include "base/location.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/logging.h" +#include "base/numerics/safe_conversions.h" +#include "base/path_service.h" +#include "base/process/process_handle.h" +#include "base/rand_util.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/strings/strcat.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/strings/string_number_conversions.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/strings/string_piece.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/strings/string_util.h" +#include "base/strings/string_util_win.h" +#include "base/strings/utf_string_conversions.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/task/bind_post_task.h" +#include "base/task/sequenced_task_runner.h" +#include "base/task/thread_pool.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/threading/scoped_blocking_call.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/threading/scoped_thread_priority.h" +#include "base/time/time.h" +#include "base/uuid.h" +#include "base/win/scoped_handle.h" +#include "base/win/security_util.h" +#include "base/win/sid.h" +#include "base/win/windows_types.h" +#include "base/win/windows_version.h" +#endif // !defined(MOZ_ZUCCHINI) + +namespace base { + +namespace { + +#if !defined(MOZ_ZUCCHINI) +int g_extra_allowed_path_for_no_execute = 0; +#endif // !defined(MOZ_ZUCCHINI) + +const DWORD kFileShareAll = + FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE; +const wchar_t kDefaultTempDirPrefix[] = L"ChromiumTemp"; + +// Returns the Win32 last error code or ERROR_SUCCESS if the last error code is +// ERROR_FILE_NOT_FOUND or ERROR_PATH_NOT_FOUND. This is useful in cases where +// the absence of a file or path is a success condition (e.g., when attempting +// to delete an item in the filesystem). +DWORD ReturnLastErrorOrSuccessOnNotFound() { + const DWORD error_code = ::GetLastError(); + return (error_code == ERROR_FILE_NOT_FOUND || + error_code == ERROR_PATH_NOT_FOUND) + ? ERROR_SUCCESS + : error_code; +} + +// Deletes all files and directories in a path. +// Returns ERROR_SUCCESS on success or the Windows error code corresponding to +// the first error encountered. ERROR_FILE_NOT_FOUND and ERROR_PATH_NOT_FOUND +// are considered success conditions, and are therefore never returned. +DWORD DeleteFileRecursive(const FilePath& path, + const FilePath::StringType& pattern, + bool recursive) { + FileEnumerator traversal(path, false, + FileEnumerator::FILES | FileEnumerator::DIRECTORIES, + pattern); + DWORD result = ERROR_SUCCESS; + for (FilePath current = traversal.Next(); !current.empty(); + current = traversal.Next()) { + // Try to clear the read-only bit if we find it. + FileEnumerator::FileInfo info = traversal.GetInfo(); + if ((info.find_data().dwFileAttributes & FILE_ATTRIBUTE_READONLY) && + (recursive || !info.IsDirectory())) { + ::SetFileAttributes( + current.value().c_str(), + info.find_data().dwFileAttributes & ~DWORD{FILE_ATTRIBUTE_READONLY}); + } + + DWORD this_result = ERROR_SUCCESS; + if (info.IsDirectory()) { + if (recursive) { + this_result = DeleteFileRecursive(current, pattern, true); + DCHECK_NE(static_cast(this_result), ERROR_FILE_NOT_FOUND); + DCHECK_NE(static_cast(this_result), ERROR_PATH_NOT_FOUND); + if (this_result == ERROR_SUCCESS && + !::RemoveDirectory(current.value().c_str())) { + this_result = ReturnLastErrorOrSuccessOnNotFound(); + } + } + } else if (!::DeleteFile(current.value().c_str())) { + this_result = ReturnLastErrorOrSuccessOnNotFound(); + } + if (result == ERROR_SUCCESS) + result = this_result; + } + return result; +} + +// Appends |mode_char| to |mode| before the optional character set encoding; see +// https://msdn.microsoft.com/library/yeby3zcb.aspx for details. +void AppendModeCharacter(wchar_t mode_char, std::wstring* mode) { + size_t comma_pos = mode->find(L','); + mode->insert(comma_pos == std::wstring::npos ? mode->length() : comma_pos, 1, + mode_char); +} + +#if !defined(MOZ_ZUCCHINI) +bool DoCopyFile(const FilePath& from_path, + const FilePath& to_path, + bool fail_if_exists) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + if (from_path.ReferencesParent() || to_path.ReferencesParent()) + return false; + + // NOTE: I suspect we could support longer paths, but that would involve + // analyzing all our usage of files. + if (from_path.value().length() >= MAX_PATH || + to_path.value().length() >= MAX_PATH) { + return false; + } + + // Mitigate the issues caused by loading DLLs on a background thread + // (http://crbug/973868). + SCOPED_MAY_LOAD_LIBRARY_AT_BACKGROUND_PRIORITY(); + + // Unlike the posix implementation that copies the file manually and discards + // the ACL bits, CopyFile() copies the complete SECURITY_DESCRIPTOR and access + // bits, which is usually not what we want. We can't do much about the + // SECURITY_DESCRIPTOR but at least remove the read only bit. + const wchar_t* dest = to_path.value().c_str(); + if (!::CopyFile(from_path.value().c_str(), dest, fail_if_exists)) { + // Copy failed. + return false; + } + DWORD attrs = GetFileAttributes(dest); + if (attrs == INVALID_FILE_ATTRIBUTES) { + return false; + } + if (attrs & FILE_ATTRIBUTE_READONLY) { + SetFileAttributes(dest, attrs & ~DWORD{FILE_ATTRIBUTE_READONLY}); + } + return true; +} + +bool DoCopyDirectory(const FilePath& from_path, + const FilePath& to_path, + bool recursive, + bool fail_if_exists) { + // NOTE(maruel): Previous version of this function used to call + // SHFileOperation(). This used to copy the file attributes and extended + // attributes, OLE structured storage, NTFS file system alternate data + // streams, SECURITY_DESCRIPTOR. In practice, this is not what we want, we + // want the containing directory to propagate its SECURITY_DESCRIPTOR. + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + // NOTE: I suspect we could support longer paths, but that would involve + // analyzing all our usage of files. + if (from_path.value().length() >= MAX_PATH || + to_path.value().length() >= MAX_PATH) { + return false; + } + + // This function does not properly handle destinations within the source. + FilePath real_to_path = to_path; + if (PathExists(real_to_path)) { + real_to_path = MakeAbsoluteFilePath(real_to_path); + if (real_to_path.empty()) + return false; + } else { + real_to_path = MakeAbsoluteFilePath(real_to_path.DirName()); + if (real_to_path.empty()) + return false; + } + FilePath real_from_path = MakeAbsoluteFilePath(from_path); + if (real_from_path.empty()) + return false; + if (real_to_path == real_from_path || real_from_path.IsParent(real_to_path)) + return false; + + int traverse_type = FileEnumerator::FILES; + if (recursive) + traverse_type |= FileEnumerator::DIRECTORIES; + FileEnumerator traversal(from_path, recursive, traverse_type); + + if (!PathExists(from_path)) { + DLOG(ERROR) << "CopyDirectory() couldn't stat source directory: " + << from_path.value().c_str(); + return false; + } + // TODO(maruel): This is not necessary anymore. + DCHECK(recursive || DirectoryExists(from_path)); + + FilePath current = from_path; + bool from_is_dir = DirectoryExists(from_path); + bool success = true; + FilePath from_path_base = from_path; + if (recursive && DirectoryExists(to_path)) { + // If the destination already exists and is a directory, then the + // top level of source needs to be copied. + from_path_base = from_path.DirName(); + } + + while (success && !current.empty()) { + // current is the source path, including from_path, so append + // the suffix after from_path to to_path to create the target_path. + FilePath target_path(to_path); + if (from_path_base != current) { + if (!from_path_base.AppendRelativePath(current, &target_path)) { + success = false; + break; + } + } + + if (from_is_dir) { + if (!DirectoryExists(target_path) && + !::CreateDirectory(target_path.value().c_str(), NULL)) { + DLOG(ERROR) << "CopyDirectory() couldn't create directory: " + << target_path.value().c_str(); + success = false; + } + } else if (!DoCopyFile(current, target_path, fail_if_exists)) { + DLOG(ERROR) << "CopyDirectory() couldn't create file: " + << target_path.value().c_str(); + success = false; + } + + current = traversal.Next(); + if (!current.empty()) + from_is_dir = traversal.GetInfo().IsDirectory(); + } + + return success; +} +#endif // !defined(MOZ_ZUCCHINI) + +// Returns ERROR_SUCCESS on success, or a Windows error code on failure. +DWORD DoDeleteFile(const FilePath& path, bool recursive) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + if (path.empty()) + return ERROR_SUCCESS; + + if (path.value().length() >= MAX_PATH) + return ERROR_BAD_PATHNAME; + + // Handle any path with wildcards. + if (path.BaseName().value().find_first_of(FILE_PATH_LITERAL("*?")) != + FilePath::StringType::npos) { + const DWORD error_code = + DeleteFileRecursive(path.DirName(), path.BaseName().value(), recursive); + DCHECK_NE(static_cast(error_code), ERROR_FILE_NOT_FOUND); + DCHECK_NE(static_cast(error_code), ERROR_PATH_NOT_FOUND); + return error_code; + } + + // Report success if the file or path does not exist. + const DWORD attr = ::GetFileAttributes(path.value().c_str()); + if (attr == INVALID_FILE_ATTRIBUTES) + return ReturnLastErrorOrSuccessOnNotFound(); + + // Clear the read-only bit if it is set. + if ((attr & FILE_ATTRIBUTE_READONLY) && + !::SetFileAttributes(path.value().c_str(), + attr & ~DWORD{FILE_ATTRIBUTE_READONLY})) { + // It's possible for |path| to be gone now under a race with other deleters. + return ReturnLastErrorOrSuccessOnNotFound(); + } + + // Perform a simple delete on anything that isn't a directory. + if (!(attr & FILE_ATTRIBUTE_DIRECTORY)) { + return ::DeleteFile(path.value().c_str()) + ? ERROR_SUCCESS + : ReturnLastErrorOrSuccessOnNotFound(); + } + + if (recursive) { + const DWORD error_code = + DeleteFileRecursive(path, FILE_PATH_LITERAL("*"), true); + DCHECK_NE(static_cast(error_code), ERROR_FILE_NOT_FOUND); + DCHECK_NE(static_cast(error_code), ERROR_PATH_NOT_FOUND); + if (error_code != ERROR_SUCCESS) + return error_code; + } + return ::RemoveDirectory(path.value().c_str()) + ? ERROR_SUCCESS + : ReturnLastErrorOrSuccessOnNotFound(); +} + +// Deletes the file/directory at |path| (recursively if |recursive| and |path| +// names a directory), returning true on success. Sets the Windows last-error +// code and returns false on failure. +bool DeleteFileOrSetLastError(const FilePath& path, bool recursive) { + const DWORD error = DoDeleteFile(path, recursive); + if (error == ERROR_SUCCESS) + return true; + + ::SetLastError(error); + return false; +} + +#if !defined(MOZ_ZUCCHINI) +constexpr int kMaxDeleteAttempts = 9; + +void DeleteFileWithRetry(const FilePath& path, + bool recursive, + int attempt, + OnceCallback reply_callback) { + // Retry every 250ms for up to two seconds. These values were pulled out of + // thin air, and may be adjusted in the future based on the metrics collected. + static constexpr TimeDelta kDeleteFileRetryDelay = Milliseconds(250); + + if (DeleteFileOrSetLastError(path, recursive)) { + // Consider introducing further retries until the item has been removed from + // the filesystem and its name is ready for reuse; see the comments in + // chrome/installer/mini_installer/delete_with_retry.cc for details. + if (!reply_callback.is_null()) + std::move(reply_callback).Run(true); + return; + } + + ++attempt; + DCHECK_LE(attempt, kMaxDeleteAttempts); + if (attempt == kMaxDeleteAttempts) { + if (!reply_callback.is_null()) + std::move(reply_callback).Run(false); + return; + } + + ThreadPool::PostDelayedTask(FROM_HERE, + {TaskPriority::BEST_EFFORT, MayBlock()}, + BindOnce(&DeleteFileWithRetry, path, recursive, + attempt, std::move(reply_callback)), + kDeleteFileRetryDelay); +} + +OnceClosure GetDeleteFileCallbackInternal( + const FilePath& path, + bool recursive, + OnceCallback reply_callback) { + OnceCallback bound_callback; + if (!reply_callback.is_null()) { + bound_callback = BindPostTask(SequencedTaskRunner::GetCurrentDefault(), + std::move(reply_callback)); + } + return BindOnce(&DeleteFileWithRetry, path, recursive, /*attempt=*/0, + std::move(bound_callback)); +} + +// This function verifies that no code is attempting to set an ACL on a file +// that is outside of 'safe' paths. A 'safe' path is defined as one that is +// within the user data dir, or the temporary directory. This is explicitly to +// prevent code from trying to pass a writeable handle to a file outside of +// these directories to an untrusted process. E.g. if some future code created a +// writeable handle to a file in c:\users\user\sensitive.dat, this DCHECK would +// hit. Setting an ACL on a file outside of these chrome-controlled directories +// might cause the browser or operating system to fail in unexpected ways. +bool IsPathSafeToSetAclOn(const FilePath& path) { +#if BUILDFLAG(CLANG_PROFILING) + // Ignore .profraw profiling files, as they can occur anywhere, and only occur + // during testing. + if (path.Extension() == FILE_PATH_LITERAL(".profraw")) { + return true; + } +#endif // BUILDFLAG(CLANG_PROFILING) + std::vector valid_path_keys({DIR_TEMP}); + if (g_extra_allowed_path_for_no_execute) { + valid_path_keys.push_back(g_extra_allowed_path_for_no_execute); + } + + // MakeLongFilePath is needed here because temp files can have an 8.3 path + // under certain conditions. See comments in base::MakeLongFilePath. + FilePath long_path = MakeLongFilePath(path); + DCHECK(!long_path.empty()) << "Cannot get long path for " << path; + + std::vector valid_paths; + for (const auto path_key : valid_path_keys) { + FilePath valid_path; + if (!PathService::Get(path_key, &valid_path)) { + DLOG(FATAL) << "Cannot get path for pathservice key " << path_key; + continue; + } + valid_paths.push_back(valid_path); + } + + // Admin users create temporary files in `GetSecureSystemTemp`, see + // `CreateNewTempDirectory` below. + FilePath secure_system_temp; + if (::IsUserAnAdmin() && GetSecureSystemTemp(&secure_system_temp)) { + valid_paths.push_back(secure_system_temp); + } + + for (const auto& valid_path : valid_paths) { + // Temp files can sometimes have an 8.3 path. See comments in + // `MakeLongFilePath`. + FilePath full_path = MakeLongFilePath(valid_path); + DCHECK(!full_path.empty()) << "Cannot get long path for " << valid_path; + if (full_path.IsParent(long_path)) { + return true; + } + } + + return false; +} +#endif // !defined(MOZ_ZUCCHINI) + +} // namespace + +#if !defined(MOZ_ZUCCHINI) +OnceClosure GetDeleteFileCallback(const FilePath& path, + OnceCallback reply_callback) { + return GetDeleteFileCallbackInternal(path, /*recursive=*/false, + std::move(reply_callback)); +} + +OnceClosure GetDeletePathRecursivelyCallback( + const FilePath& path, + OnceCallback reply_callback) { + return GetDeleteFileCallbackInternal(path, /*recursive=*/true, + std::move(reply_callback)); +} +#endif // !defined(MOZ_ZUCCHINI) + +FilePath MakeAbsoluteFilePath(const FilePath& input) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + wchar_t file_path[MAX_PATH]; + if (!_wfullpath(file_path, input.value().c_str(), MAX_PATH)) + return FilePath(); + return FilePath(file_path); +} + +bool DeleteFile(const FilePath& path) { + return DeleteFileOrSetLastError(path, /*recursive=*/false); +} + +bool DeletePathRecursively(const FilePath& path) { + return DeleteFileOrSetLastError(path, /*recursive=*/true); +} + +#if !defined(MOZ_ZUCCHINI) +bool DeleteFileAfterReboot(const FilePath& path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + if (path.value().length() >= MAX_PATH) + return false; + + return ::MoveFileEx(path.value().c_str(), nullptr, + MOVEFILE_DELAY_UNTIL_REBOOT); +} + +bool ReplaceFile(const FilePath& from_path, + const FilePath& to_path, + File::Error* error) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + // Alias paths for investigation of shutdown hangs. crbug.com/1054164 + FilePath::CharType from_path_str[MAX_PATH]; + base::wcslcpy(from_path_str, from_path.value().c_str(), + std::size(from_path_str)); + base::debug::Alias(from_path_str); + FilePath::CharType to_path_str[MAX_PATH]; + base::wcslcpy(to_path_str, to_path.value().c_str(), std::size(to_path_str)); + base::debug::Alias(to_path_str); + + // Assume that |to_path| already exists and try the normal replace. This will + // fail with ERROR_FILE_NOT_FOUND if |to_path| does not exist. When writing to + // a network share, we may not be able to change the ACLs. Ignore ACL errors + // then (REPLACEFILE_IGNORE_MERGE_ERRORS). + if (::ReplaceFile(to_path.value().c_str(), from_path.value().c_str(), NULL, + REPLACEFILE_IGNORE_MERGE_ERRORS, NULL, NULL)) { + return true; + } + + File::Error replace_error = File::OSErrorToFileError(GetLastError()); + + // Try a simple move next. It will only succeed when |to_path| doesn't already + // exist. + if (::MoveFile(from_path.value().c_str(), to_path.value().c_str())) + return true; + + // In the case of FILE_ERROR_NOT_FOUND from ReplaceFile, it is likely that + // |to_path| does not exist. In this case, the more relevant error comes + // from the call to MoveFile. + if (error) { + *error = replace_error == File::FILE_ERROR_NOT_FOUND + ? File::GetLastFileError() + : replace_error; + } + return false; +} + +bool CopyDirectory(const FilePath& from_path, + const FilePath& to_path, + bool recursive) { + return DoCopyDirectory(from_path, to_path, recursive, false); +} + +bool CopyDirectoryExcl(const FilePath& from_path, + const FilePath& to_path, + bool recursive) { + return DoCopyDirectory(from_path, to_path, recursive, true); +} +#endif // !defined(MOZ_ZUCCHINI) + +bool PathExists(const FilePath& path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + return (GetFileAttributes(path.value().c_str()) != INVALID_FILE_ATTRIBUTES); +} + +namespace { + +bool PathHasAccess(const FilePath& path, + DWORD dir_desired_access, + DWORD file_desired_access) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + const wchar_t* const path_str = path.value().c_str(); + DWORD fileattr = GetFileAttributes(path_str); + if (fileattr == INVALID_FILE_ATTRIBUTES) + return false; + + bool is_directory = fileattr & FILE_ATTRIBUTE_DIRECTORY; + DWORD desired_access = + is_directory ? dir_desired_access : file_desired_access; + DWORD flags_and_attrs = + is_directory ? FILE_FLAG_BACKUP_SEMANTICS : FILE_ATTRIBUTE_NORMAL; + + win::ScopedHandle file(CreateFile(path_str, desired_access, kFileShareAll, + nullptr, OPEN_EXISTING, flags_and_attrs, + nullptr)); + + return file.is_valid(); +} + +} // namespace + +bool PathIsReadable(const FilePath& path) { + return PathHasAccess(path, FILE_LIST_DIRECTORY, GENERIC_READ); +} + +bool PathIsWritable(const FilePath& path) { + return PathHasAccess(path, FILE_ADD_FILE, GENERIC_WRITE); +} + +bool DirectoryExists(const FilePath& path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DWORD fileattr = GetFileAttributes(path.value().c_str()); + if (fileattr != INVALID_FILE_ATTRIBUTES) + return (fileattr & FILE_ATTRIBUTE_DIRECTORY) != 0; + return false; +} + +bool GetTempDir(FilePath* path) { + wchar_t temp_path[MAX_PATH + 1]; + DWORD path_len = ::GetTempPath(MAX_PATH, temp_path); + if (path_len >= MAX_PATH || path_len <= 0) + return false; + // TODO(evanm): the old behavior of this function was to always strip the + // trailing slash. We duplicate this here, but it shouldn't be necessary + // when everyone is using the appropriate FilePath APIs. + *path = FilePath(temp_path).StripTrailingSeparators(); + return true; +} + +FilePath GetHomeDir() { + wchar_t result[MAX_PATH]; + if (SUCCEEDED(SHGetFolderPath(NULL, CSIDL_PROFILE, NULL, SHGFP_TYPE_CURRENT, + result)) && + result[0]) { + return FilePath(result); + } + + // Fall back to the temporary directory on failure. + FilePath temp; + if (GetTempDir(&temp)) + return temp; + + // Last resort. + return FilePath(FILE_PATH_LITERAL("C:\\")); +} + +#if !defined(MOZ_ZUCCHINI) +File CreateAndOpenTemporaryFileInDir(const FilePath& dir, FilePath* temp_file) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + // Open the file with exclusive r/w/d access, and allow the caller to decide + // to mark it for deletion upon close after the fact. + constexpr uint32_t kFlags = File::FLAG_CREATE | File::FLAG_READ | + File::FLAG_WRITE | File::FLAG_WIN_EXCLUSIVE_READ | + File::FLAG_WIN_EXCLUSIVE_WRITE | + File::FLAG_CAN_DELETE_ON_CLOSE; + + // Use GUID instead of ::GetTempFileName() to generate unique file names. + // "Due to the algorithm used to generate file names, GetTempFileName can + // perform poorly when creating a large number of files with the same prefix. + // In such cases, it is recommended that you construct unique file names based + // on GUIDs." + // https://msdn.microsoft.com/library/windows/desktop/aa364991.aspx + + FilePath temp_name; + File file; + + // Although it is nearly impossible to get a duplicate name with GUID, we + // still use a loop here in case it happens. + for (int i = 0; i < 100; ++i) { + temp_name = dir.Append(FormatTemporaryFileName( + UTF8ToWide(Uuid::GenerateRandomV4().AsLowercaseString()))); + file.Initialize(temp_name, kFlags); + if (file.IsValid()) + break; + } + + if (!file.IsValid()) { + DPLOG(WARNING) << "Failed to get temporary file name in " << dir.value(); + return file; + } + + wchar_t long_temp_name[MAX_PATH + 1]; + const DWORD long_name_len = + GetLongPathName(temp_name.value().c_str(), long_temp_name, MAX_PATH); + if (long_name_len != 0 && long_name_len <= MAX_PATH) { + *temp_file = + FilePath(FilePath::StringPieceType(long_temp_name, long_name_len)); + } else { + // GetLongPathName() failed, but we still have a temporary file. + *temp_file = std::move(temp_name); + } + + return file; +} + +bool CreateTemporaryFileInDir(const FilePath& dir, FilePath* temp_file) { + return CreateAndOpenTemporaryFileInDir(dir, temp_file).IsValid(); +} + +FilePath FormatTemporaryFileName(FilePath::StringPieceType identifier) { + return FilePath(StrCat({identifier, FILE_PATH_LITERAL(".tmp")})); +} + +ScopedFILE CreateAndOpenTemporaryStreamInDir(const FilePath& dir, + FilePath* path) { + // Open file in binary mode, to avoid problems with fwrite. On Windows + // it replaces \n's with \r\n's, which may surprise you. + // Reference: http://msdn.microsoft.com/en-us/library/h9t88zwz(VS.71).aspx + return ScopedFILE( + FileToFILE(CreateAndOpenTemporaryFileInDir(dir, path), "wb+")); +} +#endif // !defined(MOZ_ZUCCHINI) + +bool CreateTemporaryDirInDir(const FilePath& base_dir, + const FilePath::StringType& prefix, + FilePath* new_dir) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + FilePath path_to_create; + + for (int count = 0; count < 50; ++count) { + // Try create a new temporary directory with random generated name. If + // the one exists, keep trying another path name until we reach some limit. + std::wstring new_dir_name; + new_dir_name.assign(prefix); + new_dir_name.append(AsWString(NumberToString16(GetCurrentProcId()))); + new_dir_name.push_back('_'); + new_dir_name.append(AsWString( + NumberToString16(RandInt(0, std::numeric_limits::max())))); + + path_to_create = base_dir.Append(new_dir_name); + if (::CreateDirectory(path_to_create.value().c_str(), NULL)) { + *new_dir = path_to_create; + return true; + } + } + + return false; +} + +bool GetSecureSystemTemp(FilePath* temp) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + CHECK(temp); + + for (const auto key : {DIR_WINDOWS, DIR_PROGRAM_FILES}) { + FilePath secure_system_temp; + if (!PathService::Get(key, &secure_system_temp)) { + continue; + } + + if (key == DIR_WINDOWS) { + secure_system_temp = secure_system_temp.AppendASCII("SystemTemp"); + } + + if (PathExists(secure_system_temp) && PathIsWritable(secure_system_temp)) { + *temp = secure_system_temp; + return true; + } + } + + return false; +} + +// The directory is created under `GetSecureSystemTemp` for security reasons if +// the caller is admin to avoid attacks from lower privilege processes. +// +// If unable to create a dir under `GetSecureSystemTemp`, the dir is created +// under %TEMP%. The reasons for not being able to create a dir under +// `GetSecureSystemTemp` could be because `%systemroot%\SystemTemp` does not +// exist, or unable to resolve `DIR_WINDOWS` or `DIR_PROGRAM_FILES`, say due to +// registry redirection, or unable to create a directory due to +// `GetSecureSystemTemp` being read-only or having atypical ACLs. +bool CreateNewTempDirectory(const FilePath::StringType& prefix, + FilePath* new_temp_path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + DCHECK(new_temp_path); + + FilePath parent_dir; + if (::IsUserAnAdmin() && GetSecureSystemTemp(&parent_dir) && + CreateTemporaryDirInDir(parent_dir, + prefix.empty() ? kDefaultTempDirPrefix : prefix, + new_temp_path)) { + return true; + } + + if (!GetTempDir(&parent_dir)) + return false; + + return CreateTemporaryDirInDir(parent_dir, prefix, new_temp_path); +} + +bool CreateDirectoryAndGetError(const FilePath& full_path, + File::Error* error) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + // If the path exists, we've succeeded if it's a directory, failed otherwise. + const wchar_t* const full_path_str = full_path.value().c_str(); + const DWORD fileattr = ::GetFileAttributes(full_path_str); + if (fileattr != INVALID_FILE_ATTRIBUTES) { + if ((fileattr & FILE_ATTRIBUTE_DIRECTORY) != 0) { + return true; + } + DLOG(WARNING) << "CreateDirectory(" << full_path_str << "), " + << "conflicts with existing file."; + if (error) + *error = File::FILE_ERROR_NOT_A_DIRECTORY; + ::SetLastError(ERROR_FILE_EXISTS); + return false; + } + + // Invariant: Path does not exist as file or directory. + + // Attempt to create the parent recursively. This will immediately return + // true if it already exists, otherwise will create all required parent + // directories starting with the highest-level missing parent. + FilePath parent_path(full_path.DirName()); + if (parent_path.value() == full_path.value()) { + if (error) + *error = File::FILE_ERROR_NOT_FOUND; + ::SetLastError(ERROR_FILE_NOT_FOUND); + return false; + } + if (!CreateDirectoryAndGetError(parent_path, error)) { + DLOG(WARNING) << "Failed to create one of the parent directories."; + DCHECK(!error || *error != File::FILE_OK); + return false; + } + + if (::CreateDirectory(full_path_str, NULL)) + return true; + + const DWORD error_code = ::GetLastError(); + if (error_code == ERROR_ALREADY_EXISTS && DirectoryExists(full_path)) { + // This error code ERROR_ALREADY_EXISTS doesn't indicate whether we were + // racing with someone creating the same directory, or a file with the same + // path. If DirectoryExists() returns true, we lost the race to create the + // same directory. + return true; + } + if (error) + *error = File::OSErrorToFileError(error_code); + ::SetLastError(error_code); + DPLOG(WARNING) << "Failed to create directory " << full_path_str; + return false; +} + +#if !defined(MOZ_ZUCCHINI) +bool NormalizeFilePath(const FilePath& path, FilePath* real_path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + File file(path, + File::FLAG_OPEN | File::FLAG_READ | File::FLAG_WIN_SHARE_DELETE); + if (!file.IsValid()) + return false; + + // The expansion of |path| into a full path may make it longer. + constexpr int kMaxPathLength = MAX_PATH + 10; + wchar_t native_file_path[kMaxPathLength]; + // kMaxPathLength includes space for trailing '\0' so we subtract 1. + // Returned length, used_wchars, does not include trailing '\0'. + // Failure is indicated by returning 0 or >= kMaxPathLength. + DWORD used_wchars = ::GetFinalPathNameByHandle( + file.GetPlatformFile(), native_file_path, kMaxPathLength - 1, + FILE_NAME_NORMALIZED | VOLUME_NAME_NT); + + if (used_wchars >= kMaxPathLength || used_wchars == 0) + return false; + + // GetFinalPathNameByHandle() returns the \\?\ syntax for file names and + // existing code expects we return a path starting 'X:\' so we call + // DevicePathToDriveLetterPath rather than using VOLUME_NAME_DOS above. + return DevicePathToDriveLetterPath( + FilePath(FilePath::StringPieceType(native_file_path, used_wchars)), + real_path); +} + +bool DevicePathToDriveLetterPath(const FilePath& nt_device_path, + FilePath* out_drive_letter_path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + // Get the mapping of drive letters to device paths. + const int kDriveMappingSize = 1024; + wchar_t drive_mapping[kDriveMappingSize] = {'\0'}; + if (!::GetLogicalDriveStrings(kDriveMappingSize - 1, drive_mapping)) { + DLOG(ERROR) << "Failed to get drive mapping."; + return false; + } + + // The drive mapping is a sequence of null terminated strings. + // The last string is empty. + wchar_t* drive_map_ptr = drive_mapping; + wchar_t device_path_as_string[MAX_PATH]; + wchar_t drive[] = FILE_PATH_LITERAL(" :"); + + // For each string in the drive mapping, get the junction that links + // to it. If that junction is a prefix of |device_path|, then we + // know that |drive| is the real path prefix. + while (*drive_map_ptr) { + drive[0] = drive_map_ptr[0]; // Copy the drive letter. + + if (QueryDosDevice(drive, device_path_as_string, MAX_PATH)) { + FilePath device_path(device_path_as_string); + if (device_path == nt_device_path || + device_path.IsParent(nt_device_path)) { + *out_drive_letter_path = + FilePath(drive + nt_device_path.value().substr( + wcslen(device_path_as_string))); + return true; + } + } + // Move to the next drive letter string, which starts one + // increment after the '\0' that terminates the current string. + while (*drive_map_ptr++) {} + } + + // No drive matched. The path does not start with a device junction + // that is mounted as a drive letter. This means there is no drive + // letter path to the volume that holds |device_path|, so fail. + return false; +} + +FilePath MakeLongFilePath(const FilePath& input) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + DWORD path_long_len = ::GetLongPathName(input.value().c_str(), nullptr, 0); + if (path_long_len == 0UL) + return FilePath(); + + std::wstring path_long_str; + path_long_len = ::GetLongPathName(input.value().c_str(), + WriteInto(&path_long_str, path_long_len), + path_long_len); + if (path_long_len == 0UL) + return FilePath(); + + return FilePath(path_long_str); +} + +bool CreateWinHardLink(const FilePath& to_file, const FilePath& from_file) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + return ::CreateHardLink(to_file.value().c_str(), from_file.value().c_str(), + nullptr); +} + +// TODO(rkc): Work out if we want to handle NTFS junctions here or not, handle +// them if we do decide to. +bool IsLink(const FilePath& file_path) { + return false; +} + +bool GetFileInfo(const FilePath& file_path, File::Info* results) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + WIN32_FILE_ATTRIBUTE_DATA attr; + if (!GetFileAttributesEx(file_path.value().c_str(), GetFileExInfoStandard, + &attr)) { + return false; + } + + ULARGE_INTEGER size; + size.HighPart = attr.nFileSizeHigh; + size.LowPart = attr.nFileSizeLow; + // TODO(crbug.com/1333521): Change Info::size to uint64_t and eliminate this + // cast. + results->size = checked_cast(size.QuadPart); + + results->is_directory = + (attr.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; + results->last_modified = Time::FromFileTime(attr.ftLastWriteTime); + results->last_accessed = Time::FromFileTime(attr.ftLastAccessTime); + results->creation_time = Time::FromFileTime(attr.ftCreationTime); + + return true; +} +#endif // !defined(MOZ_ZUCCHINI) + +FILE* OpenFile(const FilePath& filename, const char* mode) { + // 'N' is unconditionally added below, so be sure there is not one already + // present before a comma in |mode|. + DCHECK( + strchr(mode, 'N') == nullptr || + (strchr(mode, ',') != nullptr && strchr(mode, 'N') > strchr(mode, ','))); + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + std::wstring w_mode = UTF8ToWide(mode); + AppendModeCharacter(L'N', &w_mode); + return _wfsopen(filename.value().c_str(), w_mode.c_str(), _SH_DENYNO); +} + +FILE* FileToFILE(File file, const char* mode) { + DCHECK(!file.async()); + if (!file.IsValid()) + return NULL; + int fd = + _open_osfhandle(reinterpret_cast(file.GetPlatformFile()), 0); + if (fd < 0) + return NULL; + file.TakePlatformFile(); + FILE* stream = _fdopen(fd, mode); + if (!stream) + _close(fd); + return stream; +} + +File FILEToFile(FILE* file_stream) { + if (!file_stream) + return File(); + + int fd = _fileno(file_stream); + DCHECK_GE(fd, 0); + intptr_t file_handle = _get_osfhandle(fd); + DCHECK_NE(file_handle, reinterpret_cast(INVALID_HANDLE_VALUE)); + + HANDLE other_handle = nullptr; + if (!::DuplicateHandle( + /*hSourceProcessHandle=*/GetCurrentProcess(), + reinterpret_cast(file_handle), + /*hTargetProcessHandle=*/GetCurrentProcess(), &other_handle, + /*dwDesiredAccess=*/0, + /*bInheritHandle=*/FALSE, + /*dwOptions=*/DUPLICATE_SAME_ACCESS)) { + return File(File::GetLastFileError()); + } + + return File(ScopedPlatformFile(other_handle)); +} + +#if !defined(MOZ_ZUCCHINI) +int ReadFile(const FilePath& filename, char* data, int max_size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + win::ScopedHandle file(CreateFile(filename.value().c_str(), GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, + OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, + NULL)); + if (!file.is_valid() || max_size < 0) + return -1; + + DWORD read; + if (::ReadFile(file.get(), data, static_cast(max_size), &read, NULL)) { + // TODO(crbug.com/1333521): Change to return some type with a uint64_t size + // and eliminate this cast. + return checked_cast(read); + } + + return -1; +} + +int WriteFile(const FilePath& filename, const char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + win::ScopedHandle file(CreateFile(filename.value().c_str(), GENERIC_WRITE, 0, + NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, + NULL)); + if (!file.is_valid() || size < 0) { + DPLOG(WARNING) << "WriteFile failed for path " << filename.value(); + return -1; + } + + DWORD written; + BOOL result = + ::WriteFile(file.get(), data, static_cast(size), &written, NULL); + if (result && static_cast(written) == size) + return static_cast(written); + + if (!result) { + // WriteFile failed. + DPLOG(WARNING) << "writing file " << filename.value() << " failed"; + } else { + // Didn't write all the bytes. + DLOG(WARNING) << "wrote" << written << " bytes to " << filename.value() + << " expected " << size; + } + return -1; +} + +bool AppendToFile(const FilePath& filename, span data) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + win::ScopedHandle file(CreateFile(filename.value().c_str(), FILE_APPEND_DATA, + 0, nullptr, OPEN_EXISTING, 0, nullptr)); + if (!file.is_valid()) { + VPLOG(1) << "CreateFile failed for path " << filename.value(); + return false; + } + + DWORD written; + DWORD size = checked_cast(data.size()); + BOOL result = ::WriteFile(file.get(), data.data(), size, &written, nullptr); + if (result && written == size) + return true; + + if (!result) { + // WriteFile failed. + VPLOG(1) << "Writing file " << filename.value() << " failed"; + } else { + // Didn't write all the bytes. + VPLOG(1) << "Only wrote " << written << " out of " << size << " byte(s) to " + << filename.value(); + } + return false; +} + +bool AppendToFile(const FilePath& filename, StringPiece data) { + return AppendToFile(filename, as_bytes(make_span(data))); +} +#endif // !defined(MOZ_ZUCCHINI) + +bool GetCurrentDirectory(FilePath* dir) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + wchar_t system_buffer[MAX_PATH]; + system_buffer[0] = 0; + DWORD len = ::GetCurrentDirectory(MAX_PATH, system_buffer); + if (len == 0 || len > MAX_PATH) + return false; + // TODO(evanm): the old behavior of this function was to always strip the + // trailing slash. We duplicate this here, but it shouldn't be necessary + // when everyone is using the appropriate FilePath APIs. + *dir = FilePath(FilePath::StringPieceType(system_buffer)) + .StripTrailingSeparators(); + return true; +} + +#if !defined(MOZ_ZUCCHINI) +bool SetCurrentDirectory(const FilePath& directory) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + return ::SetCurrentDirectory(directory.value().c_str()) != 0; +} + +int GetMaximumPathComponentLength(const FilePath& path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + wchar_t volume_path[MAX_PATH]; + if (!GetVolumePathNameW(path.NormalizePathSeparators().value().c_str(), + volume_path, std::size(volume_path))) { + return -1; + } + + DWORD max_length = 0; + if (!GetVolumeInformationW(volume_path, NULL, 0, NULL, &max_length, NULL, + NULL, 0)) { + return -1; + } + + // Length of |path| with path separator appended. + size_t prefix = path.StripTrailingSeparators().value().size() + 1; + // The whole path string must be shorter than MAX_PATH. That is, it must be + // prefix + component_length < MAX_PATH (or equivalently, <= MAX_PATH - 1). + int whole_path_limit = std::max(0, MAX_PATH - 1 - static_cast(prefix)); + return std::min(whole_path_limit, static_cast(max_length)); +} + +bool CopyFile(const FilePath& from_path, const FilePath& to_path) { + return DoCopyFile(from_path, to_path, false); +} + +bool SetNonBlocking(int fd) { + unsigned long nonblocking = 1; + if (ioctlsocket(static_cast(fd), static_cast(FIONBIO), + &nonblocking) == 0) + return true; + return false; +} + +bool PreReadFile(const FilePath& file_path, + bool is_executable, + int64_t max_bytes) { + DCHECK_GE(max_bytes, 0); + + if (max_bytes == 0) { + // ::PrefetchVirtualMemory() fails when asked to read zero bytes. + // base::MemoryMappedFile::Initialize() fails on an empty file. + return true; + } + + // ::PrefetchVirtualMemory() fails if the file is opened with write access. + MemoryMappedFile::Access access = is_executable + ? MemoryMappedFile::READ_CODE_IMAGE + : MemoryMappedFile::READ_ONLY; + MemoryMappedFile mapped_file; + if (!mapped_file.Initialize(file_path, access)) + return internal::PreReadFileSlow(file_path, max_bytes); + + const ::SIZE_T length = + std::min(base::saturated_cast<::SIZE_T>(max_bytes), + base::saturated_cast<::SIZE_T>(mapped_file.length())); + ::_WIN32_MEMORY_RANGE_ENTRY address_range = {mapped_file.data(), length}; + // Use ::PrefetchVirtualMemory(). This is better than a + // simple data file read, more from a RAM perspective than CPU. This is + // because reading the file as data results in double mapping to + // Image/executable pages for all pages of code executed. + if (!::PrefetchVirtualMemory(::GetCurrentProcess(), + /*NumberOfEntries=*/1, &address_range, + /*Flags=*/0)) { + return internal::PreReadFileSlow(file_path, max_bytes); + } + return true; +} + +bool PreventExecuteMapping(const FilePath& path) { + if (!base::FeatureList::IsEnabled( + features::kEnforceNoExecutableFileHandles)) { + return true; + } + + bool is_path_safe = IsPathSafeToSetAclOn(path); + + if (!is_path_safe) { + // To mitigate the effect of past OS bugs where attackers are able to use + // writeable handles to create malicious executable images which can be + // later mapped into unsandboxed processes, file handles that permit writing + // that are passed to untrusted processes, e.g. renderers, should be marked + // with a deny execute ACE. This prevents re-opening the file for execute + // later on. + // + // To accomplish this, code that needs to pass writable file handles to a + // renderer should open the file with the flags added by + // `AddFlagsForPassingToUntrustedProcess()` (explicitly + // FLAG_WIN_NO_EXECUTE). This results in this PreventExecuteMapping being + // called by base::File. + // + // However, simply using this universally on all files that are opened + // writeable is also undesirable: things can and will randomly break if they + // are marked no-exec (e.g. marking an exe that the user downloads as + // no-exec will prevent the user from running it). There are also + // performance implications of doing this for all files unnecessarily. + // + // Code that passes writable files to the renderer is also expected to + // reference files in places like the user data dir (e.g. for the filesystem + // API) or temp files. Any attempt to pass a writeable handle to a path + // outside these areas is likely its own security issue as an untrusted + // renderer process should never have write access to e.g. system files or + // downloads. + // + // This check aims to catch misuse of + // `AddFlagsForPassingToUntrustedProcess()` on paths outside these + // locations. Any time it hits it is also likely that a handle to a + // dangerous path is being passed to a renderer, which is inherently unsafe. + // + // If this check hits, please do not ignore it but consult security team. + DLOG(FATAL) << "Unsafe to deny execute access to path : " << path; + + return false; + } + + static constexpr wchar_t kEveryoneSid[] = L"WD"; + auto sids = win::Sid::FromSddlStringVector({kEveryoneSid}); + + // Remove executable access from the file. The API does not add a duplicate + // ACE if it already exists. + return win::DenyAccessToPath(path, *sids, FILE_EXECUTE, /*NO_INHERITANCE=*/0, + /*recursive=*/false); +} + +void SetExtraNoExecuteAllowedPath(int path_key) { + DCHECK(!g_extra_allowed_path_for_no_execute || + g_extra_allowed_path_for_no_execute == path_key); + g_extra_allowed_path_for_no_execute = path_key; + base::FilePath valid_path; + DCHECK( + base::PathService::Get(g_extra_allowed_path_for_no_execute, &valid_path)); +} + +// ----------------------------------------------------------------------------- + +namespace internal { + +bool MoveUnsafe(const FilePath& from_path, const FilePath& to_path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + // NOTE: I suspect we could support longer paths, but that would involve + // analyzing all our usage of files. + if (from_path.value().length() >= MAX_PATH || + to_path.value().length() >= MAX_PATH) { + return false; + } + if (MoveFileEx(from_path.value().c_str(), to_path.value().c_str(), + MOVEFILE_COPY_ALLOWED | MOVEFILE_REPLACE_EXISTING) != 0) + return true; + + // Keep the last error value from MoveFileEx around in case the below + // fails. + bool ret = false; + DWORD last_error = ::GetLastError(); + + if (DirectoryExists(from_path)) { + // MoveFileEx fails if moving directory across volumes. We will simulate + // the move by using Copy and Delete. Ideally we could check whether + // from_path and to_path are indeed in different volumes. + ret = internal::CopyAndDeleteDirectory(from_path, to_path); + } + + if (!ret) { + // Leave a clue about what went wrong so that it can be (at least) picked + // up by a PLOG entry. + ::SetLastError(last_error); + } + + return ret; +} + +bool CopyAndDeleteDirectory(const FilePath& from_path, + const FilePath& to_path) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + if (CopyDirectory(from_path, to_path, true)) { + if (DeletePathRecursively(from_path)) + return true; + + // Like Move, this function is not transactional, so we just + // leave the copied bits behind if deleting from_path fails. + // If to_path exists previously then we have already overwritten + // it by now, we don't get better off by deleting the new bits. + } + return false; +} + +} // namespace internal +#endif // !defined(MOZ_ZUCCHINI) + +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_win.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_win.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/file_win.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/file_win.cc 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,508 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/file.h" + +#include +#include + +#include + +#include "base/check_op.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/files/file_util.h" +#include "base/immediate_crash.h" +#include "base/metrics/histogram_functions.h" +#endif // !defined(MOZ_ZUCCHINI) +#include "base/notreached.h" +#include "base/strings/string_util.h" +#include "base/threading/scoped_blocking_call.h" + +#include + +namespace base { + +// Make sure our Whence mappings match the system headers. +static_assert(File::FROM_BEGIN == FILE_BEGIN && + File::FROM_CURRENT == FILE_CURRENT && + File::FROM_END == FILE_END, + "whence mapping must match the system headers"); + +bool File::IsValid() const { + return file_.is_valid(); +} + +PlatformFile File::GetPlatformFile() const { + return file_.get(); +} + +PlatformFile File::TakePlatformFile() { + return file_.release(); +} + +void File::Close() { + if (!file_.is_valid()) + return; + + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + SCOPED_FILE_TRACE("Close"); + file_.Close(); +} + +int64_t File::Seek(Whence whence, int64_t offset) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + + SCOPED_FILE_TRACE_WITH_SIZE("Seek", offset); + + LARGE_INTEGER distance, res; + distance.QuadPart = offset; + DWORD move_method = static_cast(whence); + if (!SetFilePointerEx(file_.get(), distance, &res, move_method)) + return -1; + return res.QuadPart; +} + +int File::Read(int64_t offset, char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + DCHECK(!async_); + if (size < 0 || offset < 0) + return -1; + + SCOPED_FILE_TRACE_WITH_SIZE("Read", size); + + ULARGE_INTEGER offset_li; + offset_li.QuadPart = static_cast(offset); + + OVERLAPPED overlapped = {}; + overlapped.Offset = offset_li.LowPart; + overlapped.OffsetHigh = offset_li.HighPart; + + DWORD bytes_read; + if (::ReadFile(file_.get(), data, static_cast(size), &bytes_read, + &overlapped)) { + // TODO(crbug.com/1333521): Change to return some type with a uint64_t size + // and eliminate this cast. + return checked_cast(bytes_read); + } + if (ERROR_HANDLE_EOF == GetLastError()) + return 0; + + return -1; +} + +int File::ReadAtCurrentPos(char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + DCHECK(!async_); + if (size < 0) + return -1; + + SCOPED_FILE_TRACE_WITH_SIZE("ReadAtCurrentPos", size); + + DWORD bytes_read; + if (::ReadFile(file_.get(), data, static_cast(size), &bytes_read, + NULL)) { + // TODO(crbug.com/1333521): Change to return some type with a uint64_t size + // and eliminate this cast. + return checked_cast(bytes_read); + } + if (ERROR_HANDLE_EOF == GetLastError()) + return 0; + + return -1; +} + +int File::ReadNoBestEffort(int64_t offset, char* data, int size) { + // TODO(dbeam): trace this separately? + return Read(offset, data, size); +} + +int File::ReadAtCurrentPosNoBestEffort(char* data, int size) { + // TODO(dbeam): trace this separately? + return ReadAtCurrentPos(data, size); +} + +int File::Write(int64_t offset, const char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + DCHECK(!async_); + if (size < 0 || offset < 0) + return -1; + + SCOPED_FILE_TRACE_WITH_SIZE("Write", size); + + ULARGE_INTEGER offset_li; + offset_li.QuadPart = static_cast(offset); + + OVERLAPPED overlapped = {}; + overlapped.Offset = offset_li.LowPart; + overlapped.OffsetHigh = offset_li.HighPart; + + DWORD bytes_written; + if (::WriteFile(file_.get(), data, static_cast(size), &bytes_written, + &overlapped)) + return static_cast(bytes_written); + + return -1; +} + +int File::WriteAtCurrentPos(const char* data, int size) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + DCHECK(!async_); + if (size < 0) + return -1; + + SCOPED_FILE_TRACE_WITH_SIZE("WriteAtCurrentPos", size); + + DWORD bytes_written; + if (::WriteFile(file_.get(), data, static_cast(size), &bytes_written, + NULL)) + return static_cast(bytes_written); + + return -1; +} + +int File::WriteAtCurrentPosNoBestEffort(const char* data, int size) { + return WriteAtCurrentPos(data, size); +} + +int64_t File::GetLength() { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + + SCOPED_FILE_TRACE("GetLength"); + + LARGE_INTEGER size; + if (!::GetFileSizeEx(file_.get(), &size)) + return -1; + + return static_cast(size.QuadPart); +} + +bool File::SetLength(int64_t length) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + + SCOPED_FILE_TRACE_WITH_SIZE("SetLength", length); + + // Get the current file pointer. + LARGE_INTEGER file_pointer; + LARGE_INTEGER zero; + zero.QuadPart = 0; + if (!::SetFilePointerEx(file_.get(), zero, &file_pointer, FILE_CURRENT)) + return false; + + LARGE_INTEGER length_li; + length_li.QuadPart = length; + // If length > file size, SetFilePointerEx() should extend the file + // with zeroes on all Windows standard file systems (NTFS, FATxx). + if (!::SetFilePointerEx(file_.get(), length_li, NULL, FILE_BEGIN)) + return false; + + // Set the new file length and move the file pointer to its old position. + // This is consistent with ftruncate()'s behavior, even when the file + // pointer points to a location beyond the end of the file. + // TODO(rvargas): Emulating ftruncate details seem suspicious and it is not + // promised by the interface (nor was promised by PlatformFile). See if this + // implementation detail can be removed. + return ((::SetEndOfFile(file_.get()) != FALSE) && + (::SetFilePointerEx(file_.get(), file_pointer, NULL, FILE_BEGIN) != + FALSE)); +} + +#if !defined(MOZ_ZUCCHINI) +bool File::SetTimes(Time last_access_time, Time last_modified_time) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + + SCOPED_FILE_TRACE("SetTimes"); + + FILETIME last_access_filetime = last_access_time.ToFileTime(); + FILETIME last_modified_filetime = last_modified_time.ToFileTime(); + return (::SetFileTime(file_.get(), NULL, &last_access_filetime, + &last_modified_filetime) != FALSE); +} + +bool File::GetInfo(Info* info) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + + SCOPED_FILE_TRACE("GetInfo"); + + BY_HANDLE_FILE_INFORMATION file_info; + if (!GetFileInformationByHandle(file_.get(), &file_info)) + return false; + + ULARGE_INTEGER size; + size.HighPart = file_info.nFileSizeHigh; + size.LowPart = file_info.nFileSizeLow; + // TODO(crbug.com/1333521): Change Info::size to uint64_t and eliminate this + // cast. + info->size = checked_cast(size.QuadPart); + info->is_directory = + (file_info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; + info->is_symbolic_link = false; // Windows doesn't have symbolic links. + info->last_modified = Time::FromFileTime(file_info.ftLastWriteTime); + info->last_accessed = Time::FromFileTime(file_info.ftLastAccessTime); + info->creation_time = Time::FromFileTime(file_info.ftCreationTime); + return true; +} +#endif // !defined(MOZ_ZUCCHINI) + +namespace { + +DWORD LockFileFlagsForMode(File::LockMode mode) { + DWORD flags = LOCKFILE_FAIL_IMMEDIATELY; + switch (mode) { + case File::LockMode::kShared: + return flags; + case File::LockMode::kExclusive: + return flags | LOCKFILE_EXCLUSIVE_LOCK; + } + NOTREACHED(); +} + +} // namespace + +File::Error File::Lock(File::LockMode mode) { + DCHECK(IsValid()); + + SCOPED_FILE_TRACE("Lock"); + + OVERLAPPED overlapped = {}; + BOOL result = + LockFileEx(file_.get(), LockFileFlagsForMode(mode), /*dwReserved=*/0, + /*nNumberOfBytesToLockLow=*/MAXDWORD, + /*nNumberOfBytesToLockHigh=*/MAXDWORD, &overlapped); + if (!result) + return GetLastFileError(); + return FILE_OK; +} + +File::Error File::Unlock() { + DCHECK(IsValid()); + + SCOPED_FILE_TRACE("Unlock"); + + OVERLAPPED overlapped = {}; + BOOL result = + UnlockFileEx(file_.get(), /*dwReserved=*/0, + /*nNumberOfBytesToLockLow=*/MAXDWORD, + /*nNumberOfBytesToLockHigh=*/MAXDWORD, &overlapped); + if (!result) + return GetLastFileError(); + return FILE_OK; +} + +File File::Duplicate() const { + if (!IsValid()) + return File(); + + SCOPED_FILE_TRACE("Duplicate"); + + HANDLE other_handle = nullptr; + + if (!::DuplicateHandle(GetCurrentProcess(), // hSourceProcessHandle + GetPlatformFile(), + GetCurrentProcess(), // hTargetProcessHandle + &other_handle, + 0, // dwDesiredAccess ignored due to SAME_ACCESS + FALSE, // !bInheritHandle + DUPLICATE_SAME_ACCESS)) { + return File(GetLastFileError()); + } + + return File(ScopedPlatformFile(other_handle), async()); +} + +bool File::DeleteOnClose(bool delete_on_close) { + FILE_DISPOSITION_INFO disposition = {delete_on_close}; + return ::SetFileInformationByHandle(GetPlatformFile(), FileDispositionInfo, + &disposition, sizeof(disposition)) != 0; +} + +// Static. +File::Error File::OSErrorToFileError(DWORD last_error) { + switch (last_error) { + case ERROR_SHARING_VIOLATION: + case ERROR_UNABLE_TO_REMOVE_REPLACED: // ReplaceFile failure cases. + case ERROR_UNABLE_TO_MOVE_REPLACEMENT: + case ERROR_UNABLE_TO_MOVE_REPLACEMENT_2: + return FILE_ERROR_IN_USE; + case ERROR_ALREADY_EXISTS: + case ERROR_FILE_EXISTS: + return FILE_ERROR_EXISTS; + case ERROR_FILE_NOT_FOUND: + case ERROR_PATH_NOT_FOUND: + return FILE_ERROR_NOT_FOUND; + case ERROR_ACCESS_DENIED: + case ERROR_LOCK_VIOLATION: + return FILE_ERROR_ACCESS_DENIED; + case ERROR_TOO_MANY_OPEN_FILES: + return FILE_ERROR_TOO_MANY_OPENED; + case ERROR_OUTOFMEMORY: + case ERROR_NOT_ENOUGH_MEMORY: + return FILE_ERROR_NO_MEMORY; + case ERROR_HANDLE_DISK_FULL: + case ERROR_DISK_FULL: + case ERROR_DISK_RESOURCES_EXHAUSTED: + return FILE_ERROR_NO_SPACE; + case ERROR_USER_MAPPED_FILE: + return FILE_ERROR_INVALID_OPERATION; + case ERROR_NOT_READY: // The device is not ready. + case ERROR_SECTOR_NOT_FOUND: // The drive cannot find the sector requested. + case ERROR_GEN_FAILURE: // A device ... is not functioning. + case ERROR_DEV_NOT_EXIST: // Net resource or device is no longer available. + case ERROR_IO_DEVICE: + case ERROR_DISK_OPERATION_FAILED: + case ERROR_FILE_CORRUPT: // File or directory is corrupted and unreadable. + case ERROR_DISK_CORRUPT: // The disk structure is corrupted and unreadable. + return FILE_ERROR_IO; + default: + // This function should only be called for errors. + DCHECK_NE(static_cast(ERROR_SUCCESS), last_error); + return FILE_ERROR_FAILED; + } +} + +void File::DoInitialize(const FilePath& path, uint32_t flags) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(!IsValid()); + + DWORD disposition = 0; + + if (flags & FLAG_OPEN) + disposition = OPEN_EXISTING; + + if (flags & FLAG_CREATE) { + DCHECK(!disposition); + disposition = CREATE_NEW; + } + + if (flags & FLAG_OPEN_ALWAYS) { + DCHECK(!disposition); + disposition = OPEN_ALWAYS; + } + + if (flags & FLAG_CREATE_ALWAYS) { + DCHECK(!disposition); + DCHECK(flags & FLAG_WRITE); + disposition = CREATE_ALWAYS; + } + + if (flags & FLAG_OPEN_TRUNCATED) { + DCHECK(!disposition); + DCHECK(flags & FLAG_WRITE); + disposition = TRUNCATE_EXISTING; + } + + if (!disposition) { + ::SetLastError(ERROR_INVALID_PARAMETER); + error_details_ = FILE_ERROR_FAILED; + NOTREACHED(); + return; + } + + DWORD access = 0; + if (flags & FLAG_WRITE) + access = GENERIC_WRITE; + if (flags & FLAG_APPEND) { + DCHECK(!access); + access = FILE_APPEND_DATA; + } + if (flags & FLAG_READ) + access |= GENERIC_READ; + if (flags & FLAG_WRITE_ATTRIBUTES) + access |= FILE_WRITE_ATTRIBUTES; + if (flags & FLAG_WIN_EXECUTE) { +#if !defined(MOZ_ZUCCHINI) + // Specifying both FLAG_WIN_EXECUTE and FLAG_WIN_NO_EXECUTE would + // constitute a security risk, so deny the access here. + CHECK_EQ(flags & FLAG_WIN_NO_EXECUTE, 0U); +#endif // !defined(MOZ_ZUCCHINI) + access |= GENERIC_EXECUTE; + } + if (flags & FLAG_CAN_DELETE_ON_CLOSE) + access |= DELETE; + + DWORD sharing = (flags & FLAG_WIN_EXCLUSIVE_READ) ? 0 : FILE_SHARE_READ; + if (!(flags & FLAG_WIN_EXCLUSIVE_WRITE)) + sharing |= FILE_SHARE_WRITE; + if (flags & FLAG_WIN_SHARE_DELETE) + sharing |= FILE_SHARE_DELETE; + + DWORD create_flags = 0; + if (flags & FLAG_ASYNC) + create_flags |= FILE_FLAG_OVERLAPPED; + if (flags & FLAG_WIN_TEMPORARY) + create_flags |= FILE_ATTRIBUTE_TEMPORARY; + if (flags & FLAG_WIN_HIDDEN) + create_flags |= FILE_ATTRIBUTE_HIDDEN; + if (flags & FLAG_DELETE_ON_CLOSE) + create_flags |= FILE_FLAG_DELETE_ON_CLOSE; + if (flags & FLAG_WIN_BACKUP_SEMANTICS) + create_flags |= FILE_FLAG_BACKUP_SEMANTICS; + if (flags & FLAG_WIN_SEQUENTIAL_SCAN) + create_flags |= FILE_FLAG_SEQUENTIAL_SCAN; + + file_.Set(CreateFile(path.value().c_str(), access, sharing, NULL, disposition, + create_flags, NULL)); + + if (file_.is_valid()) { + error_details_ = FILE_OK; + async_ = ((flags & FLAG_ASYNC) == FLAG_ASYNC); + + if (flags & (FLAG_OPEN_ALWAYS)) + created_ = (ERROR_ALREADY_EXISTS != GetLastError()); + else if (flags & (FLAG_CREATE_ALWAYS | FLAG_CREATE)) + created_ = true; +#if !defined(MOZ_ZUCCHINI) + if (flags & FLAG_WIN_NO_EXECUTE) { + // These two DCHECKs make sure that no callers are trying to remove + // execute permission from a file that might need to be mapped executable + // later. If they hit in code then the file should not have + // FLAG_WIN_NO_EXECUTE flag, but this will mean that the file cannot be + // passed to renderers. + DCHECK(!base::FilePath::CompareEqualIgnoreCase(FILE_PATH_LITERAL(".exe"), + path.Extension())); + DCHECK(!base::FilePath::CompareEqualIgnoreCase(FILE_PATH_LITERAL(".dll"), + path.Extension())); + + // It is possible that the ACE could not be added if the file was created + // in a path for which the caller does not have WRITE_DAC access. In this + // case, ignore the error since if this is occurring then it's likely the + // file cannot be opened for write and more serious I/O failures are + // occurring or about to occur. + std::ignore = PreventExecuteMapping(path); + } +#endif // defined(MOZ_ZUCCHINI) + } else { + error_details_ = GetLastFileError(); + } +} + +bool File::Flush() { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + DCHECK(IsValid()); + SCOPED_FILE_TRACE("Flush"); + + // On Windows 8 and above, FlushFileBuffers is guaranteed to flush the storage + // device's internal buffers (if they exist) before returning. + // https://blogs.msdn.microsoft.com/oldnewthing/20170510-00/?p=95505 + return ::FlushFileBuffers(file_.get()) != FALSE; +} + +void File::SetPlatformFile(PlatformFile file) { + file_.Set(file); +} + +// static +File::Error File::GetLastFileError() { + return File::OSErrorToFileError(GetLastError()); +} + +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file.cc 2025-12-01 18:15:47.000000000 +0000 @@ -0,0 +1,158 @@ +// Copyright 2013 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/memory_mapped_file.h" + +#include + +#include "base/files/file_path.h" +#include "base/logging.h" +#include "base/notreached.h" +#include "base/numerics/safe_math.h" +#include "base/system/sys_info.h" +#include "build/build_config.h" + +namespace base { + +const MemoryMappedFile::Region MemoryMappedFile::Region::kWholeFile = {0, 0}; + +bool MemoryMappedFile::Region::operator==( + const MemoryMappedFile::Region& other) const { + return other.offset == offset && other.size == size; +} + +bool MemoryMappedFile::Region::operator!=( + const MemoryMappedFile::Region& other) const { + return other.offset != offset || other.size != size; +} + +MemoryMappedFile::~MemoryMappedFile() { + CloseHandles(); +} + +#if !BUILDFLAG(IS_NACL) +bool MemoryMappedFile::Initialize(const FilePath& file_name, Access access) { + if (IsValid()) + return false; + + uint32_t flags = 0; + switch (access) { + case READ_ONLY: + flags = File::FLAG_OPEN | File::FLAG_READ; + break; + case READ_WRITE: + flags = File::FLAG_OPEN | File::FLAG_READ | File::FLAG_WRITE; + break; + case READ_WRITE_EXTEND: + // Can't open with "extend" because no maximum size is known. + NOTREACHED(); + break; +#if !defined(MOZ_ZUCCHINI) +#if BUILDFLAG(IS_WIN) + case READ_CODE_IMAGE: + flags |= File::FLAG_OPEN | File::FLAG_READ | + File::FLAG_WIN_EXCLUSIVE_WRITE | File::FLAG_WIN_EXECUTE; + break; +#endif +#endif // !defined(MOZ_ZUCCHINI) + } + file_.Initialize(file_name, flags); + + if (!file_.IsValid()) { + DLOG(ERROR) << "Couldn't open " << file_name.AsUTF8Unsafe(); + return false; + } + + if (!MapFileRegionToMemory(Region::kWholeFile, access)) { + CloseHandles(); + return false; + } + + return true; +} + +bool MemoryMappedFile::Initialize(File file, Access access) { + DCHECK_NE(READ_WRITE_EXTEND, access); + return Initialize(std::move(file), Region::kWholeFile, access); +} + +bool MemoryMappedFile::Initialize(File file, + const Region& region, + Access access) { + switch (access) { + case READ_WRITE_EXTEND: + DCHECK(Region::kWholeFile != region); + { + CheckedNumeric region_end(region.offset); + region_end += region.size; + if (!region_end.IsValid()) { + DLOG(ERROR) << "Region bounds exceed maximum for base::File."; + return false; + } + } + [[fallthrough]]; + case READ_ONLY: + case READ_WRITE: + // Ensure that the region values are valid. + if (region.offset < 0) { + DLOG(ERROR) << "Region bounds are not valid."; + return false; + } + break; +#if !defined(MOZ_ZUCCHINI) +#if BUILDFLAG(IS_WIN) + case READ_CODE_IMAGE: + // Can't open with "READ_CODE_IMAGE", not supported outside Windows + // or with a |region|. + NOTREACHED(); + break; +#endif +#endif // !defined(MOZ_ZUCCHINI) + } + + if (IsValid()) + return false; + + if (region != Region::kWholeFile) +#if defined(MOZ_ZUCCHINI) + { +#endif // defined(MOZ_ZUCCHINI) + DCHECK_GE(region.offset, 0); +#if defined(MOZ_ZUCCHINI) + } +#endif // defined(MOZ_ZUCCHINI) + + file_ = std::move(file); + + if (!MapFileRegionToMemory(region, access)) { + CloseHandles(); + return false; + } + + return true; +} + +bool MemoryMappedFile::IsValid() const { + return data_ != nullptr; +} + +// static +void MemoryMappedFile::CalculateVMAlignedBoundaries(int64_t start, + size_t size, + int64_t* aligned_start, + size_t* aligned_size, + int32_t* offset) { + // Sadly, on Windows, the mmap alignment is not just equal to the page size. + uint64_t mask = SysInfo::VMAllocationGranularity() - 1; + CHECK(IsValueInRangeForNumericType(mask)); + *offset = static_cast(static_cast(start) & mask); + *aligned_start = static_cast(static_cast(start) & ~mask); + // The DCHECK above means bit 31 is not set in `mask`, which in turn means + // *offset is positive. Therefore casting it to a size_t is safe. + *aligned_size = + (size + static_cast(*offset) + static_cast(mask)) & ~mask; +} +#endif // !BUILDFLAG(IS_NACL) + +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,155 @@ +// Copyright 2013 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_FILES_MEMORY_MAPPED_FILE_H_ +#define BASE_FILES_MEMORY_MAPPED_FILE_H_ + +#include +#include + +#include + +#include "base/base_export.h" +#include "base/files/file.h" +#include "base/memory/raw_ptr.h" +#include "build/build_config.h" + +#if BUILDFLAG(IS_WIN) +#include "base/win/scoped_handle.h" +#endif + +namespace base { + +class FilePath; + +class BASE_EXPORT MemoryMappedFile { + public: + enum Access { + // Mapping a file into memory effectively allows for file I/O on any thread. + // The accessing thread could be paused while data from the file is paged + // into memory. Worse, a corrupted filesystem could cause a SEGV within the + // program instead of just an I/O error. + READ_ONLY, + + // This provides read/write access to a file and must be used with care of + // the additional subtleties involved in doing so. Though the OS will do + // the writing of data on its own time, too many dirty pages can cause + // the OS to pause the thread while it writes them out. The pause can + // be as much as 1s on some systems. + READ_WRITE, + + // This provides read/write access but with the ability to write beyond + // the end of the existing file up to a maximum size specified as the + // "region". Depending on the OS, the file may or may not be immediately + // extended to the maximum size though it won't be loaded in RAM until + // needed. Note, however, that the maximum size will still be reserved + // in the process address space. + READ_WRITE_EXTEND, + +#if !defined(MOZ_ZUCCHINI) +#if BUILDFLAG(IS_WIN) + // This provides read access, but as executable code used for prefetching + // DLLs into RAM to avoid inefficient hard fault patterns such as during + // process startup. The accessing thread could be paused while data from + // the file is read into memory (if needed). + READ_CODE_IMAGE, +#endif +#endif // !defined(MOZ_ZUCCHINI) + }; + + // The default constructor sets all members to invalid/null values. + MemoryMappedFile(); + MemoryMappedFile(const MemoryMappedFile&) = delete; + MemoryMappedFile& operator=(const MemoryMappedFile&) = delete; + ~MemoryMappedFile(); + + // Used to hold information about a region [offset + size] of a file. + struct BASE_EXPORT Region { + static const Region kWholeFile; + + bool operator==(const Region& other) const; + bool operator!=(const Region& other) const; + + // Start of the region (measured in bytes from the beginning of the file). + int64_t offset; + + // Length of the region in bytes. + size_t size; + }; + + // Opens an existing file and maps it into memory. |access| can be read-only + // or read/write but not read/write+extend. If this object already points + // to a valid memory mapped file then this method will fail and return + // false. If it cannot open the file, the file does not exist, or the + // memory mapping fails, it will return false. + [[nodiscard]] bool Initialize(const FilePath& file_name, Access access); + [[nodiscard]] bool Initialize(const FilePath& file_name) { + return Initialize(file_name, READ_ONLY); + } + + // As above, but works with an already-opened file. |access| can be read-only + // or read/write but not read/write+extend. MemoryMappedFile takes ownership + // of |file| and closes it when done. |file| must have been opened with + // permissions suitable for |access|. If the memory mapping fails, it will + // return false. + [[nodiscard]] bool Initialize(File file, Access access); + [[nodiscard]] bool Initialize(File file) { + return Initialize(std::move(file), READ_ONLY); + } + + // As above, but works with a region of an already-opened file. |access| + // must not be READ_CODE_IMAGE. If READ_WRITE_EXTEND is specified then + // |region| provides the maximum size of the file. If the memory mapping + // fails, it return false. + [[nodiscard]] bool Initialize(File file, const Region& region, Access access); + [[nodiscard]] bool Initialize(File file, const Region& region) { + return Initialize(std::move(file), region, READ_ONLY); + } + + const uint8_t* data() const { return data_; } + uint8_t* data() { return data_; } + size_t length() const { return length_; } + + // Is file_ a valid file handle that points to an open, memory mapped file? + bool IsValid() const; + + private: + // Given the arbitrarily aligned memory region [start, size], returns the + // boundaries of the region aligned to the granularity specified by the OS, + // (a page on Linux, ~32k on Windows) as follows: + // - |aligned_start| is page aligned and <= |start|. + // - |aligned_size| is a multiple of the VM granularity and >= |size|. + // - |offset| is the displacement of |start| w.r.t |aligned_start|. + static void CalculateVMAlignedBoundaries(int64_t start, + size_t size, + int64_t* aligned_start, + size_t* aligned_size, + int32_t* offset); + +#if BUILDFLAG(IS_WIN) + // Maps the executable file to memory, set |data_| to that memory address. + // Return true on success. + bool MapImageToMemory(Access access); +#endif + + // Map the file to memory, set data_ to that memory address. Return true on + // success, false on any kind of failure. This is a helper for Initialize(). + bool MapFileRegionToMemory(const Region& region, Access access); + + // Closes all open handles. + void CloseHandles(); + + File file_; + + raw_ptr data_ = nullptr; + size_t length_ = 0; + +#if BUILDFLAG(IS_WIN) + win::ScopedHandle file_mapping_; +#endif +}; + +} // namespace base + +#endif // BASE_FILES_MEMORY_MAPPED_FILE_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file_posix.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file_posix.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file_posix.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file_posix.cc 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,110 @@ +// Copyright 2013 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/memory_mapped_file.h" + +#include +#include +#include +#include +#include +#include + +#include "base/files/file_util.h" +#include "base/logging.h" +#include "base/numerics/safe_conversions.h" +#include "base/threading/scoped_blocking_call.h" +#include "build/build_config.h" + +namespace base { + +MemoryMappedFile::MemoryMappedFile() = default; + +#if !BUILDFLAG(IS_NACL) +bool MemoryMappedFile::MapFileRegionToMemory( + const MemoryMappedFile::Region& region, + Access access) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + off_t map_start = 0; + size_t map_size = 0; + int32_t data_offset = 0; + + if (region == MemoryMappedFile::Region::kWholeFile) { + int64_t file_len = file_.GetLength(); + if (file_len < 0) { + DPLOG(ERROR) << "fstat " << file_.GetPlatformFile(); + return false; + } + if (!IsValueInRangeForNumericType(file_len)) + return false; + map_size = static_cast(file_len); + length_ = map_size; + } else { + // The region can be arbitrarily aligned. mmap, instead, requires both the + // start and size to be page-aligned. Hence, we map here the page-aligned + // outer region [|aligned_start|, |aligned_start| + |size|] which contains + // |region| and then add up the |data_offset| displacement. + int64_t aligned_start = 0; + size_t aligned_size = 0; + CalculateVMAlignedBoundaries(region.offset, + region.size, + &aligned_start, + &aligned_size, + &data_offset); + + // Ensure that the casts in the mmap call below are sane. + if (aligned_start < 0 || + !IsValueInRangeForNumericType(aligned_start)) { + DLOG(ERROR) << "Region bounds are not valid for mmap"; + return false; + } + + map_start = static_cast(aligned_start); + map_size = aligned_size; + length_ = region.size; + } + + int flags = 0; + switch (access) { + case READ_ONLY: + flags |= PROT_READ; + break; + + case READ_WRITE: + flags |= PROT_READ | PROT_WRITE; + break; + + case READ_WRITE_EXTEND: + flags |= PROT_READ | PROT_WRITE; + + if (!AllocateFileRegion(&file_, region.offset, region.size)) + return false; + + break; + } + + data_ = static_cast(mmap(nullptr, map_size, flags, MAP_SHARED, + file_.GetPlatformFile(), map_start)); + if (data_ == MAP_FAILED) { + DPLOG(ERROR) << "mmap " << file_.GetPlatformFile(); + return false; + } + + data_ += data_offset; + return true; +} +#endif + +void MemoryMappedFile::CloseHandles() { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + if (data_ != nullptr) { + munmap(data_.ExtractAsDangling(), length_); + } + file_.Close(); + length_ = 0; +} + +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file_win.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file_win.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file_win.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/memory_mapped_file_win.cc 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,152 @@ +// Copyright 2013 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/memory_mapped_file.h" + +#include +#include + +#include +#include + +#include "base/files/file_path.h" +#include "base/logging.h" +#include "base/numerics/checked_math.h" +#include "base/threading/scoped_blocking_call.h" +#if !defined(MOZ_ZUCCHINI) +#include "base/win/pe_image.h" +#endif // !defined(MOZ_ZUCCHINI) + +#include +#include // NOLINT(build/include_order) + +namespace base { + +MemoryMappedFile::MemoryMappedFile() = default; + +#if !defined(MOZ_ZUCCHINI) +bool MemoryMappedFile::MapImageToMemory(Access access) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + + // The arguments to the calls of ::CreateFile(), ::CreateFileMapping(), and + // ::MapViewOfFile() need to be self consistent as far as access rights and + // type of mapping or one or more of them will fail in non-obvious ways. + + if (!file_.IsValid()) + return false; + + file_mapping_.Set(::CreateFileMapping(file_.GetPlatformFile(), nullptr, + PAGE_READONLY | SEC_IMAGE_NO_EXECUTE, 0, + 0, NULL)); + if (!file_mapping_.is_valid()) + return false; + + data_ = static_cast( + ::MapViewOfFile(file_mapping_.get(), FILE_MAP_READ, 0, 0, 0)); + if (!data_) + return false; + + // We need to know how large the mapped file is in some cases + + base::win::PEImage pe_image(data_); + length_ = pe_image.GetNTHeaders()->OptionalHeader.SizeOfImage; + + return true; +} +#endif // !defined(MOZ_ZUCCHINI) + +bool MemoryMappedFile::MapFileRegionToMemory( + const MemoryMappedFile::Region& region, + Access access) { + ScopedBlockingCall scoped_blocking_call(FROM_HERE, BlockingType::MAY_BLOCK); + +#if !defined(MOZ_ZUCCHINI) + DCHECK(access != READ_CODE_IMAGE || region == Region::kWholeFile); +#endif // !defined(MOZ_ZUCCHINI) + + if (!file_.IsValid()) + return false; + + DWORD flags = 0; + ULARGE_INTEGER size = {}; + switch (access) { + case READ_ONLY: + flags |= PAGE_READONLY; + break; + case READ_WRITE: + flags |= PAGE_READWRITE; + break; + case READ_WRITE_EXTEND: + flags |= PAGE_READWRITE; + size.QuadPart = region.size; + break; +#if !defined(MOZ_ZUCCHINI) + case READ_CODE_IMAGE: + return MapImageToMemory(access); +#endif // !defined(MOZ_ZUCCHINI) + } + + file_mapping_.Set(::CreateFileMapping(file_.GetPlatformFile(), NULL, flags, + size.HighPart, size.LowPart, NULL)); + if (!file_mapping_.is_valid()) + return false; + + ULARGE_INTEGER map_start = {}; + SIZE_T map_size = 0; + int32_t data_offset = 0; + + if (region == MemoryMappedFile::Region::kWholeFile) { + DCHECK_NE(READ_WRITE_EXTEND, access); + int64_t file_len = file_.GetLength(); + if (file_len <= 0 || !IsValueInRangeForNumericType(file_len)) + return false; + length_ = static_cast(file_len); + } else { + // The region can be arbitrarily aligned. MapViewOfFile, instead, requires + // that the start address is aligned to the VM granularity (which is + // typically larger than a page size, for instance 32k). + // Also, conversely to POSIX's mmap, the |map_size| doesn't have to be + // aligned and must be less than or equal the mapped file size. + // We map here the outer region [|aligned_start|, |aligned_start+size|] + // which contains |region| and then add up the |data_offset| displacement. + int64_t aligned_start = 0; + size_t ignored = 0U; + CalculateVMAlignedBoundaries(region.offset, region.size, &aligned_start, + &ignored, &data_offset); + base::CheckedNumeric full_map_size = region.size; + full_map_size += data_offset; + + // Ensure that the casts below in the MapViewOfFile call are sane. + if (aligned_start < 0 || !full_map_size.IsValid()) { + DLOG(ERROR) << "Region bounds are not valid for MapViewOfFile"; + return false; + } + map_start.QuadPart = static_cast(aligned_start); + map_size = full_map_size.ValueOrDie(); + length_ = region.size; + } + + data_ = static_cast( + ::MapViewOfFile(file_mapping_.get(), + (flags & PAGE_READONLY) ? FILE_MAP_READ : FILE_MAP_WRITE, + map_start.HighPart, map_start.LowPart, map_size)); + if (data_ == nullptr) + return false; + data_ += data_offset; + return true; +} + +void MemoryMappedFile::CloseHandles() { + if (data_) + ::UnmapViewOfFile(data_); + if (file_mapping_.is_valid()) + file_mapping_.Close(); + if (file_.IsValid()) + file_.Close(); + + data_ = nullptr; + length_ = 0; +} + +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/platform_file.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/platform_file.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/platform_file.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/platform_file.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,43 @@ +// Copyright 2017 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_FILES_PLATFORM_FILE_H_ +#define BASE_FILES_PLATFORM_FILE_H_ + +#include "base/files/scoped_file.h" +#include "build/build_config.h" + +#if BUILDFLAG(IS_WIN) +#include "base/win/scoped_handle.h" +#include "base/win/windows_types.h" +#endif + +// This file defines platform-independent types for dealing with +// platform-dependent files. If possible, use the higher-level base::File class +// rather than these primitives. + +namespace base { + +#if BUILDFLAG(IS_WIN) + +using PlatformFile = HANDLE; +using ScopedPlatformFile = ::base::win::ScopedHandle; + +// It would be nice to make this constexpr but INVALID_HANDLE_VALUE is a +// ((void*)(-1)) which Clang rejects since reinterpret_cast is technically +// disallowed in constexpr. Visual Studio accepts this, however. +const PlatformFile kInvalidPlatformFile = INVALID_HANDLE_VALUE; + +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + +using PlatformFile = int; +using ScopedPlatformFile = ::base::ScopedFD; + +constexpr PlatformFile kInvalidPlatformFile = -1; + +#endif + +} // namespace base + +#endif // BASE_FILES_PLATFORM_FILE_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/scoped_file.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_file.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/scoped_file.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_file.cc 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,49 @@ +// Copyright 2014 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/scoped_file.h" + +#include "base/check.h" +#include "build/build_config.h" + +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +#include +#include + +#include "base/posix/eintr_wrapper.h" +#endif + +namespace base { +namespace internal { + +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + +// static +void ScopedFDCloseTraits::Free(int fd) { + // It's important to crash here. + // There are security implications to not closing a file descriptor + // properly. As file descriptors are "capabilities", keeping them open + // would make the current process keep access to a resource. Much of + // Chrome relies on being able to "drop" such access. + // It's especially problematic on Linux with the setuid sandbox, where + // a single open directory would bypass the entire security model. + int ret = IGNORE_EINTR(close(fd)); + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_APPLE) || \ + BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_ANDROID) + // NB: Some file descriptors can return errors from close() e.g. network + // filesystems such as NFS and Linux input devices. On Linux, macOS, and + // Fuchsia's POSIX layer, errors from close other than EBADF do not indicate + // failure to actually close the fd. + if (ret != 0 && errno != EBADF) + ret = 0; +#endif + + PCHECK(0 == ret); +} + +#endif // BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + +} // namespace internal +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/scoped_file.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_file.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/scoped_file.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_file.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,115 @@ +// Copyright 2014 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_FILES_SCOPED_FILE_H_ +#define BASE_FILES_SCOPED_FILE_H_ + +#include + +#include + +#include "base/base_export.h" +#include "base/scoped_generic.h" +#include "build/build_config.h" + +namespace base { + +namespace internal { + +#if BUILDFLAG(IS_ANDROID) +// Use fdsan on android. +struct BASE_EXPORT ScopedFDCloseTraits : public ScopedGenericOwnershipTracking { + static int InvalidValue() { return -1; } + static void Free(int); + static void Acquire(const ScopedGeneric&, int); + static void Release(const ScopedGeneric&, int); +}; +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) +// On ChromeOS and Linux we guard FD lifetime with a global table and hook into +// libc close() to perform checks. +struct BASE_EXPORT ScopedFDCloseTraits : public ScopedGenericOwnershipTracking { +#else +struct BASE_EXPORT ScopedFDCloseTraits { +#endif + static int InvalidValue() { + return -1; + } + static void Free(int fd); +#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) + static void Acquire(const ScopedGeneric&, int); + static void Release(const ScopedGeneric&, int); +#endif +}; +#endif + +// Functor for |ScopedFILE| (below). +struct ScopedFILECloser { + inline void operator()(FILE* x) const { + if (x) + fclose(x); + } +}; + +} // namespace internal + +#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) +namespace subtle { + +// Enables or disables enforcement of FD ownership as tracked by ScopedFD +// objects. Enforcement is disabled by default since it proves unwieldy in some +// test environments, but tracking is always done. It's best to enable this as +// early as possible in a process's lifetime. +void BASE_EXPORT EnableFDOwnershipEnforcement(bool enabled); + +// Resets ownership state of all FDs. The only permissible use of this API is +// in a forked child process between the fork() and a subsequent exec() call. +// +// For one issue, it is common to mass-close most open FDs before calling +// exec(), to avoid leaking FDs into the new executable's environment. For +// processes which have enabled FD ownership enforcement, this reset operation +// is necessary before performing such closures. +// +// Furthermore, fork()+exec() may be used in a multithreaded context, and +// because fork() is not atomic, the FD ownership state in the child process may +// be inconsistent with the actual set of opened file descriptors once fork() +// returns in the child process. +// +// It is therefore especially important to call this ASAP after fork() in the +// child process if any FD manipulation will be done prior to the subsequent +// exec call. +void BASE_EXPORT ResetFDOwnership(); + +} // namespace subtle +#endif + +// ----------------------------------------------------------------------------- + +#if BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) +// A low-level Posix file descriptor closer class. Use this when writing +// platform-specific code, especially that does non-file-like things with the +// FD (like sockets). +// +// If you're writing low-level Windows code, see base/win/scoped_handle.h +// which provides some additional functionality. +// +// If you're writing cross-platform code that deals with actual files, you +// should generally use base::File instead which can be constructed with a +// handle, and in addition to handling ownership, has convenient cross-platform +// file manipulation functions on it. +typedef ScopedGeneric ScopedFD; +#endif + +// Automatically closes |FILE*|s. +typedef std::unique_ptr ScopedFILE; + +#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) +// Queries the ownership status of an FD, i.e. whether it is currently owned by +// a ScopedFD in the calling process. +bool BASE_EXPORT IsFDOwned(int fd); +#endif // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) + +} // namespace base + +#endif // BASE_FILES_SCOPED_FILE_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/scoped_file_linux.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_file_linux.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/scoped_file_linux.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_file_linux.cc 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,122 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/scoped_file.h" + +#if !defined(MOZ_ZUCCHINI) +#include + +#include +#include +#include + +#include "base/compiler_specific.h" +#include "base/debug/stack_trace.h" +#include "base/immediate_crash.h" +#include "base/logging.h" +#include "base/strings/string_piece.h" + +namespace { + +// We want to avoid any kind of allocations in our close() implementation, so we +// use a fixed-size table. Given our common FD limits and the preference for new +// FD allocations to use the lowest available descriptor, this should be +// sufficient to guard most FD lifetimes. The worst case scenario if someone +// attempts to own a higher FD is that we don't track it. +const int kMaxTrackedFds = 4096; + +std::atomic_bool g_is_ownership_enforced{false}; +std::array g_is_fd_owned; + +NOINLINE void CrashOnFdOwnershipViolation() { + RAW_LOG(ERROR, "Crashing due to FD ownership violation:\n"); + base::debug::StackTrace().Print(); + base::ImmediateCrash(); +} + +bool CanTrack(int fd) { + return fd >= 0 && fd < kMaxTrackedFds; +} + +void UpdateAndCheckFdOwnership(int fd, bool owned) { + if (CanTrack(fd) && + g_is_fd_owned[static_cast(fd)].exchange(owned) == owned && + g_is_ownership_enforced) { + CrashOnFdOwnershipViolation(); + } +} + +} // namespace +#endif // !defined(MOZ_ZUCCHINI) + +namespace base { +namespace internal { + +// static +void ScopedFDCloseTraits::Acquire(const ScopedFD& owner, int fd) { +#if !defined(MOZ_ZUCCHINI) + UpdateAndCheckFdOwnership(fd, /*owned=*/true); +#endif // !defined(MOZ_ZUCCHINI) +} + +// static +void ScopedFDCloseTraits::Release(const ScopedFD& owner, int fd) { +#if !defined(MOZ_ZUCCHINI) + UpdateAndCheckFdOwnership(fd, /*owned=*/false); +#endif // !defined(MOZ_ZUCCHINI) +} + +} // namespace internal + +#if !defined(MOZ_ZUCCHINI) +namespace subtle { + +void EnableFDOwnershipEnforcement(bool enabled) { + g_is_ownership_enforced = enabled; +} + +void ResetFDOwnership() { + std::fill(g_is_fd_owned.begin(), g_is_fd_owned.end(), false); +} + +} // namespace subtle + +bool IsFDOwned(int fd) { + return CanTrack(fd) && g_is_fd_owned[static_cast(fd)]; +} +#endif // !defined(MOZ_ZUCCHINI) + +} // namespace base + +#if !defined(MOZ_ZUCCHINI) +using LibcCloseFuncPtr = int (*)(int); + +// Load the libc close symbol to forward to from the close wrapper. +LibcCloseFuncPtr LoadCloseSymbol() { +#if defined(THREAD_SANITIZER) + // If TSAN is enabled use __interceptor___close first to make sure the TSAN + // wrapper gets called. + return reinterpret_cast( + dlsym(RTLD_DEFAULT, "__interceptor___close")); +#else + return reinterpret_cast(dlsym(RTLD_NEXT, "close")); +#endif +} + +extern "C" { + +NO_SANITIZE("cfi-icall") +__attribute__((visibility("default"), noinline)) int close(int fd) { + static LibcCloseFuncPtr libc_close = LoadCloseSymbol(); + if (base::IsFDOwned(fd) && g_is_ownership_enforced) + CrashOnFdOwnershipViolation(); + if (libc_close == nullptr) { + RAW_LOG(ERROR, "close symbol missing\n"); + base::ImmediateCrash(); + } + return libc_close(fd); +} + +} // extern "C" +#endif // !defined(MOZ_ZUCCHINI) diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/scoped_temp_dir.cc firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_temp_dir.cc --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/scoped_temp_dir.cc 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_temp_dir.cc 2025-12-01 18:15:49.000000000 +0000 @@ -0,0 +1,105 @@ +// Copyright 2011 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/files/scoped_temp_dir.h" + +#include "base/files/file_util.h" +#include "base/logging.h" + +namespace base { + +namespace { + +constexpr FilePath::CharType kScopedDirPrefix[] = + FILE_PATH_LITERAL("scoped_dir"); + +} // namespace + +ScopedTempDir::ScopedTempDir() = default; + +ScopedTempDir::ScopedTempDir(ScopedTempDir&& other) noexcept + : path_(other.Take()) {} + +ScopedTempDir& ScopedTempDir::operator=(ScopedTempDir&& other) { + if (!path_.empty() && !Delete()) + DLOG(WARNING) << "Could not delete temp dir in operator=()."; + path_ = other.Take(); + return *this; +} + +ScopedTempDir::~ScopedTempDir() { + if (!path_.empty() && !Delete()) + DLOG(WARNING) << "Could not delete temp dir in dtor."; +} + +bool ScopedTempDir::CreateUniqueTempDir() { + if (!path_.empty()) + return false; + + // This "scoped_dir" prefix is only used on Windows and serves as a template + // for the unique name. + if (!CreateNewTempDirectory(kScopedDirPrefix, &path_)) + return false; + + return true; +} + +bool ScopedTempDir::CreateUniqueTempDirUnderPath(const FilePath& base_path) { + if (!path_.empty()) + return false; + + // If |base_path| does not exist, create it. + if (!CreateDirectory(base_path)) + return false; + + // Create a new, uniquely named directory under |base_path|. + if (!CreateTemporaryDirInDir(base_path, kScopedDirPrefix, &path_)) + return false; + + return true; +} + +bool ScopedTempDir::Set(const FilePath& path) { + if (!path_.empty()) + return false; + + if (!DirectoryExists(path) && !CreateDirectory(path)) + return false; + + path_ = path; + return true; +} + +bool ScopedTempDir::Delete() { + if (path_.empty()) + return false; + + bool ret = DeletePathRecursively(path_); + if (ret) { + // We only clear the path if deleted the directory. + path_.clear(); + } + + return ret; +} + +FilePath ScopedTempDir::Take() { + return std::exchange(path_, FilePath()); +} + +const FilePath& ScopedTempDir::GetPath() const { + DCHECK(!path_.empty()) << "Did you call CreateUniqueTempDir* before?"; + return path_; +} + +bool ScopedTempDir::IsValid() const { + return !path_.empty() && DirectoryExists(path_); +} + +// static +const FilePath::CharType* ScopedTempDir::GetTempDirPrefix() { + return kScopedDirPrefix; +} + +} // namespace base diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/scoped_temp_dir.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_temp_dir.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/files/scoped_temp_dir.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/files/scoped_temp_dir.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,71 @@ +// Copyright 2011 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_FILES_SCOPED_TEMP_DIR_H_ +#define BASE_FILES_SCOPED_TEMP_DIR_H_ + +// An object representing a temporary / scratch directory that should be +// cleaned up (recursively) when this object goes out of scope. Since deletion +// occurs during the destructor, no further error handling is possible if the +// directory fails to be deleted. As a result, deletion is not guaranteed by +// this class. (However note that, whenever possible, by default +// CreateUniqueTempDir creates the directory in a location that is +// automatically cleaned up on reboot, or at other appropriate times.) +// +// Multiple calls to the methods which establish a temporary directory +// (CreateUniqueTempDir, CreateUniqueTempDirUnderPath, and Set) must have +// intervening calls to Delete or Take, or the calls will fail. + +#include "base/base_export.h" +#include "base/files/file_path.h" + +namespace base { + +class BASE_EXPORT ScopedTempDir { + public: + // No directory is owned/created initially. + ScopedTempDir(); + + ScopedTempDir(ScopedTempDir&&) noexcept; + ScopedTempDir& operator=(ScopedTempDir&&); + + // Recursively delete path. + ~ScopedTempDir(); + + // Creates a unique directory in TempPath, and takes ownership of it. + // See file_util::CreateNewTemporaryDirectory. + [[nodiscard]] bool CreateUniqueTempDir(); + + // Creates a unique directory under a given path, and takes ownership of it. + [[nodiscard]] bool CreateUniqueTempDirUnderPath(const FilePath& path); + + // Takes ownership of directory at |path|, creating it if necessary. + // Don't call multiple times unless Take() has been called first. + [[nodiscard]] bool Set(const FilePath& path); + + // Deletes the temporary directory wrapped by this object. + [[nodiscard]] bool Delete(); + + // Caller takes ownership of the temporary directory so it won't be destroyed + // when this object goes out of scope. + FilePath Take(); + + // Returns the path to the created directory. Call one of the + // CreateUniqueTempDir* methods before getting the path. + const FilePath& GetPath() const; + + // Returns true if path_ is non-empty and exists. + bool IsValid() const; + + // Returns the prefix used for temp directory names generated by + // ScopedTempDirs. + static const FilePath::CharType* GetTempDirPrefix(); + + private: + FilePath path_; +}; + +} // namespace base + +#endif // BASE_FILES_SCOPED_TEMP_DIR_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/format_macros.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/format_macros.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/format_macros.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/format_macros.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,98 @@ +// Copyright 2009 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_FORMAT_MACROS_H_ +#define BASE_FORMAT_MACROS_H_ + +// This file defines the format macros for some integer types. + +// To print a 64-bit value in a portable way: +// int64_t value; +// printf("xyz:%" PRId64, value); +// The "d" in the macro corresponds to %d; you can also use PRIu64 etc. +// +// For wide strings, prepend "Wide" to the macro: +// int64_t value; +// StringPrintf(L"xyz: %" WidePRId64, value); +// +// To print a size_t value in a portable way: +// size_t size; +// printf("xyz: %" PRIuS, size); +// The "u" in the macro corresponds to %u, and S is for "size". + +#include +#include + +#include "build/build_config.h" + +#if (BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)) && \ + (defined(_INTTYPES_H) || defined(_INTTYPES_H_)) && !defined(PRId64) +#error "inttypes.h has already been included before this header file, but " +#error "without __STDC_FORMAT_MACROS defined." +#endif + +#if (BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA)) && \ + !defined(__STDC_FORMAT_MACROS) +#define __STDC_FORMAT_MACROS +#endif + +#include + +#if BUILDFLAG(IS_WIN) + +#if !defined(PRId64) || !defined(PRIu64) || !defined(PRIx64) +#error "inttypes.h provided by win toolchain should define these." +#endif + +#define WidePRId64 L"I64d" +#define WidePRIu64 L"I64u" +#define WidePRIx64 L"I64x" + +#if !defined(PRIuS) +#define PRIuS "Iu" +#endif + +#elif BUILDFLAG(IS_POSIX) || BUILDFLAG(IS_FUCHSIA) + +// GCC will concatenate wide and narrow strings correctly, so nothing needs to +// be done here. +#define WidePRId64 PRId64 +#define WidePRIu64 PRIu64 +#define WidePRIx64 PRIx64 + +#if !defined(PRIuS) +#define PRIuS "zu" +#endif + +#endif // BUILDFLAG(IS_WIN) + +// The size of NSInteger and NSUInteger varies between 32-bit and 64-bit +// architectures and Apple does not provides standard format macros and +// recommends casting. This has many drawbacks, so instead define macros +// for formatting those types. +#if BUILDFLAG(IS_APPLE) +#if defined(ARCH_CPU_64_BITS) +#if !defined(PRIdNS) +#define PRIdNS "ld" +#endif +#if !defined(PRIuNS) +#define PRIuNS "lu" +#endif +#if !defined(PRIxNS) +#define PRIxNS "lx" +#endif +#else // defined(ARCH_CPU_64_BITS) +#if !defined(PRIdNS) +#define PRIdNS "d" +#endif +#if !defined(PRIuNS) +#define PRIuNS "u" +#endif +#if !defined(PRIxNS) +#define PRIxNS "x" +#endif +#endif +#endif // BUILDFLAG(IS_APPLE) + +#endif // BASE_FORMAT_MACROS_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/functional/bind.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/functional/bind.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/functional/bind.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/functional/bind.h 2025-12-01 18:15:48.000000000 +0000 @@ -0,0 +1,459 @@ +// Copyright 2011 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_FUNCTIONAL_BIND_H_ +#define BASE_FUNCTIONAL_BIND_H_ + +#include +#include +#include +#include + +#include "base/compiler_specific.h" +#include "base/functional/bind_internal.h" +#include "base/memory/raw_ptr.h" +#include "build/build_config.h" + +// ----------------------------------------------------------------------------- +// Usage documentation +// ----------------------------------------------------------------------------- +// +// Overview: +// base::BindOnce() and base::BindRepeating() are helpers for creating +// base::OnceCallback and base::RepeatingCallback objects respectively. +// +// For a runnable object of n-arity, the base::Bind*() family allows partial +// application of the first m arguments. The remaining n - m arguments must be +// passed when invoking the callback with Run(). +// +// // The first argument is bound at callback creation; the remaining +// // two must be passed when calling Run() on the callback object. +// base::OnceCallback cb = base::BindOnce( +// [](short x, int y, long z) { return x * y * z; }, 42); +// +// When binding to a method, the receiver object must also be specified at +// callback creation time. When Run() is invoked, the method will be invoked on +// the specified receiver object. +// +// class C : public base::RefCounted { void F(); }; +// auto instance = base::MakeRefCounted(); +// auto cb = base::BindOnce(&C::F, instance); +// std::move(cb).Run(); // Identical to instance->F() +// +// See //docs/callback.md for the full documentation. +// +// ----------------------------------------------------------------------------- +// Implementation notes +// ----------------------------------------------------------------------------- +// +// If you're reading the implementation, before proceeding further, you should +// read the top comment of base/functional/bind_internal.h for a definition of +// common terms and concepts. + +namespace base { + +// Bind as OnceCallback. +template +inline OnceCallback> BindOnce( + Functor&& functor, + Args&&... args) { + static_assert(!internal::IsOnceCallback>() || + (std::is_rvalue_reference() && + !std::is_const>()), + "BindOnce requires non-const rvalue for OnceCallback binding." + " I.e.: base::BindOnce(std::move(callback))."); + static_assert( + std::conjunction< + internal::AssertBindArgIsNotBasePassed>...>::value, + "Use std::move() instead of base::Passed() with base::BindOnce()"); + + return internal::BindImpl(std::forward(functor), + std::forward(args)...); +} + +// Bind as RepeatingCallback. +template +inline RepeatingCallback> +BindRepeating(Functor&& functor, Args&&... args) { + static_assert( + !internal::IsOnceCallback>(), + "BindRepeating cannot bind OnceCallback. Use BindOnce with std::move()."); + + return internal::BindImpl(std::forward(functor), + std::forward(args)...); +} + +// Overloads to allow nicer compile errors when attempting to pass the address +// an overloaded function to `BindOnce()` or `BindRepeating()`. Otherwise, clang +// provides only the error message "no matching function [...] candidate +// template ignored: couldn't infer template argument 'Functor'", with no +// reference to the fact that `&` is being used on an overloaded function. +// +// These overloads to provide better error messages will never be selected +// unless template type deduction fails because of how overload resolution +// works; per [over.ics.rank/2.2]: +// +// When comparing the basic forms of implicit conversion sequences (as defined +// in [over.best.ics]) +// - a standard conversion sequence is a better conversion sequence than a +// user-defined conversion sequence or an ellipsis conversion sequence, and +// - a user-defined conversion sequence is a better conversion sequence than +// an ellipsis conversion sequence. +// +// So these overloads will only be selected as a last resort iff template type +// deduction fails. +// +// These overloads also intentionally do not return `void`, as this prevents +// clang from emitting spurious errors such as "variable has incomplete type +// 'void'" when assigning the result of `BindOnce()`/`BindRepeating()` to a +// variable with type `auto` or `decltype(auto)`. +struct BindFailedCheckPreviousErrors {}; +BindFailedCheckPreviousErrors BindOnce(...); +BindFailedCheckPreviousErrors BindRepeating(...); + +// Unretained(), UnsafeDangling() and UnsafeDanglingUntriaged() allow binding a +// non-refcounted class, and to disable refcounting on arguments that are +// refcounted. The main difference is whether or not the raw pointers will be +// checked for dangling references (e.g. a pointer that points to an already +// destroyed object) when the callback is run. +// +// It is _required_ to use one of Unretained(), UnsafeDangling() or +// UnsafeDanglingUntriaged() for raw pointer receivers now. For other arguments, +// it remains optional. If not specified, default behavior is Unretained(). + +// Unretained() pointers will be checked for dangling pointers when the +// callback is run, *if* the callback has not been cancelled. +// +// Example of Unretained() usage: +// +// class Foo { +// public: +// void func() { cout << "Foo:f" << endl; } +// }; +// +// // In some function somewhere. +// Foo foo; +// OnceClosure foo_callback = +// BindOnce(&Foo::func, Unretained(&foo)); +// std::move(foo_callback).Run(); // Prints "Foo:f". +// +// Without the Unretained() wrapper on |&foo|, the above call would fail +// to compile because Foo does not support the AddRef() and Release() methods. +// +// Unretained() does not allow dangling pointers, e.g.: +// class MyClass { +// public: +// OnError(int error); +// private: +// scoped_refptr runner_; +// std::unique_ptr obj_; +// }; +// +// void MyClass::OnError(int error) { +// // the pointer (which is also the receiver here) to `AnotherClass` +// // might dangle depending on when the task is invoked. +// runner_->PostTask(FROM_HERE, base::BindOnce(&AnotherClass::OnError, +// base::Unretained(obj_.get()), error)); +// // one of the way to solve this issue here would be: +// // runner_->PostTask(FROM_HERE, +// // base::BindOnce(&AnotherClass::OnError, +// // base::Owned(std::move(obj_)), error)); +// delete this; +// } +// +// the above example is a BAD USAGE of Unretained(), which might result in a +// use-after-free, as `AnotherClass::OnError` might be invoked with a dangling +// pointer as receiver. +template +inline auto Unretained(T* o) { + return internal::UnretainedWrapper(o); +} + +template +inline auto Unretained(const raw_ptr& o) { + return internal::UnretainedWrapper(o); +} + +template +inline auto Unretained(raw_ptr&& o) { + return internal::UnretainedWrapper(std::move(o)); +} + +template +inline auto Unretained(const raw_ref& o) { + return internal::UnretainedRefWrapper(o); +} + +template +inline auto Unretained(raw_ref&& o) { + return internal::UnretainedRefWrapper(std::move(o)); +} + +// Similar to `Unretained()`, but allows dangling pointers, e.g.: +// +// class MyClass { +// public: +// DoSomething(HandlerClass* handler); +// private: +// void MyClass::DoSomethingInternal(HandlerClass::Id id, +// HandlerClass* handler); +// +// std::unordered_map handlers_; +// scoped_refptr runner_; +// base::Lock lock_; +// }; +// void MyClass::DoSomething(HandlerClass* handler) { +// runner_->PostTask(FROM_HERE, +// base::BindOnce(&MyClass::DoSomethingInternal, +// base::Unretained(this), +// handler->id(), +// base::Unretained(handler))); +// } +// void MyClass::DoSomethingInternal(HandlerClass::Id id, +// HandlerClass* handler) { +// base::AutoLock locker(lock_); +// if (handlers_.find(id) == std::end(handlers_)) return; +// // Now we can use `handler`. +// } +// +// As `DoSomethingInternal` is run on a sequence (and we can imagine +// `handlers_` being modified on it as well), we protect the function from +// using a dangling `handler` by making sure it is still contained in the +// map. +// +// Strongly prefer `Unretained()`. This is useful in limited situations such as +// the one above. +// +// When using `UnsafeDangling()`, the receiver must be of type MayBeDangling<>. +template +inline auto UnsafeDangling(T* o) { + return internal::UnretainedWrapper(o); +} + +template +auto UnsafeDangling(const raw_ptr& o) { + return internal::UnretainedWrapper( + o); +} + +template +auto UnsafeDangling(raw_ptr&& o) { + return internal::UnretainedWrapper( + std::move(o)); +} + +template +auto UnsafeDangling(const raw_ref& o) { + return internal::UnretainedRefWrapper(o); +} + +template +auto UnsafeDangling(raw_ref&& o) { + return internal::UnretainedRefWrapper(std::move(o)); +} + +// Like `UnsafeDangling()`, but used to annotate places that still need to be +// triaged and either migrated to `Unretained()` and safer ownership patterns +// (preferred) or `UnsafeDangling()` if the correct pattern to use is the one +// in the `UnsafeDangling()` example above for example. +// +// Unlike `UnsafeDangling()`, the receiver doesn't have to be MayBeDangling<>. +template +inline auto UnsafeDanglingUntriaged(T* o) { + return internal::UnretainedWrapper( + o); +} + +template +auto UnsafeDanglingUntriaged(const raw_ptr& o) { + return internal::UnretainedWrapper(o); +} + +template +auto UnsafeDanglingUntriaged(raw_ptr&& o) { + return internal::UnretainedWrapper(std::move(o)); +} + +template +auto UnsafeDanglingUntriaged(const raw_ref& o) { + return internal::UnretainedRefWrapper< + T, unretained_traits::MayDangleUntriaged, Traits>(o); +} + +template +auto UnsafeDanglingUntriaged(raw_ref&& o) { + return internal::UnretainedRefWrapper< + T, unretained_traits::MayDangleUntriaged, Traits>(std::move(o)); +} + +// RetainedRef() accepts a ref counted object and retains a reference to it. +// When the callback is called, the object is passed as a raw pointer. +// +// EXAMPLE OF RetainedRef(): +// +// void foo(RefCountedBytes* bytes) {} +// +// scoped_refptr bytes = ...; +// OnceClosure callback = BindOnce(&foo, base::RetainedRef(bytes)); +// std::move(callback).Run(); +// +// Without RetainedRef, the scoped_refptr would try to implicitly convert to +// a raw pointer and fail compilation: +// +// OnceClosure callback = BindOnce(&foo, bytes); // ERROR! +template +inline internal::RetainedRefWrapper RetainedRef(T* o) { + return internal::RetainedRefWrapper(o); +} +template +inline internal::RetainedRefWrapper RetainedRef(scoped_refptr o) { + return internal::RetainedRefWrapper(std::move(o)); +} + +// Owned() transfers ownership of an object to the callback resulting from +// bind; the object will be deleted when the callback is deleted. +// +// EXAMPLE OF Owned(): +// +// void foo(int* arg) { cout << *arg << endl } +// +// int* pn = new int(1); +// RepeatingClosure foo_callback = BindRepeating(&foo, Owned(pn)); +// +// foo_callback.Run(); // Prints "1" +// foo_callback.Run(); // Prints "1" +// *pn = 2; +// foo_callback.Run(); // Prints "2" +// +// foo_callback.Reset(); // |pn| is deleted. Also will happen when +// // |foo_callback| goes out of scope. +// +// Without Owned(), someone would have to know to delete |pn| when the last +// reference to the callback is deleted. +template +inline internal::OwnedWrapper Owned(T* o) { + return internal::OwnedWrapper(o); +} + +template +inline internal::OwnedWrapper Owned( + std::unique_ptr&& ptr) { + return internal::OwnedWrapper(std::move(ptr)); +} + +// OwnedRef() stores an object in the callback resulting from +// bind and passes a reference to the object to the bound function. +// +// EXAMPLE OF OwnedRef(): +// +// void foo(int& arg) { cout << ++arg << endl } +// +// int counter = 0; +// RepeatingClosure foo_callback = BindRepeating(&foo, OwnedRef(counter)); +// +// foo_callback.Run(); // Prints "1" +// foo_callback.Run(); // Prints "2" +// foo_callback.Run(); // Prints "3" +// +// cout << counter; // Prints "0", OwnedRef creates a copy of counter. +// +// Supports OnceCallbacks as well, useful to pass placeholder arguments: +// +// void bar(int& ignore, const std::string& s) { cout << s << endl } +// +// OnceClosure bar_callback = BindOnce(&bar, OwnedRef(0), "Hello"); +// +// std::move(bar_callback).Run(); // Prints "Hello" +// +// Without OwnedRef() it would not be possible to pass a mutable reference to an +// object owned by the callback. +template +internal::OwnedRefWrapper> OwnedRef(T&& t) { + return internal::OwnedRefWrapper>(std::forward(t)); +} + +// Passed() is for transferring movable-but-not-copyable types (eg. unique_ptr) +// through a RepeatingCallback. Logically, this signifies a destructive transfer +// of the state of the argument into the target function. Invoking +// RepeatingCallback::Run() twice on a callback that was created with a Passed() +// argument will CHECK() because the first invocation would have already +// transferred ownership to the target function. +// +// Note that Passed() is not necessary with BindOnce(), as std::move() does the +// same thing. Avoid Passed() in favor of std::move() with BindOnce(). +// +// EXAMPLE OF Passed(): +// +// void TakesOwnership(std::unique_ptr arg) { } +// std::unique_ptr CreateFoo() { return std::make_unique(); +// } +// +// auto f = std::make_unique(); +// +// // |cb| is given ownership of Foo(). |f| is now NULL. +// // You can use std::move(f) in place of &f, but it's more verbose. +// RepeatingClosure cb = BindRepeating(&TakesOwnership, Passed(&f)); +// +// // Run was never called so |cb| still owns Foo() and deletes +// // it on Reset(). +// cb.Reset(); +// +// // |cb| is given a new Foo created by CreateFoo(). +// cb = BindRepeating(&TakesOwnership, Passed(CreateFoo())); +// +// // |arg| in TakesOwnership() is given ownership of Foo(). |cb| +// // no longer owns Foo() and, if reset, would not delete Foo(). +// cb.Run(); // Foo() is now transferred to |arg| and deleted. +// cb.Run(); // This CHECK()s since Foo() already been used once. +// +// We offer 2 syntaxes for calling Passed(). The first takes an rvalue and is +// best suited for use with the return value of a function or other temporary +// rvalues. The second takes a pointer to the scoper and is just syntactic sugar +// to avoid having to write Passed(std::move(scoper)). +// +// Both versions of Passed() prevent T from being an lvalue reference. The first +// via use of enable_if, and the second takes a T* which will not bind to T&. +// +// DEPRECATED - Do not use in new code. See https://crbug.com/1326449 +template >* = nullptr> +inline internal::PassedWrapper Passed(T&& scoper) { + return internal::PassedWrapper(std::move(scoper)); +} +template +inline internal::PassedWrapper Passed(T* scoper) { + return internal::PassedWrapper(std::move(*scoper)); +} + +// IgnoreResult() is used to adapt a function or callback with a return type to +// one with a void return. This is most useful if you have a function with, +// say, a pesky ignorable bool return that you want to use with PostTask or +// something else that expect a callback with a void return. +// +// EXAMPLE OF IgnoreResult(): +// +// int DoSomething(int arg) { cout << arg << endl; } +// +// // Assign to a callback with a void return type. +// OnceCallback cb = BindOnce(IgnoreResult(&DoSomething)); +// std::move(cb).Run(1); // Prints "1". +// +// // Prints "2" on |ml|. +// ml->PostTask(FROM_HERE, BindOnce(IgnoreResult(&DoSomething), 2); +template +inline internal::IgnoreResultHelper IgnoreResult(T data) { + return internal::IgnoreResultHelper(std::move(data)); +} + +} // namespace base + +#endif // BASE_FUNCTIONAL_BIND_H_ diff -Nru firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/functional/bind_internal.h firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/functional/bind_internal.h --- firefox-esr-140.5.0esr/third_party/zucchini/chromium/base/functional/bind_internal.h 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-140.6.0esr/third_party/zucchini/chromium/base/functional/bind_internal.h 2025-12-01 18:15:47.000000000 +0000 @@ -0,0 +1,1826 @@ +// Copyright 2011 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef BASE_FUNCTIONAL_BIND_INTERNAL_H_ +#define BASE_FUNCTIONAL_BIND_INTERNAL_H_ + +#include + +#include +#include +#include +#include +#include + +#include "base/allocator/partition_allocator/partition_alloc_buildflags.h" +#include "base/allocator/partition_allocator/partition_alloc_config.h" +#include "base/allocator/partition_allocator/pointers/raw_ptr.h" +#include "base/check.h" +#include "base/compiler_specific.h" +#include "base/functional/callback_internal.h" +#include "base/functional/disallow_unretained.h" +#include "base/functional/unretained_traits.h" +#include "base/memory/raw_ptr.h" +#include "base/memory/raw_ptr_asan_bound_arg_tracker.h" +#include "base/memory/raw_ptr_asan_service.h" +#include "base/memory/raw_ref.h" +#include "base/memory/raw_scoped_refptr_mismatch_checker.h" +#include "base/memory/weak_ptr.h" +#include "base/notreached.h" +#include "base/types/always_false.h" +#include "build/build_config.h" +#include "third_party/abseil-cpp/absl/functional/function_ref.h" + +// See base/functional/callback.h for user documentation. +// +// +// CONCEPTS: +// Functor -- A movable type representing something that should be called. +// All function pointers and Callback<> are functors even if the +// invocation syntax differs. +// RunType -- A function type (as opposed to function _pointer_ type) for +// a Callback<>::Run(). Usually just a convenience typedef. +// (Bound)Args -- A set of types that stores the arguments. +// +// Types: +// ForceVoidReturn<> -- Helper class for translating function signatures to +// equivalent forms with a "void" return type. +// FunctorTraits<> -- Type traits used to determine the correct RunType and +// invocation manner for a Functor. This is where function +// signature adapters are applied. +// StorageTraits<> -- Type traits that determine how a bound argument is +// stored in BindState. +// InvokeHelper<> -- Take a Functor + arguments and actually invokes it. +// Handle the differing syntaxes needed for WeakPtr<> +// support. This is separate from Invoker to avoid creating +// multiple version of Invoker<>. +// Invoker<> -- Unwraps the curried parameters and executes the Functor. +// BindState<> -- Stores the curried parameters, and is the main entry point +// into the Bind() system. + +#if BUILDFLAG(IS_WIN) +namespace Microsoft { +namespace WRL { +template +class ComPtr; +} // namespace WRL +} // namespace Microsoft +#endif + +namespace base { + +template +struct IsWeakReceiver; + +template +struct BindUnwrapTraits; + +template +struct CallbackCancellationTraits; + +template +class FunctionRef; + +namespace unretained_traits { + +// UnretainedWrapper will check and report if pointer is dangling upon +// invocation. +struct MayNotDangle {}; +// UnretainedWrapper won't check if pointer is dangling upon invocation. For +// extra safety, the receiver must be of type MayBeDangling<>. +struct MayDangle {}; +// UnretainedWrapper won't check if pointer is dangling upon invocation. The +// receiver doesn't have to be a raw_ptr<>. This is just a temporary state, to +// allow dangling pointers that would otherwise crash if MayNotDangle was used. +// It should be replaced ASAP with MayNotDangle (after fixing the dangling +// pointers) or with MayDangle if there is really no other way (after making +// receivers MayBeDangling<>). +struct MayDangleUntriaged {}; + +} // namespace unretained_traits + +namespace internal { + +template +struct FunctorTraits; + +template +class UnretainedWrapper { + // Note that if PtrTraits already includes MayDangle, DanglingRawPtrType + // will be identical to `raw_ptr`. + using DanglingRawPtrType = MayBeDangling; + + public: + // We want the getter type to match the receiver parameter that it is passed + // into, to minimize `raw_ptr` <-> `T*` conversions. We also would like to + // match `StorageType`, but sometimes we can't have both, as shown in + // https://docs.google.com/document/d/1dLM34aKqbNBfRdOYxxV_T-zQU4J5wjmXwIBJZr7JvZM/edit + // When we can't have both, prefer the former, mostly because + // `GetPtrType`=`raw_ptr` would break if e.g. UnretainedWrapper() is + // constructed using `char*`, but the receiver is of type `std::string&`. + // This is enforced by static_asserts in base::internal::AssertConstructible. + using GetPtrType = std::conditional_t< + raw_ptr_traits::IsSupportedType::value && + std::is_same_v, + DanglingRawPtrType, + T*>; + + static_assert(TypeSupportsUnretainedV, + "Callback cannot capture an unprotected C++ pointer since this " + "Type is annotated with DISALLOW_UNRETAINED(). Please see " + "base/functional/disallow_unretained.h for alternatives."); + + // Raw pointer makes sense only if there are no PtrTraits. If there are, + // it means that a `raw_ptr` is being passed, so use the ctors below instead. + template > + explicit UnretainedWrapper(T* o) : ptr_(o) {} + + // Trick to only instantiate these constructors if they are used. Otherwise, + // instantiating UnretainedWrapper with a T that is not supported by + // raw_ptr would trigger raw_ptr's static_assert. + template + explicit UnretainedWrapper(const raw_ptr& o) : ptr_(o) {} + template + explicit UnretainedWrapper(raw_ptr&& o) : ptr_(std::move(o)) {} + + GetPtrType get() const { return GetInternal(ptr_); } + + private: + // `ptr_` is either a `raw_ptr` or a regular C++ pointer. + template + static GetPtrType GetInternal(U* ptr) { + static_assert(std::is_same_v); + return ptr; + } + template + static GetPtrType GetInternal(const raw_ptr& ptr) { + static_assert(std::is_same_v); + if constexpr (std::is_same_v) { + ptr.ReportIfDangling(); + } + return ptr; + } + + // `Unretained()` arguments often dangle by design (a common design pattern + // is to manage an object's lifetime inside the callback itself, using + // stateful information), so disable direct dangling pointer detection + // of `ptr_`. + // + // If the callback is invoked, dangling pointer detection will be triggered + // before invoking the bound functor (unless stated otherwise, see + // `UnsafeDangling()` and `UnsafeDanglingUntriaged()`), when retrieving the + // pointer value via `get()` above. + using StorageType = + std::conditional_t::value, + DanglingRawPtrType, + T*>; + // Avoid converting between different `raw_ptr` types when calling `get()`. + // It is allowable to convert `raw_ptr` -> `T*`, but not in the other + // direction. See the comment by `GetPtrType` describing for more details. + static_assert(std::is_pointer_v || + std::is_same_v); + StorageType ptr_; +}; + +// Storage type for std::reference_wrapper so `BindState` can internally store +// unprotected references using raw_ref. +// +// std::reference_wrapper and T& do not work, since the reference lifetime is +// not safely protected by MiraclePtr. +// +// UnretainedWrapper and raw_ptr do not work, since BindUnwrapTraits would +// try to pass by T* rather than T&. +template +class UnretainedRefWrapper { + public: + static_assert( + TypeSupportsUnretainedV, + "Callback cannot capture an unprotected C++ reference since this " + "type is annotated with DISALLOW_UNRETAINED(). Please see " + "base/functional/disallow_unretained.h for alternatives."); + + // Raw reference makes sense only if there are no PtrTraits. If there are, + // it means that a `raw_ref` is being passed, so use the ctors below instead. + template > + explicit UnretainedRefWrapper(T& o) : ref_(o) {} + + // Trick to only instantiate these constructors if they are used. Otherwise, + // instantiating UnretainedWrapper with a T that is not supported by + // raw_ref would trigger raw_ref's static_assert. + template + explicit UnretainedRefWrapper(const raw_ref& o) : ref_(o) {} + template + explicit UnretainedRefWrapper(raw_ref&& o) + : ref_(std::move(o)) {} + + T& get() const { return GetInternal(ref_); } + + private: + // `ref_` is either a `raw_ref` or a regular C++ reference. + template + static T& GetInternal(U& ref) { + static_assert(std::is_same_v); + return ref; + } + template + static T& GetInternal(const raw_ref& ref) { + static_assert(std::is_same_v); + // The ultimate goal is to crash when a callback is invoked with a + // dangling pointer. This is checked here. For now, it is configured to + // either crash, DumpWithoutCrashing or be ignored. This depends on the + // PartitionAllocUnretainedDanglingPtr feature. + if constexpr (std::is_same_v) { + ref.ReportIfDangling(); + } + // We can't use operator* here, we need to use raw_ptr's GetForExtraction + // instead of GetForDereference. If we did use GetForDereference then we'd + // crash in ASAN builds on calling a bound callback with a dangling + // reference parameter even if that parameter is not used. This could hide + // a later unprotected issue that would be reached in release builds. + return ref.get(); + } + + // `Unretained()` arguments often dangle by design (a common design pattern + // is to manage an object's lifetime inside the callback itself, using + // stateful information), so disable direct dangling pointer detection + // of `ref_`. + // + // If the callback is invoked, dangling pointer detection will be triggered + // before invoking the bound functor (unless stated otherwise, see + // `UnsafeDangling()` and `UnsafeDanglingUntriaged()`), when retrieving the + // pointer value via `get()` above. + using StorageType = + std::conditional_t::value, + raw_ref, + T&>; + + StorageType ref_; +}; + +// The class is used to wrap `UnretainedRefWrapper` when the latter is used as +// a method receiver (a reference on `this` argument). This is needed because +// the internal callback mechanism expects the receiver to have the type +// `MyClass*` and to have `operator*`. +// This is used as storage. +template +class UnretainedRefWrapperReceiver { + public: + // NOLINTNEXTLINE(google-explicit-constructor) + UnretainedRefWrapperReceiver( + UnretainedRefWrapper&& o) + : obj_(std::move(o)) {} + // NOLINTNEXTLINE(google-explicit-constructor) + T& operator*() const { return obj_.get(); } + + private: + UnretainedRefWrapper obj_; +}; + +// MethodReceiverStorageType converts the current receiver type to its stored +// type. For instance, it converts pointers to `scoped_refptr`, and wraps +// `UnretainedRefWrapper` to make it compliant with the internal callback +// invocation mechanism. +template +struct MethodReceiverStorageType { + using Type = + std::conditional_t, scoped_refptr>, T>; +}; + +template +struct MethodReceiverStorageType< + UnretainedRefWrapper> { + // We can't use UnretainedRefWrapper as a receiver directly (see + // UnretainedRefWrapperReceiver for why). + using Type = UnretainedRefWrapperReceiver; +}; + +template +class RetainedRefWrapper { + public: + explicit RetainedRefWrapper(T* o) : ptr_(o) {} + explicit RetainedRefWrapper(scoped_refptr o) : ptr_(std::move(o)) {} + T* get() const { return ptr_.get(); } + + private: + scoped_refptr ptr_; +}; + +template +struct IgnoreResultHelper { + explicit IgnoreResultHelper(T functor) : functor_(std::move(functor)) {} + explicit operator bool() const { return !!functor_; } + + T functor_; +}; + +template > +class OwnedWrapper { + public: + explicit OwnedWrapper(T* o) : ptr_(o) {} + explicit OwnedWrapper(std::unique_ptr&& ptr) + : ptr_(std::move(ptr)) {} + T* get() const { return ptr_.get(); } + + private: + std::unique_ptr ptr_; +}; + +template +class OwnedRefWrapper { + public: + explicit OwnedRefWrapper(const T& t) : t_(t) {} + explicit OwnedRefWrapper(T&& t) : t_(std::move(t)) {} + T& get() const { return t_; } + + private: + mutable T t_; +}; + +// PassedWrapper is a copyable adapter for a scoper that ignores const. +// +// It is needed to get around the fact that Bind() takes a const reference to +// all its arguments. Because Bind() takes a const reference to avoid +// unnecessary copies, it is incompatible with movable-but-not-copyable +// types; doing a destructive "move" of the type into Bind() would violate +// the const correctness. +// +// This conundrum cannot be solved without either C++11 rvalue references or +// a O(2^n) blowup of Bind() templates to handle each combination of regular +// types and movable-but-not-copyable types. Thus we introduce a wrapper type +// that is copyable to transmit the correct type information down into +// BindState<>. Ignoring const in this type makes sense because it is only +// created when we are explicitly trying to do a destructive move. +// +// Two notes: +// 1) PassedWrapper supports any type that has a move constructor, however +// the type will need to be specifically allowed in order for it to be +// bound to a Callback. We guard this explicitly at the call of Passed() +// to make for clear errors. Things not given to Passed() will be forwarded +// and stored by value which will not work for general move-only types. +// 2) is_valid_ is distinct from NULL because it is valid to bind a "NULL" +// scoper to a Callback and allow the Callback to execute once. +template +class PassedWrapper { + public: + explicit PassedWrapper(T&& scoper) : scoper_(std::move(scoper)) {} + PassedWrapper(PassedWrapper&& other) + : is_valid_(other.is_valid_), scoper_(std::move(other.scoper_)) {} + T Take() const { + CHECK(is_valid_); + is_valid_ = false; + return std::move(scoper_); + } + + private: + mutable bool is_valid_ = true; + mutable T scoper_; +}; + +template +using Unwrapper = BindUnwrapTraits>; + +template +decltype(auto) Unwrap(T&& o) { + return Unwrapper::Unwrap(std::forward(o)); +} + +// IsWeakMethod is a helper that determine if we are binding a WeakPtr<> to a +// method. It is used internally by Bind() to select the correct +// InvokeHelper that will no-op itself in the event the WeakPtr<> for +// the target object is invalidated. +// +// The first argument should be the type of the object that will be received by +// the method. +template +struct IsWeakMethod : std::false_type {}; + +template +struct IsWeakMethod : IsWeakReceiver {}; + +// Packs a list of types to hold them in a single type. +template +struct TypeList {}; + +// Used for DropTypeListItem implementation. +template +struct DropTypeListItemImpl; + +// Do not use enable_if and SFINAE here to avoid MSVC2013 compile failure. +template +struct DropTypeListItemImpl> + : DropTypeListItemImpl> {}; + +template +struct DropTypeListItemImpl<0, TypeList> { + using Type = TypeList; +}; + +template <> +struct DropTypeListItemImpl<0, TypeList<>> { + using Type = TypeList<>; +}; + +// A type-level function that drops |n| list item from given TypeList. +template +using DropTypeListItem = typename DropTypeListItemImpl::Type; + +// Used for TakeTypeListItem implementation. +template +struct TakeTypeListItemImpl; + +// Do not use enable_if and SFINAE here to avoid MSVC2013 compile failure. +template +struct TakeTypeListItemImpl, Accum...> + : TakeTypeListItemImpl, Accum..., T> {}; + +template +struct TakeTypeListItemImpl<0, TypeList, Accum...> { + using Type = TypeList; +}; + +template +struct TakeTypeListItemImpl<0, TypeList<>, Accum...> { + using Type = TypeList; +}; + +// A type-level function that takes first |n| list item from given TypeList. +// E.g. TakeTypeListItem<3, TypeList> is evaluated to +// TypeList. +template +using TakeTypeListItem = typename TakeTypeListItemImpl::Type; + +// Used for ConcatTypeLists implementation. +template +struct ConcatTypeListsImpl; + +template +struct ConcatTypeListsImpl, TypeList> { + using Type = TypeList; +}; + +// A type-level function that concats two TypeLists. +template +using ConcatTypeLists = typename ConcatTypeListsImpl::Type; + +// Used for MakeFunctionType implementation. +template +struct MakeFunctionTypeImpl; + +template +struct MakeFunctionTypeImpl> { + // MSVC 2013 doesn't support Type Alias of function types. + // Revisit this after we update it to newer version. + typedef R Type(Args...); +}; + +// A type-level function that constructs a function type that has |R| as its +// return type and has TypeLists items as its arguments. +template +using MakeFunctionType = typename MakeFunctionTypeImpl::Type; + +// Used for ExtractArgs and ExtractReturnType. +template +struct ExtractArgsImpl; + +template +struct ExtractArgsImpl { + using ReturnType = R; + using ArgsList = TypeList; +}; + +// A type-level function that extracts function arguments into a TypeList. +// E.g. ExtractArgs is evaluated to TypeList. +template +using ExtractArgs = typename ExtractArgsImpl::ArgsList; + +// A type-level function that extracts the return type of a function. +// E.g. ExtractReturnType is evaluated to R. +template +using ExtractReturnType = typename ExtractArgsImpl::ReturnType; + +template +struct ExtractCallableRunTypeImpl; + +template +struct ExtractCallableRunTypeImpl { + using Type = R(Args...); +}; + +template +struct ExtractCallableRunTypeImpl { + using Type = R(Args...); +}; + +template +struct ExtractCallableRunTypeImpl { + using Type = R(Args...); +}; + +template +struct ExtractCallableRunTypeImpl { + using Type = R(Args...); +}; + +// Evaluated to RunType of the given callable type. +// Example: +// auto f = [](int, char*) { return 0.1; }; +// ExtractCallableRunType +// is evaluated to +// double(int, char*); +template +using ExtractCallableRunType = + typename ExtractCallableRunTypeImpl::Type; + +// IsCallableObject is std::true_type if |Functor| has operator(). +// Otherwise, it's std::false_type. +// Example: +// IsCallableObject::value is false. +// +// struct Foo {}; +// IsCallableObject::value is false. +// +// int i = 0; +// auto f = [i]() {}; +// IsCallableObject::value is false. +template +struct IsCallableObject : std::false_type {}; + +template +struct IsCallableObject> + : std::true_type {}; + +// HasRefCountedTypeAsRawPtr inherits from true_type when any of the |Args| is a +// raw pointer to a RefCounted type. +template +struct HasRefCountedTypeAsRawPtr + : std::disjunction...> {}; + +// ForceVoidReturn<> +// +// Set of templates that support forcing the function return type to void. +template +struct ForceVoidReturn; + +template +struct ForceVoidReturn { + using RunType = void(Args...); +}; + +// FunctorTraits<> +// +// See description at top of file. +template +struct FunctorTraits; + +// For callable types. +// This specialization handles lambdas (captureless and capturing) and functors +// with a call operator. Capturing lambdas and stateful functors are explicitly +// disallowed by BindImpl(). +// +// Example: +// +// // Captureless lambdas are allowed. +// []() {return 42;}; +// +// // Capturing lambdas are *not* allowed. +// int x; +// [x]() {return x;}; +// +// // Any empty class with operator() is allowed. +// struct Foo { +// void operator()() const {} +// // No non-static member variable and no virtual functions. +// }; +template +struct FunctorTraits::value>> { + using RunType = ExtractCallableRunType; + static constexpr bool is_method = false; + static constexpr bool is_nullable = false; + static constexpr bool is_callback = false; + static constexpr bool is_stateless = std::is_empty_v; + + template + static ExtractReturnType Invoke(RunFunctor&& functor, + RunArgs&&... args) { + return std::forward(functor)(std::forward(args)...); + } +}; + +// For functions. +template +struct FunctorTraits { + using RunType = R(Args...); + static constexpr bool is_method = false; + static constexpr bool is_nullable = true; + static constexpr bool is_callback = false; + static constexpr bool is_stateless = true; + + template + static R Invoke(Function&& function, RunArgs&&... args) { + return std::forward(function)(std::forward(args)...); + } +}; + +#if BUILDFLAG(IS_WIN) && !defined(ARCH_CPU_64_BITS) + +// For functions. +template +struct FunctorTraits { + using RunType = R(Args...); + static constexpr bool is_method = false; + static constexpr bool is_nullable = true; + static constexpr bool is_callback = false; + static constexpr bool is_stateless = true; + + template + static R Invoke(R(__stdcall* function)(Args...), RunArgs&&... args) { + return function(std::forward(args)...); + } +}; + +// For functions. +template +struct FunctorTraits { + using RunType = R(Args...); + static constexpr bool is_method = false; + static constexpr bool is_nullable = true; + static constexpr bool is_callback = false; + static constexpr bool is_stateless = true; + + template + static R Invoke(R(__fastcall* function)(Args...), RunArgs&&... args) { + return function(std::forward(args)...); + } +}; + +#endif // BUILDFLAG(IS_WIN) && !defined(ARCH_CPU_64_BITS) + +#if __OBJC__ + +// Support for Objective-C blocks. Blocks can be bound as the compiler will +// ensure their lifetimes will be correctly managed. + +#if HAS_FEATURE(objc_arc) + +template +struct FunctorTraits { + using RunType = R(Args...); + static constexpr bool is_method = false; + static constexpr bool is_nullable = true; + static constexpr bool is_callback = false; + static constexpr bool is_stateless = true; + + template + static R Invoke(BlockType&& block, RunArgs&&... args) { + // According to LLVM documentation (§ 6.3), "local variables of automatic + // storage duration do not have precise lifetime." Use objc_precise_lifetime + // to ensure that the Objective-C block is not deallocated until it has + // finished executing even if the Callback<> is destroyed during the block + // execution. + // https://clang.llvm.org/docs/AutomaticReferenceCounting.html#precise-lifetime-semantics + __attribute__((objc_precise_lifetime)) R (^scoped_block)(Args...) = block; + return scoped_block(std::forward(args)...); + } +}; + +#endif // HAS_FEATURE(objc_arc) +#endif // __OBJC__ + +// For methods. +template +struct FunctorTraits { + using RunType = R(Receiver*, Args...); + static constexpr bool is_method = true; + static constexpr bool is_nullable = true; + static constexpr bool is_callback = false; + static constexpr bool is_stateless = true; + + template + static R Invoke(Method method, + ReceiverPtr&& receiver_ptr, + RunArgs&&... args) { + return ((*receiver_ptr).*method)(std::forward(args)...); + } +}; + +// For const methods. +template +struct FunctorTraits { + using RunType = R(const Receiver*, Args...); + static constexpr bool is_method = true; + static constexpr bool is_nullable = true; + static constexpr bool is_callback = false; + static constexpr bool is_stateless = true; + + template + static R Invoke(Method method, + ReceiverPtr&& receiver_ptr, + RunArgs&&... args) { + return ((*receiver_ptr).*method)(std::forward(args)...); + } +}; + +#if BUILDFLAG(IS_WIN) && !defined(ARCH_CPU_64_BITS) + +// For __stdcall methods. +template +struct FunctorTraits { + using RunType = R(Receiver*, Args...); + static constexpr bool is_method = true; + static constexpr bool is_nullable = true; + static constexpr bool is_callback = false; + static constexpr bool is_stateless = true; + + template + static R Invoke(Method method, + ReceiverPtr&& receiver_ptr, + RunArgs&&... args) { + return ((*receiver_ptr).*method)(std::forward(args)...); + } +}; + +// For __stdcall const methods. +template +struct FunctorTraits { + using RunType = R(const Receiver*, Args...); + static constexpr bool is_method = true; + static constexpr bool is_nullable = true; + static constexpr bool is_callback = false; + static constexpr bool is_stateless = true; + + template + static R Invoke(Method method, + ReceiverPtr&& receiver_ptr, + RunArgs&&... args) { + return ((*receiver_ptr).*method)(std::forward(args)...); + } +}; + +#endif // BUILDFLAG(IS_WIN) && !defined(ARCH_CPU_64_BITS) + +#ifdef __cpp_noexcept_function_type +// noexcept makes a distinct function type in C++17. +// I.e. `void(*)()` and `void(*)() noexcept` are same in pre-C++17, and +// different in C++17. +template +struct FunctorTraits : FunctorTraits { +}; + +template +struct FunctorTraits + : FunctorTraits {}; + +template +struct FunctorTraits + : FunctorTraits {}; +#endif + +// For IgnoreResults. +template +struct FunctorTraits> : FunctorTraits { + using RunType = + typename ForceVoidReturn::RunType>::RunType; + + template + static void Invoke(IgnoreResultType&& ignore_result_helper, + RunArgs&&... args) { + FunctorTraits::Invoke( + std::forward(ignore_result_helper).functor_, + std::forward(args)...); + } +}; + +// For OnceCallbacks. +template +struct FunctorTraits> { + using RunType = R(Args...); + static constexpr bool is_method = false; + static constexpr bool is_nullable = true; + static constexpr bool is_callback = true; + static constexpr bool is_stateless = true; + + template + static R Invoke(CallbackType&& callback, RunArgs&&... args) { + DCHECK(!callback.is_null()); + return std::forward(callback).Run( + std::forward(args)...); + } +}; + +// For RepeatingCallbacks. +template +struct FunctorTraits> { + using RunType = R(Args...); + static constexpr bool is_method = false; + static constexpr bool is_nullable = true; + static constexpr bool is_callback = true; + static constexpr bool is_stateless = true; + + template + static R Invoke(CallbackType&& callback, RunArgs&&... args) { + DCHECK(!callback.is_null()); + return std::forward(callback).Run( + std::forward(args)...); + } +}; + +template +using MakeFunctorTraits = FunctorTraits>; + +// StorageTraits<> +// +// See description at top of file. +template +struct StorageTraits { + using Type = T; +}; + +// For T*, store as UnretainedWrapper for safety, as it internally uses +// raw_ptr (when possible). +template +struct StorageTraits { + using Type = UnretainedWrapper; +}; + +// For raw_ptr, store as UnretainedWrapper for safety. This may seem +// contradictory, but this ensures guaranteed protection for the pointer even +// during execution of callbacks with parameters of type raw_ptr. +template +struct StorageTraits> { + using Type = UnretainedWrapper; +}; + +// Unwrap std::reference_wrapper and store it in a custom wrapper so that +// references are also protected with raw_ptr. +template +struct StorageTraits> { + using Type = UnretainedRefWrapper; +}; + +template +using MakeStorageType = typename StorageTraits>::Type; + +// InvokeHelper<> +// +// There are 2 logical InvokeHelper<> specializations: normal, WeakCalls. +// +// The normal type just calls the underlying runnable. +// +// WeakCalls need special syntax that is applied to the first argument to check +// if they should no-op themselves. +template +struct InvokeHelper; + +template +struct InvokeHelper { + template + static inline ReturnType MakeItSo(Functor&& functor, + BoundArgsTuple&& bound, + RunArgs&&... args) { + using Traits = MakeFunctorTraits; + return Traits::Invoke( + std::forward(functor), + Unwrap(std::get(std::forward(bound)))..., + std::forward(args)...); + } +}; + +template +struct InvokeHelper { + // WeakCalls are only supported for functions with a void return type. + // Otherwise, the function result would be undefined if the WeakPtr<> + // is invalidated. + static_assert(std::is_void_v, + "weak_ptrs can only bind to methods without return values"); + + template + static inline void MakeItSo(Functor&& functor, + BoundArgsTuple&& bound, + RunArgs&&... args) { + static_assert(index_target == 0); + // Note the validity of the weak pointer should be tested _after_ it is + // unwrapped, otherwise it creates a race for weak pointer implementations + // that allow cross-thread usage and perform `Lock()` in Unwrap() traits. + const auto& target = Unwrap(std::get<0>(bound)); + if (!target) { + return; + } + using Traits = MakeFunctorTraits; + Traits::Invoke( + std::forward(functor), target, + Unwrap(std::get(std::forward(bound)))..., + std::forward(args)...); + } +}; + +// Invoker<> +// +// See description at the top of the file. +template +struct Invoker; + +template +struct Invoker { + static R RunOnce(BindStateBase* base, + PassingType... unbound_args) { + // Local references to make debugger stepping easier. If in a debugger, + // you really want to warp ahead and step through the + // InvokeHelper<>::MakeItSo() call below. + StorageType* storage = static_cast(base); + static constexpr size_t num_bound_args = + std::tuple_size_vbound_args_)>; + return RunImpl(std::move(storage->functor_), + std::move(storage->bound_args_), + std::make_index_sequence(), + std::forward(unbound_args)...); + } + + static R Run(BindStateBase* base, PassingType... unbound_args) { + // Local references to make debugger stepping easier. If in a debugger, + // you really want to warp ahead and step through the + // InvokeHelper<>::MakeItSo() call below. + const StorageType* storage = static_cast(base); + static constexpr size_t num_bound_args = + std::tuple_size_vbound_args_)>; + return RunImpl(storage->functor_, storage->bound_args_, + std::make_index_sequence(), + std::forward(unbound_args)...); + } + + private: + template + static inline R RunImpl(Functor&& functor, + BoundArgsTuple&& bound, + std::index_sequence seq, + UnboundArgs&&... unbound_args) { + static constexpr bool is_method = MakeFunctorTraits::is_method; + + using DecayedArgsTuple = std::decay_t; + +#if BUILDFLAG(USE_ASAN_BACKUP_REF_PTR) + RawPtrAsanBoundArgTracker raw_ptr_asan_bound_arg_tracker; + raw_ptr_asan_bound_arg_tracker.AddArgs( + std::get(std::forward(bound))..., + std::forward(unbound_args)...); +#endif // BUILDFLAG(USE_ASAN_BACKUP_REF_PTR) + + static constexpr bool is_weak_call = + IsWeakMethod...>(); + + // Do not `Unwrap()` here, as that immediately triggers dangling pointer + // detection. Dangling pointer detection should only be triggered if the + // callback is not cancelled, but cancellation status is not determined + // until later inside the InvokeHelper::MakeItSo specialization for weak + // calls. + // + // Dangling pointers when invoking a cancelled callback are not considered + // a memory safety error because protecting raw pointers usage with weak + // receivers (where the weak receiver usually own the pointed objects) is a + // common and broadly used pattern in the codebase. + return InvokeHelper::MakeItSo( + std::forward(functor), std::forward(bound), + std::forward(unbound_args)...); + } +}; + +// Extracts necessary type info from Functor and BoundArgs. +// Used to implement MakeUnboundRunType, BindOnce and BindRepeating. +template +struct BindTypeHelper { + static constexpr size_t num_bounds = sizeof...(BoundArgs); + using FunctorTraits = MakeFunctorTraits; + + // Example: + // When Functor is `double (Foo::*)(int, const std::string&)`, and BoundArgs + // is a template pack of `Foo*` and `int16_t`: + // - RunType is `double(Foo*, int, const std::string&)`, + // - ReturnType is `double`, + // - RunParamsList is `TypeList`, + // - BoundParamsList is `TypeList`, + // - UnboundParamsList is `TypeList`, + // - BoundArgsList is `TypeList`, + // - UnboundRunType is `double(const std::string&)`. + using RunType = typename FunctorTraits::RunType; + using ReturnType = ExtractReturnType; + + using RunParamsList = ExtractArgs; + using BoundParamsList = TakeTypeListItem; + using UnboundParamsList = DropTypeListItem; + + using BoundArgsList = TypeList; + + using UnboundRunType = MakeFunctionType; +}; + +template +std::enable_if_t::is_nullable, bool> IsNull( + const Functor& functor) { + return !functor; +} + +template +std::enable_if_t::is_nullable, bool> IsNull( + const Functor&) { + return false; +} + +// Used by QueryCancellationTraits below. +template +bool QueryCancellationTraitsImpl(BindStateBase::CancellationQueryMode mode, + const Functor& functor, + const BoundArgsTuple& bound_args, + std::index_sequence) { + switch (mode) { + case BindStateBase::IS_CANCELLED: + return CallbackCancellationTraits::IsCancelled( + functor, std::get(bound_args)...); + case BindStateBase::MAYBE_VALID: + return CallbackCancellationTraits::MaybeValid( + functor, std::get(bound_args)...); + } + NOTREACHED(); + return false; +} + +// Relays |base| to corresponding CallbackCancellationTraits<>::Run(). Returns +// true if the callback |base| represents is canceled. +template +bool QueryCancellationTraits(const BindStateBase* base, + BindStateBase::CancellationQueryMode mode) { + const BindStateType* storage = static_cast(base); + static constexpr size_t num_bound_args = + std::tuple_size_vbound_args_)>; + return QueryCancellationTraitsImpl( + mode, storage->functor_, storage->bound_args_, + std::make_index_sequence()); +} + +// The base case of BanUnconstructedRefCountedReceiver that checks nothing. +template +std::enable_if_t< + !(MakeFunctorTraits::is_method && + IsPointerV> && + IsRefCountedType>>::value)> +BanUnconstructedRefCountedReceiver(const Receiver& receiver, Unused&&...) {} + +template +void BanUnconstructedRefCountedReceiver() {} + +// Asserts that Callback is not the first owner of a ref-counted receiver. +template +std::enable_if_t< + MakeFunctorTraits::is_method && + IsPointerV> && + IsRefCountedType>>::value> +BanUnconstructedRefCountedReceiver(const Receiver& receiver, Unused&&...) { + DCHECK(receiver); + + // It's error prone to make the implicit first reference to ref-counted types. + // In the example below, base::BindOnce() would make the implicit first + // reference to the ref-counted Foo. If PostTask() failed or the posted task + // ran fast enough, the newly created instance could be destroyed before `oo` + // makes another reference. + // Foo::Foo() { + // base::ThreadPool::PostTask(FROM_HERE, base::BindOnce(&Foo::Bar, this)); + // } + // + // scoped_refptr oo = new Foo(); + // + // Hence, base::Bind{Once,Repeating}() refuses to create the first reference + // to ref-counted objects, and DCHECK()s otherwise. As above, that typically + // happens around PostTask() in their constructor, and such objects can be + // destroyed before `new` returns if the task resolves fast enough. + // + // Instead of doing the above, please consider adding a static constructor, + // and keep the first reference alive explicitly. + // // static + // scoped_refptr Foo::Create() { + // auto foo = base::WrapRefCounted(new Foo()); + // base::ThreadPool::PostTask(FROM_HERE, base::BindOnce(&Foo::Bar, foo)); + // return foo; + // } + // + // Foo::Foo() {} + // + // scoped_refptr oo = Foo::Create(); + // + DCHECK(receiver->HasAtLeastOneRef()); +} + +// BindState<> +// +// This stores all the state passed into Bind(). +template +struct BindState final : BindStateBase { + using IsCancellable = std::bool_constant< + CallbackCancellationTraits>::is_cancellable>; + template + static BindState* Create(BindStateBase::InvokeFuncStorage invoke_func, + ForwardFunctor&& functor, + ForwardBoundArgs&&... bound_args) { + // Ban ref counted receivers that were not yet fully constructed to avoid + // a common pattern of racy situation. + BanUnconstructedRefCountedReceiver(bound_args...); + + // IsCancellable is std::false_type if + // CallbackCancellationTraits<>::IsCancelled returns always false. + // Otherwise, it's std::true_type. + return new BindState(IsCancellable{}, invoke_func, + std::forward(functor), + std::forward(bound_args)...); + } + + Functor functor_; + std::tuple bound_args_; + + private: + static constexpr bool is_nested_callback = + MakeFunctorTraits::is_callback; + + template + explicit BindState(std::true_type, + BindStateBase::InvokeFuncStorage invoke_func, + ForwardFunctor&& functor, + ForwardBoundArgs&&... bound_args) + : BindStateBase(invoke_func, + &Destroy, + &QueryCancellationTraits), + functor_(std::forward(functor)), + bound_args_(std::forward(bound_args)...) { + // We check the validity of nested callbacks (e.g., Bind(callback, ...)) in + // release builds to avoid null pointers from ending up in posted tasks, + // causing hard-to-diagnose crashes. Ideally we'd do this for all functors + // here, but that would have a large binary size impact. + if (is_nested_callback) { + CHECK(!IsNull(functor_)); + } else { + DCHECK(!IsNull(functor_)); + } + } + + template + explicit BindState(std::false_type, + BindStateBase::InvokeFuncStorage invoke_func, + ForwardFunctor&& functor, + ForwardBoundArgs&&... bound_args) + : BindStateBase(invoke_func, &Destroy), + functor_(std::forward(functor)), + bound_args_(std::forward(bound_args)...) { + // See above for CHECK/DCHECK rationale. + if (is_nested_callback) { + CHECK(!IsNull(functor_)); + } else { + DCHECK(!IsNull(functor_)); + } + } + + ~BindState() = default; + + static void Destroy(const BindStateBase* self) { + delete static_cast(self); + } +}; + +// Used to implement MakeBindStateType. +template +struct MakeBindStateTypeImpl; + +template +struct MakeBindStateTypeImpl { + static_assert(!HasRefCountedTypeAsRawPtr...>::value, + "A parameter is a refcounted type and needs scoped_refptr."); + using Type = BindState, MakeStorageType...>; +}; + +template +struct MakeBindStateTypeImpl { + using Type = BindState>; +}; + +template +struct MakeBindStateTypeImpl { + private: + using DecayedReceiver = std::decay_t; + static_assert(!std::is_array_v>, + "First bound argument to a method cannot be an array."); + static_assert( + !IsRawRefV, + "Receivers may not be raw_ref. If using a raw_ref here is safe" + " and has no lifetime concerns, use base::Unretained() and document why" + " it's safe."); + static_assert( + !IsPointerV || + IsRefCountedType>::value, + "Receivers may not be raw pointers. If using a raw pointer here is safe" + " and has no lifetime concerns, use base::Unretained() and document why" + " it's safe."); + + static_assert(!HasRefCountedTypeAsRawPtr...>::value, + "A parameter is a refcounted type and needs scoped_refptr."); + + using ReceiverStorageType = + typename MethodReceiverStorageType::Type; + + public: + using Type = BindState, + ReceiverStorageType, + MakeStorageType...>; +}; + +template +using MakeBindStateType = + typename MakeBindStateTypeImpl::is_method, + Functor, + BoundArgs...>::Type; + +// Returns a RunType of bound functor. +// E.g. MakeUnboundRunType is evaluated to R(C). +template +using MakeUnboundRunType = + typename BindTypeHelper::UnboundRunType; + +// The implementation of TransformToUnwrappedType below. +template +struct TransformToUnwrappedTypeImpl; + +template +struct TransformToUnwrappedTypeImpl { + using StoredType = std::decay_t; + using ForwardType = StoredType&&; + using Unwrapped = decltype(Unwrap(std::declval())); +}; + +template +struct TransformToUnwrappedTypeImpl { + using StoredType = std::decay_t; + using ForwardType = const StoredType&; + using Unwrapped = decltype(Unwrap(std::declval())); +}; + +// Transform |T| into `Unwrapped` type, which is passed to the target function. +// Example: +// In is_once == true case, +// `int&&` -> `int&&`, +// `const int&` -> `int&&`, +// `OwnedWrapper&` -> `int*&&`. +// In is_once == false case, +// `int&&` -> `const int&`, +// `const int&` -> `const int&`, +// `OwnedWrapper&` -> `int* const &`. +template +using TransformToUnwrappedType = + typename TransformToUnwrappedTypeImpl::Unwrapped; + +// Transforms |Args| into `Unwrapped` types, and packs them into a TypeList. +// If |is_method| is true, tries to dereference the first argument to support +// smart pointers. +template +struct MakeUnwrappedTypeListImpl { + using Type = TypeList...>; +}; + +// Performs special handling for this pointers. +// Example: +// int* -> int*, +// std::unique_ptr -> int*. +template +struct MakeUnwrappedTypeListImpl { + using ReceiverStorageType = + typename MethodReceiverStorageType>::Type; + using UnwrappedReceiver = + TransformToUnwrappedType; + using Type = TypeList()), + TransformToUnwrappedType...>; +}; + +template +using MakeUnwrappedTypeList = + typename MakeUnwrappedTypeListImpl::Type; + +// IsOnceCallback is a std::true_type if |T| is a OnceCallback. +template +struct IsOnceCallback : std::false_type {}; + +template +struct IsOnceCallback> : std::true_type {}; + +// IsUnretainedMayDangle is true if StorageType is of type +// `UnretainedWrapper. +// Note that it is false for unretained_traits::MayDangleUntriaged. +template +inline constexpr bool IsUnretainedMayDangle = false; +template +inline constexpr bool IsUnretainedMayDangle< + UnretainedWrapper> = true; + +// UnretainedAndRawPtrHaveCompatibleTraits is true if StorageType is of type +// `UnretainedWrapper` and +// FunctionParamType is of type `raw_ptr`, and the former's +// ::GetPtrType is the same type as the latter. +template +inline constexpr bool UnretainedAndRawPtrHaveCompatibleTraits = false; +template +inline constexpr bool UnretainedAndRawPtrHaveCompatibleTraits< + UnretainedWrapper, + raw_ptr> = + std::is_same_v< + typename UnretainedWrapper::GetPtrType, + raw_ptr>; + +// Helpers to make error messages slightly more readable. +template +struct BindArgument { + template + struct ForwardedAs { + template + struct ToParamWithType { + static constexpr bool kNotARawPtr = !IsRawPtrV; + + static constexpr bool kCanBeForwardedToBoundFunctor = + std::is_constructible_v; + + // If the bound type can't be forwarded then test if `FunctorParamType` is + // a non-const lvalue reference and a reference to the unwrapped type + // *could* have been successfully forwarded. + static constexpr bool kNonConstRefParamMustBeWrapped = + kCanBeForwardedToBoundFunctor || + !(std::is_lvalue_reference_v && + !std::is_const_v> && + std::is_convertible_v&, + FunctorParamType>); + + // Note that this intentionally drops the const qualifier from + // `ForwardingType`, to test if it *could* have been successfully + // forwarded if `Passed()` had been used. + static constexpr bool kMoveOnlyTypeMustUseBasePassed = + kCanBeForwardedToBoundFunctor || + !std::is_constructible_v&&>; + }; + }; + + template + struct BoundAs { + template + struct StoredAs { + static constexpr bool kBindArgumentCanBeCaptured = + std::is_constructible_v; + // Note that this intentionally drops the const qualifier from + // `BoundAsType`, to test if it *could* have been successfully bound if + // `std::move()` had been used. + static constexpr bool kMoveOnlyTypeMustUseStdMove = + kBindArgumentCanBeCaptured || + !std::is_constructible_v&&>; + }; + }; + + template + struct ToParamWithType { + template + struct StoredAs { + template + // true if we are handling `this` parameter. + static constexpr bool kParamIsThisPointer = is_method && i == 0; + // true if the current parameter is of type `raw_ptr` with + // `RawPtrTraits::kMayDangle` trait (e.g. `MayBeDangling`). + static constexpr bool kParamIsDanglingRawPtr = + IsRawPtrMayDangleV; + // true if the bound parameter is of type + // `UnretainedWrapper`. + static constexpr bool kBoundPtrMayDangle = + IsUnretainedMayDangle; + // true if bound parameter of type `UnretainedWrapper` and parameter of + // type `raw_ptr` have compatible `RawPtrTraits`. + static constexpr bool kMayBeDanglingTraitsCorrectness = + UnretainedAndRawPtrHaveCompatibleTraits; + // true if the receiver argument **must** be of type `MayBeDangling`. + static constexpr bool kMayBeDanglingMustBeUsed = + kBoundPtrMayDangle && kParamIsDanglingRawPtr; + + // true iff: + // - bound parameter is of type + // `UnretainedWrapper` + // - the receiving argument is of type `MayBeDangling` + template + static constexpr bool kMayBeDanglingPtrPassedCorrectly = + kParamIsThisPointer || + kBoundPtrMayDangle == kParamIsDanglingRawPtr; + + // true if: + // - MayBeDangling must not be used as receiver parameter. + // OR + // - MayBeDangling must be used as receiver parameter and its traits + // are matching Unretained traits. + static constexpr bool kUnsafeDanglingAndMayBeDanglingHaveMatchingTraits = + !kMayBeDanglingMustBeUsed || kMayBeDanglingTraitsCorrectness; + }; + }; +}; + +// Helper to assert that parameter |i| of type |Arg| can be bound, which means: +// - |Arg| can be retained internally as |Storage|. +// - |Arg| can be forwarded as |Unwrapped| to |Param|. +template +struct AssertConstructible { + private: + // With `BindRepeating`, there are two decision points for how to handle a + // move-only type: + // + // 1. Whether the move-only argument should be moved into the internal + // `BindState`. Either `std::move()` or `Passed` is sufficient to trigger + // move-only semantics. + // 2. Whether or not the bound, move-only argument should be moved to the + // bound functor when invoked. When the argument is bound with `Passed`, + // invoking the callback will destructively move the bound, move-only + // argument to the bound functor. In contrast, if the argument is bound + // with `std::move()`, `RepeatingCallback` will attempt to call the bound + // functor with a constant reference to the bound, move-only argument. This + // will fail if the bound functor accepts that argument by value, since the + // argument cannot be copied. It is this latter case that this + // static_assert aims to catch. + // + // In contrast, `BindOnce()` only has one decision point. Once a move-only + // type is captured by value into the internal `BindState`, the bound, + // move-only argument will always be moved to the functor when invoked. + // Failure to use std::move will simply fail the `kMoveOnlyTypeMustUseStdMove` + // assert below instead. + // + // Note: `Passed()` is a legacy of supporting move-only types when repeating + // callbacks were the only callback type. A `RepeatingCallback` with a + // `Passed()` argument is really a `OnceCallback` and should eventually be + // migrated. + static_assert( + BindArgument::template ForwardedAs:: + template ToParamWithType::kMoveOnlyTypeMustUseBasePassed, + "base::BindRepeating() argument is a move-only type. Use base::Passed() " + "instead of std::move() to transfer ownership from the callback to the " + "bound functor."); + static_assert( + BindArgument::template ForwardedAs:: + template ToParamWithType::kNonConstRefParamMustBeWrapped, + "Bound argument for non-const reference parameter must be wrapped in " + "std::ref() or base::OwnedRef()."); + static_assert( + BindArgument::template ForwardedAs:: + template ToParamWithType::kCanBeForwardedToBoundFunctor, + "Type mismatch between bound argument and bound functor's parameter."); + + static_assert(BindArgument::template BoundAs::template StoredAs< + Storage>::kMoveOnlyTypeMustUseStdMove, + "Attempting to bind a move-only type. Use std::move() to " + "transfer ownership to the created callback."); + // In practice, this static_assert should be quite rare as the storage type + // is deduced from the arguments passed to `BindOnce()`/`BindRepeating()`. + static_assert( + BindArgument::template BoundAs::template StoredAs< + Storage>::kBindArgumentCanBeCaptured, + "Cannot capture argument: is the argument copyable or movable?"); + + // We forbid callbacks to use raw_ptr as a parameter. However, we allow + // MayBeDangling iff the callback argument was created using + // `base::UnsafeDangling`. + static_assert( + BindArgument::template ForwardedAs< + Unwrapped>::template ToParamWithType::kNotARawPtr || + BindArgument::template ToParamWithType::template StoredAs< + Storage>::kMayBeDanglingMustBeUsed, + "base::Bind() target functor has a parameter of type raw_ptr. " + "raw_ptr should not be used for function parameters, please use T* or " + "T& instead."); + + // A bound functor must take a dangling pointer argument (e.g. bound using the + // UnsafeDangling helper) as a MayBeDangling, to make it clear that the + // pointee's lifetime must be externally validated before using it. For + // methods, exempt a bound receiver (i.e. the this pointer) as it is not + // passed as a regular function argument. + static_assert( + BindArgument::template ToParamWithType::template StoredAs< + Storage>::template kMayBeDanglingPtrPassedCorrectly, + "base::UnsafeDangling() pointers must be received by functors with " + "MayBeDangling as parameter."); + + static_assert( + BindArgument::template ToParamWithType::template StoredAs< + Storage>::kUnsafeDanglingAndMayBeDanglingHaveMatchingTraits, + "MayBeDangling parameter must receive the same RawPtrTraits as the " + "one passed to the corresponding base::UnsafeDangling() call."); +}; + +// Takes three same-length TypeLists, and applies AssertConstructible for each +// triples. +template +struct AssertBindArgsValidity; + +template +struct AssertBindArgsValidity, + TypeList, + TypeList, + TypeList> + : AssertConstructible, + Unwrapped, + Params>... { + static constexpr bool ok = true; +}; + +template +struct AssertBindArgIsNotBasePassed : public std::true_type {}; + +template +struct AssertBindArgIsNotBasePassed> : public std::false_type { +}; + +template