Version in base suite: 128.3.1esr-1~deb12u1 Version in overlay suite: 128.5.0esr-1~deb12u1 Base version: firefox-esr_128.5.0esr-1~deb12u1 Target version: firefox-esr_128.6.0esr-1~deb12u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/f/firefox-esr/firefox-esr_128.5.0esr-1~deb12u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/f/firefox-esr/firefox-esr_128.6.0esr-1~deb12u1.dsc /srv/release.debian.org/tmp/pF1db870Hp/firefox-esr-128.6.0esr/services/settings/dumps/blocklists/addons-bloomfilters/addons-mlbf.bin |binary firefox-esr-128.6.0esr/CLOBBER | 2 firefox-esr-128.6.0esr/accessible/windows/ia2/ia2Accessible.cpp | 18 firefox-esr-128.6.0esr/browser/app/profile/firefox.js | 10 firefox-esr-128.6.0esr/browser/base/content/test/general/browser_remoteTroubleshoot.js | 14 firefox-esr-128.6.0esr/browser/base/content/test/general/test_remoteTroubleshoot.html | 13 firefox-esr-128.6.0esr/browser/components/enterprisepolicies/Policies.sys.mjs | 1 firefox-esr-128.6.0esr/browser/components/places/tests/browser/browser_bookmark_copy_folder_tree.js | 27 firefox-esr-128.6.0esr/browser/components/shopping/tests/browser/browser.toml | 4 firefox-esr-128.6.0esr/browser/config/version.txt | 2 firefox-esr-128.6.0esr/browser/config/version_display.txt | 2 firefox-esr-128.6.0esr/build/moz.configure/bootstrap.configure | 4 firefox-esr-128.6.0esr/config/milestone.txt | 2 firefox-esr-128.6.0esr/debian/changelog | 9 firefox-esr-128.6.0esr/debian/patches/debian-hacks/Don-t-auto-disable-extensions-in-system-directories.patch | 2 firefox-esr-128.6.0esr/debian/patches/debian-hacks/Set-DPI-to-system-settings.patch | 2 firefox-esr-128.6.0esr/docshell/base/nsDocShell.cpp | 8 firefox-esr-128.6.0esr/dom/base/StructuredCloneHolder.cpp | 12 firefox-esr-128.6.0esr/dom/base/nsLineBreaker.cpp | 16 firefox-esr-128.6.0esr/dom/canvas/DrawTargetWebgl.cpp | 7 firefox-esr-128.6.0esr/dom/html/HTMLInputElement.cpp | 4 firefox-esr-128.6.0esr/dom/media/eme/mediafoundation/WMFCDMImpl.cpp | 2 firefox-esr-128.6.0esr/dom/media/ipc/MFCDMChild.cpp | 17 firefox-esr-128.6.0esr/dom/media/ipc/MFCDMChild.h | 6 firefox-esr-128.6.0esr/dom/media/tools/generateGmpJson.py | 199 firefox-esr-128.6.0esr/dom/midi/MIDIAccess.cpp | 8 firefox-esr-128.6.0esr/dom/midi/MIDIAccess.h | 18 firefox-esr-128.6.0esr/dom/midi/MIDIPort.cpp | 15 firefox-esr-128.6.0esr/dom/midi/MIDIPort.h | 14 firefox-esr-128.6.0esr/dom/streams/ReadableByteStreamController.cpp | 8 firefox-esr-128.6.0esr/dom/streams/test/xpcshell/xpcshell.toml | 1 firefox-esr-128.6.0esr/image/AnimationFrameBuffer.cpp | 54 firefox-esr-128.6.0esr/image/Decoder.cpp | 14 firefox-esr-128.6.0esr/image/imgFrame.cpp | 49 firefox-esr-128.6.0esr/image/imgFrame.h | 44 firefox-esr-128.6.0esr/image/test/gtest/TestAnimationFrameBuffer.cpp | 9 firefox-esr-128.6.0esr/js/src/builtin/intl/Segmenter.cpp | 37 firefox-esr-128.6.0esr/js/src/builtin/intl/Segmenter.h | 91 firefox-esr-128.6.0esr/js/src/jit-test/tests/auto-regress/bug1928407.js | 14 firefox-esr-128.6.0esr/js/src/jit-test/tests/modules/evaluation-result.js | 11 firefox-esr-128.6.0esr/js/src/vm/Modules.cpp | 15 firefox-esr-128.6.0esr/layout/generic/nsPageContentFrame.cpp | 9 firefox-esr-128.6.0esr/modules/libpref/init/StaticPrefList.yaml | 15 firefox-esr-128.6.0esr/netwerk/dns/effective_tld_names.dat | 1471 ++-- firefox-esr-128.6.0esr/netwerk/dns/nsHostRecord.cpp | 9 firefox-esr-128.6.0esr/netwerk/dns/nsHostRecord.h | 4 firefox-esr-128.6.0esr/netwerk/dns/nsHostResolver.cpp | 8 firefox-esr-128.6.0esr/netwerk/protocol/http/Http2Session.cpp | 12 firefox-esr-128.6.0esr/netwerk/protocol/http/Http2StreamBase.cpp | 4 firefox-esr-128.6.0esr/netwerk/protocol/http/nsHttpConnection.cpp | 11 firefox-esr-128.6.0esr/netwerk/test/unit/head_channels.js | 1 firefox-esr-128.6.0esr/netwerk/wifi/gtest/TestWifiMonitorListenerRemoval.cpp | 159 firefox-esr-128.6.0esr/netwerk/wifi/gtest/moz.build | 1 firefox-esr-128.6.0esr/netwerk/wifi/nsWifiMonitor.cpp | 54 firefox-esr-128.6.0esr/netwerk/wifi/nsWifiMonitor.h | 14 firefox-esr-128.6.0esr/python/mach/mach/site.py | 89 firefox-esr-128.6.0esr/python/mozboot/mozboot/base.py | 40 firefox-esr-128.6.0esr/python/mozboot/mozboot/mozillabuild.py | 4 firefox-esr-128.6.0esr/python/mozboot/mozboot/osx.py | 4 firefox-esr-128.6.0esr/python/mozbuild/mozbuild/artifact_commands.py | 1 firefox-esr-128.6.0esr/python/mozbuild/mozbuild/test/configure/test_bootstrap.py | 3 firefox-esr-128.6.0esr/python/mozversioncontrol/mozversioncontrol/__init__.py | 5 firefox-esr-128.6.0esr/security/manager/ssl/StaticHPKPins.h | 2 firefox-esr-128.6.0esr/security/manager/ssl/nsSTSPreloadList.inc | 3318 ++++------ firefox-esr-128.6.0esr/services/settings/dumps/blocklists/addons-bloomfilters.json | 94 firefox-esr-128.6.0esr/services/settings/dumps/blocklists/addons-bloomfilters/addons-mlbf.bin.meta.json | 2 firefox-esr-128.6.0esr/services/settings/dumps/main/devtools-compatibility-browsers.json | 317 firefox-esr-128.6.0esr/services/settings/dumps/main/search-config-v2.json | 46 firefox-esr-128.6.0esr/services/settings/dumps/main/search-telemetry-v2.json | 715 +- firefox-esr-128.6.0esr/services/settings/dumps/main/translations-models.json | 110 firefox-esr-128.6.0esr/services/settings/dumps/main/translations-wasm.json | 40 firefox-esr-128.6.0esr/services/settings/dumps/security-state/intermediates.json | 769 -- firefox-esr-128.6.0esr/servo/components/selectors/context.rs | 2 firefox-esr-128.6.0esr/servo/components/style/values/generics/calc.rs | 2 firefox-esr-128.6.0esr/servo/components/style/values/specified/calc.rs | 9 firefox-esr-128.6.0esr/sourcestamp.txt | 4 firefox-esr-128.6.0esr/taskcluster/docker/debian-repackage/Dockerfile | 5 firefox-esr-128.6.0esr/taskcluster/docker/firefox-snap/Dockerfile | 71 firefox-esr-128.6.0esr/taskcluster/docker/firefox-snap/Makefile | 12 firefox-esr-128.6.0esr/taskcluster/docker/firefox-snap/download_and_install_snap.sh | 27 firefox-esr-128.6.0esr/taskcluster/docker/firefox-snap/extract_locales_from_l10n_json.py | 15 firefox-esr-128.6.0esr/taskcluster/docker/firefox-snap/firefox.snapcraft.yaml.in | 91 firefox-esr-128.6.0esr/taskcluster/docker/firefox-snap/policies.json | 5 firefox-esr-128.6.0esr/taskcluster/docker/firefox-snap/runme.sh | 104 firefox-esr-128.6.0esr/taskcluster/docker/firefox-snap/tmpdir | 6 firefox-esr-128.6.0esr/taskcluster/docs/attributes.rst | 5 firefox-esr-128.6.0esr/taskcluster/docs/kinds.rst | 8 firefox-esr-128.6.0esr/taskcluster/gecko_taskgraph/transforms/beetmover.py | 11 firefox-esr-128.6.0esr/taskcluster/gecko_taskgraph/transforms/beetmover_snap.py | 42 firefox-esr-128.6.0esr/taskcluster/gecko_taskgraph/transforms/job/__init__.py | 8 firefox-esr-128.6.0esr/taskcluster/gecko_taskgraph/transforms/job/toolchain.py | 8 firefox-esr-128.6.0esr/taskcluster/kinds/docker-image/kind.yml | 2 firefox-esr-128.6.0esr/taskcluster/kinds/release-snap-repackage/kind.yml | 60 firefox-esr-128.6.0esr/taskcluster/kinds/toolchain/dist-toolchains.yml | 2 firefox-esr-128.6.0esr/taskcluster/scripts/misc/build-custom-car.sh | 4 firefox-esr-128.6.0esr/taskcluster/scripts/misc/build-custom-v8.sh | 2 firefox-esr-128.6.0esr/testing/web-platform/meta/css/css-page/pseudo-first-margin-004-print.html.ini | 2 firefox-esr-128.6.0esr/testing/web-platform/tests/css/css-values/round-function.html | 7 firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-first-of-type-when-ancestor-changes-ref.html | 8 firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-first-of-type-when-ancestor-changes.html | 33 firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-last-of-type-when-ancestor-changes-ref.html | 8 firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-last-of-type-when-ancestor-changes.html | 33 firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-first-of-type-when-ancestor-changes-ref.html | 9 firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-first-of-type-when-ancestor-changes.html | 30 firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-last-of-type-when-ancestor-changes-ref.html | 9 firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-last-of-type-when-ancestor-changes.html | 30 firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-first-of-type-when-ancestor-changes-ref.html | 8 firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-first-of-type-when-ancestor-changes.html | 33 firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-last-of-type-when-ancestor-changes-ref.html | 8 firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-last-of-type-when-ancestor-changes.html | 33 firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-first-of-type-when-ancestor-changes-ref.html | 8 firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-first-of-type-when-ancestor-changes.html | 34 firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-last-of-type-when-ancestor-changes-ref.html | 8 firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-last-of-type-when-ancestor-changes.html | 34 firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-first-of-type-when-ancestor-changes-ref.html | 2 firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-first-of-type-when-ancestor-changes.html | 30 firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-last-of-type-when-ancestor-changes-ref.html | 2 firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-last-of-type-when-ancestor-changes.html | 30 firefox-esr-128.6.0esr/toolkit/actors/WebChannelChild.sys.mjs | 50 firefox-esr-128.6.0esr/toolkit/actors/WebChannelParent.sys.mjs | 33 firefox-esr-128.6.0esr/toolkit/components/extensions/test/mochitest/test_ext_protocolHandlers.html | 42 firefox-esr-128.6.0esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_ecosia.js | 3 firefox-esr-128.6.0esr/toolkit/content/gmp-sources/openh264.json | 8 firefox-esr-128.6.0esr/toolkit/content/gmp-sources/widevinecdm.json | 58 firefox-esr-128.6.0esr/toolkit/content/gmp-sources/widevinecdm_l1.json | 5 firefox-esr-128.6.0esr/toolkit/library/build/dependentlibs.py | 23 firefox-esr-128.6.0esr/toolkit/modules/GMPInstallManager.sys.mjs | 2 firefox-esr-128.6.0esr/toolkit/modules/tests/browser/browser_web_channel.js | 54 firefox-esr-128.6.0esr/toolkit/modules/tests/xpcshell/test_GMPInstallManager.js | 440 + firefox-esr-128.6.0esr/toolkit/mozapps/extensions/internal/ProductAddonChecker.sys.mjs | 41 firefox-esr-128.6.0esr/toolkit/mozapps/extensions/test/xpcshell/data/productaddons/good.xml | 7 firefox-esr-128.6.0esr/toolkit/mozapps/extensions/test/xpcshell/test_ProductAddonChecker.js | 66 firefox-esr-128.6.0esr/toolkit/mozapps/extensions/test/xpcshell/test_ProductAddonChecker_signatures.js | 2 firefox-esr-128.6.0esr/toolkit/xre/dllservices/mozglue/WindowsDllBlocklistDefs.in | 3 firefox-esr-128.6.0esr/toolkit/xre/nsAppRunner.cpp | 10 firefox-esr-128.6.0esr/tools/lint/rejected-words.yml | 3 firefox-esr-128.6.0esr/widget/gtk/nsDragService.cpp | 45 firefox-esr-128.6.0esr/widget/gtk/nsDragService.h | 2 firefox-esr-128.6.0esr/widget/windows/WinUtils.cpp | 18 firefox-esr-128.6.0esr/widget/windows/WinUtils.h | 2 firefox-esr-128.6.0esr/widget/windows/nsClipboard.cpp | 43 141 files changed, 5188 insertions(+), 4792 deletions(-) diff -Nru firefox-esr-128.5.0esr/CLOBBER firefox-esr-128.6.0esr/CLOBBER --- firefox-esr-128.5.0esr/CLOBBER 2024-11-18 16:35:17.000000000 +0000 +++ firefox-esr-128.6.0esr/CLOBBER 2024-12-18 15:38:19.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 2024-10-28 \ No newline at end of file +Merge day clobber 2024-11-25 \ No newline at end of file diff -Nru firefox-esr-128.5.0esr/accessible/windows/ia2/ia2Accessible.cpp firefox-esr-128.6.0esr/accessible/windows/ia2/ia2Accessible.cpp --- firefox-esr-128.5.0esr/accessible/windows/ia2/ia2Accessible.cpp 2024-11-18 16:35:17.000000000 +0000 +++ firefox-esr-128.6.0esr/accessible/windows/ia2/ia2Accessible.cpp 2024-12-18 15:38:19.000000000 +0000 @@ -12,12 +12,14 @@ #include "AccessibleStates.h" #include "AccAttributes.h" +#include "ApplicationAccessible.h" #include "Compatibility.h" #include "ia2AccessibleRelation.h" #include "IUnknownImpl.h" #include "nsCoreUtils.h" #include "nsIAccessibleTypes.h" #include "mozilla/a11y/PDocAccessible.h" +#include "mozilla/StaticPrefs_accessibility.h" #include "Relation.h" #include "TextRange-inl.h" #include "nsAccessibilityService.h" @@ -352,6 +354,22 @@ if (!acc) return CO_E_OBJNOTCONNECTED; *aWindowHandle = MsaaAccessible::GetHWNDFor(acc); + if (!*aWindowHandle && !StaticPrefs::accessibility_uia_enable()) { + // Bug 1890155: This can happen if a document is detached from its embedder. + // The document might be about to die or it might be moving to a different + // embedder; e.g. a tab in a different window. The IA2 -> UIA proxy may + // crash if we return a null HWND. For now, pick an arbitrary top level + // Gecko HWND. This might be wrong, but only briefly, since the document + // will either die or move very soon, at which point this method will + // return the correct answer. + // TODO This hack should be removed once we only use our native UIA + // implementation. + if (ApplicationAccessible* app = ApplicationAcc()) { + if (LocalAccessible* firstRoot = app->LocalFirstChild()) { + *aWindowHandle = MsaaAccessible::GetHWNDFor(firstRoot); + } + } + } return S_OK; } diff -Nru firefox-esr-128.5.0esr/browser/app/profile/firefox.js firefox-esr-128.6.0esr/browser/app/profile/firefox.js --- firefox-esr-128.5.0esr/browser/app/profile/firefox.js 2024-11-18 16:35:17.000000000 +0000 +++ firefox-esr-128.6.0esr/browser/app/profile/firefox.js 2024-12-18 15:38:19.000000000 +0000 @@ -1194,15 +1194,9 @@ // We want to make sure mail URLs are handled externally... pref("network.protocol-handler.external.mailto", true); // for mail -#ifdef XP_WIN - pref("network.protocol-handler.external.ms-windows-store", true); -#endif // ...without warning dialogs pref("network.protocol-handler.warn-external.mailto", false); -#ifdef XP_WIN - pref("network.protocol-handler.warn-external.ms-windows-store", false); -#endif // By default, all protocol handlers are exposed. This means that // the browser will respond to openURL commands for all URL types. @@ -2427,10 +2421,6 @@ pref("signon.showAutoCompleteImport", "import"); pref("signon.suggestImportCount", 3); -// Space separated list of URLS that are allowed to send objects (instead of -// only strings) through webchannels. Bug 1275612 tracks removing this pref and capability. -pref("webchannel.allowObject.urlWhitelist", "https://content.cdn.mozilla.net https://install.mozilla.org"); - // Whether or not the browser should scan for unsubmitted // crash reports, and then show a notification for submitting // those reports. diff -Nru firefox-esr-128.5.0esr/browser/base/content/test/general/browser_remoteTroubleshoot.js firefox-esr-128.6.0esr/browser/base/content/test/general/browser_remoteTroubleshoot.js --- firefox-esr-128.5.0esr/browser/base/content/test/general/browser_remoteTroubleshoot.js 2024-11-18 16:35:18.000000000 +0000 +++ firefox-esr-128.6.0esr/browser/base/content/test/general/browser_remoteTroubleshoot.js 2024-12-18 15:38:20.000000000 +0000 @@ -13,9 +13,6 @@ "example.com/browser/browser/base/content/test/general/test_remoteTroubleshoot.html"; const TEST_URI_GOOD = Services.io.newURI("https://" + TEST_URL_TAIL); const TEST_URI_BAD = Services.io.newURI("http://" + TEST_URL_TAIL); -const TEST_URI_GOOD_OBJECT = Services.io.newURI( - "https://" + TEST_URL_TAIL + "?object" -); // Creates a one-shot web-channel for the test data to be sent back from the test page. function promiseChannelResponse(channelID, originOrPermission) { @@ -116,15 +113,4 @@ got.message.errno === 2, "should have failed with errno 2, no such channel" ); - - // Check that the page can send an object as well if it's in the whitelist - let webchannelWhitelistPref = "webchannel.allowObject.urlWhitelist"; - let origWhitelist = Services.prefs.getCharPref(webchannelWhitelistPref); - let newWhitelist = origWhitelist + " https://example.com"; - Services.prefs.setCharPref(webchannelWhitelistPref, newWhitelist); - registerCleanupFunction(() => { - Services.prefs.clearUserPref(webchannelWhitelistPref); - }); - got = await promiseNewChannelResponse(TEST_URI_GOOD_OBJECT); - Assert.ok(got.message, "should have gotten some data back"); }); diff -Nru firefox-esr-128.5.0esr/browser/base/content/test/general/test_remoteTroubleshoot.html firefox-esr-128.6.0esr/browser/base/content/test/general/test_remoteTroubleshoot.html --- firefox-esr-128.5.0esr/browser/base/content/test/general/test_remoteTroubleshoot.html 2024-11-18 16:35:18.000000000 +0000 +++ firefox-esr-128.6.0esr/browser/base/content/test/general/test_remoteTroubleshoot.html 2024-12-18 15:38:20.000000000 +0000 @@ -1,21 +1,12 @@ \ No newline at end of file + +// In this test if the multiplication is factored into the sum first, the +// result of the round will be incorrect, because of floating point inprecision. +// round(down, 2.3333333 - 0.33333334, 1) = round(down, 1.99999996, 1) = 1 +test_math_used('round(down, (7 - 1) / 3, 1)', '2', {type:'number'}); + diff -Nru firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-first-of-type-when-ancestor-changes-ref.html firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-first-of-type-when-ancestor-changes-ref.html --- firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-first-of-type-when-ancestor-changes-ref.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-first-of-type-when-ancestor-changes-ref.html 2024-12-18 15:38:35.000000000 +0000 @@ -0,0 +1,8 @@ + + + +
Shown
diff -Nru firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-first-of-type-when-ancestor-changes.html firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-first-of-type-when-ancestor-changes.html --- firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-first-of-type-when-ancestor-changes.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-first-of-type-when-ancestor-changes.html 2024-12-18 15:38:36.000000000 +0000 @@ -0,0 +1,33 @@ + + + + + + + + +
+
Hidden
+
Shown
+
+ + diff -Nru firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-last-of-type-when-ancestor-changes-ref.html firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-last-of-type-when-ancestor-changes-ref.html --- firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-last-of-type-when-ancestor-changes-ref.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-last-of-type-when-ancestor-changes-ref.html 2024-12-18 15:38:36.000000000 +0000 @@ -0,0 +1,8 @@ + + + +
Shown
diff -Nru firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-last-of-type-when-ancestor-changes.html firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-last-of-type-when-ancestor-changes.html --- firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-last-of-type-when-ancestor-changes.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-last-of-type-when-ancestor-changes.html 2024-12-18 15:38:36.000000000 +0000 @@ -0,0 +1,33 @@ + + + + + + + + +
+
Shown
+
Hidden
+
+ + diff -Nru firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-first-of-type-when-ancestor-changes-ref.html firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-first-of-type-when-ancestor-changes-ref.html --- firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-first-of-type-when-ancestor-changes-ref.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-first-of-type-when-ancestor-changes-ref.html 2024-12-18 15:38:36.000000000 +0000 @@ -0,0 +1,9 @@ + + + +
Shown
+
Shown
diff -Nru firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-first-of-type-when-ancestor-changes.html firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-first-of-type-when-ancestor-changes.html --- firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-first-of-type-when-ancestor-changes.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-first-of-type-when-ancestor-changes.html 2024-12-18 15:38:36.000000000 +0000 @@ -0,0 +1,30 @@ + + + + + + + + +
+
Shown
+
Shown
+
+ + diff -Nru firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-last-of-type-when-ancestor-changes-ref.html firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-last-of-type-when-ancestor-changes-ref.html --- firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-last-of-type-when-ancestor-changes-ref.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-last-of-type-when-ancestor-changes-ref.html 2024-12-18 15:38:36.000000000 +0000 @@ -0,0 +1,9 @@ + + + +
Shown
+
Shown
diff -Nru firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-last-of-type-when-ancestor-changes.html firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-last-of-type-when-ancestor-changes.html --- firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-last-of-type-when-ancestor-changes.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-last-of-type-when-ancestor-changes.html 2024-12-18 15:38:36.000000000 +0000 @@ -0,0 +1,30 @@ + + + + + + + + +
+
Shown
+
Shown
+
+ + diff -Nru firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-first-of-type-when-ancestor-changes-ref.html firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-first-of-type-when-ancestor-changes-ref.html --- firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-first-of-type-when-ancestor-changes-ref.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-first-of-type-when-ancestor-changes-ref.html 2024-12-18 15:38:36.000000000 +0000 @@ -0,0 +1,8 @@ + + + +
Shown
diff -Nru firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-first-of-type-when-ancestor-changes.html firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-first-of-type-when-ancestor-changes.html --- firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-first-of-type-when-ancestor-changes.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-first-of-type-when-ancestor-changes.html 2024-12-18 15:38:36.000000000 +0000 @@ -0,0 +1,33 @@ + + + + + + + + +
+
Hidden
+
Shown
+
+ + diff -Nru firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-last-of-type-when-ancestor-changes-ref.html firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-last-of-type-when-ancestor-changes-ref.html --- firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-last-of-type-when-ancestor-changes-ref.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-last-of-type-when-ancestor-changes-ref.html 2024-12-18 15:38:36.000000000 +0000 @@ -0,0 +1,8 @@ + + + +
Shown
diff -Nru firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-last-of-type-when-ancestor-changes.html firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-last-of-type-when-ancestor-changes.html --- firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-last-of-type-when-ancestor-changes.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-last-of-type-when-ancestor-changes.html 2024-12-18 15:38:35.000000000 +0000 @@ -0,0 +1,33 @@ + + + + + + + + +
+
Shown
+
Hidden
+
+ + diff -Nru firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-first-of-type-when-ancestor-changes-ref.html firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-first-of-type-when-ancestor-changes-ref.html --- firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-first-of-type-when-ancestor-changes-ref.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-first-of-type-when-ancestor-changes-ref.html 2024-12-18 15:38:35.000000000 +0000 @@ -0,0 +1,8 @@ + + + +
Shown
diff -Nru firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-first-of-type-when-ancestor-changes.html firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-first-of-type-when-ancestor-changes.html --- firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-first-of-type-when-ancestor-changes.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-first-of-type-when-ancestor-changes.html 2024-12-18 15:38:35.000000000 +0000 @@ -0,0 +1,34 @@ + + + + + + + + + +
+
Hidden
+
Shown
+
+ + diff -Nru firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-last-of-type-when-ancestor-changes-ref.html firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-last-of-type-when-ancestor-changes-ref.html --- firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-last-of-type-when-ancestor-changes-ref.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-last-of-type-when-ancestor-changes-ref.html 2024-12-18 15:38:35.000000000 +0000 @@ -0,0 +1,8 @@ + + + +
Shown
diff -Nru firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-last-of-type-when-ancestor-changes.html firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-last-of-type-when-ancestor-changes.html --- firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-last-of-type-when-ancestor-changes.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-last-of-type-when-ancestor-changes.html 2024-12-18 15:38:35.000000000 +0000 @@ -0,0 +1,34 @@ + + + + + + + + + +
+
Shown
+
Hidden
+
+ + diff -Nru firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-first-of-type-when-ancestor-changes-ref.html firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-first-of-type-when-ancestor-changes-ref.html --- firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-first-of-type-when-ancestor-changes-ref.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-first-of-type-when-ancestor-changes-ref.html 2024-12-18 15:38:35.000000000 +0000 @@ -0,0 +1,2 @@ + + diff -Nru firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-first-of-type-when-ancestor-changes.html firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-first-of-type-when-ancestor-changes.html --- firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-first-of-type-when-ancestor-changes.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-first-of-type-when-ancestor-changes.html 2024-12-18 15:38:36.000000000 +0000 @@ -0,0 +1,30 @@ + + + + + + + + +
+
Hidden
+
Hidden
+
+ + diff -Nru firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-last-of-type-when-ancestor-changes-ref.html firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-last-of-type-when-ancestor-changes-ref.html --- firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-last-of-type-when-ancestor-changes-ref.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-last-of-type-when-ancestor-changes-ref.html 2024-12-18 15:38:36.000000000 +0000 @@ -0,0 +1,2 @@ + + diff -Nru firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-last-of-type-when-ancestor-changes.html firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-last-of-type-when-ancestor-changes.html --- firefox-esr-128.5.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-last-of-type-when-ancestor-changes.html 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-last-of-type-when-ancestor-changes.html 2024-12-18 15:38:36.000000000 +0000 @@ -0,0 +1,30 @@ + + + + + + + + +
+
Hidden
+
Hidden
+
+ + diff -Nru firefox-esr-128.5.0esr/toolkit/actors/WebChannelChild.sys.mjs firefox-esr-128.6.0esr/toolkit/actors/WebChannelChild.sys.mjs --- firefox-esr-128.5.0esr/toolkit/actors/WebChannelChild.sys.mjs 2024-11-18 16:35:34.000000000 +0000 +++ firefox-esr-128.6.0esr/toolkit/actors/WebChannelChild.sys.mjs 2024-12-18 15:38:40.000000000 +0000 @@ -3,27 +3,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/. */ -import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs"; - import { ContentDOMReference } from "resource://gre/modules/ContentDOMReference.sys.mjs"; -// Preference containing the list (space separated) of origins that are -// allowed to send non-string values through a WebChannel, mainly for -// backwards compatability. See bug 1238128 for more information. -const URL_WHITELIST_PREF = "webchannel.allowObject.urlWhitelist"; - -let _cachedWhitelist = null; - -const CACHED_PREFS = {}; -XPCOMUtils.defineLazyPreferenceGetter( - CACHED_PREFS, - "URL_WHITELIST", - URL_WHITELIST_PREF, - "", - // Null this out so we update it. - () => (_cachedWhitelist = null) -); - export class WebChannelChild extends JSWindowActorChild { handleEvent(event) { if (event.type === "WebChannelMessageToChrome") { @@ -39,37 +20,11 @@ return undefined; } - _getWhitelistedPrincipals() { - if (!_cachedWhitelist) { - let urls = CACHED_PREFS.URL_WHITELIST.split(/\s+/); - _cachedWhitelist = urls.map(origin => - Services.scriptSecurityManager.createContentPrincipalFromOrigin(origin) - ); - } - return _cachedWhitelist; - } - _onMessageToChrome(e) { - // If target is window then we want the document principal, otherwise fallback to target itself. - let principal = e.target.nodePrincipal - ? e.target.nodePrincipal - : e.target.document.nodePrincipal; - if (e.detail) { if (typeof e.detail != "string") { - // Check if the principal is one of the ones that's allowed to send - // non-string values for e.detail. They're whitelisted by site origin, - // so we compare on originNoSuffix in order to avoid other origin attributes - // that are not relevant here, such as containers or private browsing. - let objectsAllowed = this._getWhitelistedPrincipals().some( - whitelisted => principal.originNoSuffix == whitelisted.originNoSuffix - ); - if (!objectsAllowed) { - console.error( - "WebChannelMessageToChrome sent with an object from a non-whitelisted principal" - ); - return; - } + console.error("WebChannelMessageToChrome must only send strings"); + return; } let eventTarget = @@ -79,7 +34,6 @@ this.sendAsyncMessage("WebChannelMessageToChrome", { contentData: e.detail, eventTarget, - principal, }); } else { console.error("WebChannel message failed. No message detail."); diff -Nru firefox-esr-128.5.0esr/toolkit/actors/WebChannelParent.sys.mjs firefox-esr-128.6.0esr/toolkit/actors/WebChannelParent.sys.mjs --- firefox-esr-128.5.0esr/toolkit/actors/WebChannelParent.sys.mjs 2024-11-18 16:35:33.000000000 +0000 +++ firefox-esr-128.6.0esr/toolkit/actors/WebChannelParent.sys.mjs 2024-12-18 15:38:40.000000000 +0000 @@ -5,7 +5,9 @@ import { WebChannelBroker } from "resource://gre/modules/WebChannel.sys.mjs"; -const ERRNO_MISSING_PRINCIPAL = 1; +// Note: ERRNO 1 deprecated and unused. +// We used to err for cases where the child did not send a principal, +// but now we infer it from the actor. const ERRNO_NO_SUCH_CHANNEL = 2; export class WebChannelParent extends JSWindowActorParent { @@ -15,7 +17,7 @@ browsingContext: this.browsingContext, browser: this.browsingContext.top.embedderElement, eventTarget: msg.data.eventTarget, - principal: msg.data.principal, + principal: this.manager.documentPrincipal, }; // data must be a string except for a few legacy origins allowed by browser-content.js. if (typeof data == "string") { @@ -28,28 +30,19 @@ } if (data && data.id) { - if (!msg.data.principal) { + let validChannelFound = WebChannelBroker.tryToDeliver( + data, + sendingContext + ); + + // if no valid origins send an event that there is no such valid channel + if (!validChannelFound) { this._sendErrorEventToContent( data.id, sendingContext, - ERRNO_MISSING_PRINCIPAL, - "Message principal missing" - ); - } else { - let validChannelFound = WebChannelBroker.tryToDeliver( - data, - sendingContext + ERRNO_NO_SUCH_CHANNEL, + "No Such Channel" ); - - // if no valid origins send an event that there is no such valid channel - if (!validChannelFound) { - this._sendErrorEventToContent( - data.id, - sendingContext, - ERRNO_NO_SUCH_CHANNEL, - "No Such Channel" - ); - } } } else { console.error("WebChannel channel id missing"); diff -Nru firefox-esr-128.5.0esr/toolkit/components/extensions/test/mochitest/test_ext_protocolHandlers.html firefox-esr-128.6.0esr/toolkit/components/extensions/test/mochitest/test_ext_protocolHandlers.html --- firefox-esr-128.5.0esr/toolkit/components/extensions/test/mochitest/test_ext_protocolHandlers.html 2024-11-18 16:35:33.000000000 +0000 +++ firefox-esr-128.6.0esr/toolkit/components/extensions/test/mochitest/test_ext_protocolHandlers.html 2024-12-18 15:38:40.000000000 +0000 @@ -531,6 +531,48 @@ await extension.unload(); }); +// Test that the tabs.onUpdated event is fired for extension protocol handlers, +// even if the protocol handler does not exist and opens the error page for +// "The address wasn’t understood". +add_task(async function test_protocolHandler_onUpdated_missing_handler() { + let extensionData = { + manifest: { + permissions: ["tabs"] + }, + + background() { + let urlSeen = false; + let tabPromise = Promise.withResolvers(); + const updateListener = async (tabId, changeInfo) => { + let tab = await tabPromise.promise; + if (tab.id != tabId) { + return; + } + browser.test.log(`tabs.onUpdated fired with changeInfo ${JSON.stringify(changeInfo)}`); + if (!urlSeen && changeInfo.url == "ext+missing:test") { + urlSeen = true; + } + if (urlSeen && changeInfo.status == "complete") { + browser.tabs.onUpdated.removeListener(updateListener); + await browser.tabs.remove(tabId); + browser.test.notifyPass(); + } + }; + browser.tabs.onUpdated.addListener(updateListener); + + browser.test.log("Waiting for tabs.onUpdated event for 'ext+missing:test' with `complete` status."); + browser.tabs.create({ url: "ext+missing:test" }).then( + tab => tabPromise.resolve(tab) + ); + }, + }; + + let extension = ExtensionTestUtils.loadExtension(extensionData); + await extension.startup(); + await extension.awaitFinish(); + await extension.unload(); +}); + // Test that a protocol handler will work if ftp is enabled add_task(async function test_ftp_protocolHandler() { await SpecialPowers.pushPrefEnv({ diff -Nru firefox-esr-128.5.0esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_ecosia.js firefox-esr-128.6.0esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_ecosia.js --- firefox-esr-128.5.0esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_ecosia.js 2024-11-18 16:35:34.000000000 +0000 +++ firefox-esr-128.6.0esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_ecosia.js 2024-12-18 15:38:38.000000000 +0000 @@ -14,6 +14,9 @@ { locales: ["de"], }, + { + regions: ["at", "be", "ch", "de", "es", "it", "nl", "se"], + }, ], }, details: [ diff -Nru firefox-esr-128.5.0esr/toolkit/content/gmp-sources/openh264.json firefox-esr-128.6.0esr/toolkit/content/gmp-sources/openh264.json --- firefox-esr-128.5.0esr/toolkit/content/gmp-sources/openh264.json 2024-11-18 16:35:33.000000000 +0000 +++ firefox-esr-128.6.0esr/toolkit/content/gmp-sources/openh264.json 2024-12-18 15:38:40.000000000 +0000 @@ -7,26 +7,31 @@ "platforms": { "Darwin_aarch64-gcc3": { "fileUrl": "http://ciscobinary.openh264.org/openh264-macosx64-aarch64-31c4d2e4a037526fd30d4e5c39f60885986cf865.zip", + "mirrorUrls": [], "filesize": 477938, "hashValue": "391efb184373d533713a9e99a9e63c3bbaf614e8d8bdfdd84d4d5e53b9a737e75032187309dd00e58b58bb1033ab68d199f994744f6add57dd08f5fbb654d2f3" }, "Darwin_x86_64-gcc3": { "fileUrl": "http://ciscobinary.openh264.org/openh264-macosx64-31c4d2e4a037526fd30d4e5c39f60885986cf865.zip", + "mirrorUrls": [], "filesize": 552074, "hashValue": "c649bfa20c48406ccbae1917d7478773cd5250ef995828b58cc56cc4db0a3c7ce3f89eb187bd1b3d26cda0e5e65322b710cfd66a2953adeea0e4361c51488add" }, "Linux_aarch64-gcc3": { "fileUrl": "http://ciscobinary.openh264.org/openh264-linux64-aarch64-31c4d2e4a037526fd30d4e5c39f60885986cf865.zip", + "mirrorUrls": [], "filesize": 537296, "hashValue": "eab3fca253c10739c4930bdaf83ca7a9a0a3580937e0e945dde3a45bcdb39b6240ae0d7133ebfb10029442322f4ce6e8647917d15afea601351dc8a5f0dbf3ec" }, "Linux_x86-gcc3": { "fileUrl": "http://ciscobinary.openh264.org/openh264-linux32-31c4d2e4a037526fd30d4e5c39f60885986cf865.zip", + "mirrorUrls": [], "filesize": 623151, "hashValue": "d80508260c6419acc09c9fde539b18e9231899786df549bc8c86e564d1fb8c500327adb96bba204a386326dd5213ae907108c9ca4fc64ae385fbb2291e0e8cc5" }, "Linux_x86_64-gcc3": { "fileUrl": "http://ciscobinary.openh264.org/openh264-linux64-31c4d2e4a037526fd30d4e5c39f60885986cf865.zip", + "mirrorUrls": [], "filesize": 583674, "hashValue": "53a58bfb4c8124ad4f7655b99bfdea290033a085e0796b19245b33b91c0948fdac9f0c3e817130b352493a65d9a7a0fc8a7c1eedc618cdaa2b4580734a11cd9c" }, @@ -35,11 +40,13 @@ }, "WINNT_aarch64-msvc-aarch64": { "fileUrl": "http://ciscobinary.openh264.org/openh264-win64-aarch64-31c4d2e4a037526fd30d4e5c39f60885986cf865.zip", + "mirrorUrls": [], "filesize": 412806, "hashValue": "cc3306873d6ad8ea6a27096c8ce75831463633a530d8f1794ae3eba3efd4a572459b6b0f3ac73f46552a7d6c7a29b152e299d862a2f76420eee07d1d39979182" }, "WINNT_x86-msvc": { "fileUrl": "http://ciscobinary.openh264.org/openh264-win32-31c4d2e4a037526fd30d4e5c39f60885986cf865.zip", + "mirrorUrls": [], "filesize": 472465, "hashValue": "b5c8290bbee9503b6f9d2fcc3cbcf94f9b2d4e8ee143e37cfc8c68de593c8189aecfe447b811accecdb564c8788bd05e116f4eda62ac29b3c6b8a6fa5f564ee0" }, @@ -51,6 +58,7 @@ }, "WINNT_x86_64-msvc": { "fileUrl": "http://ciscobinary.openh264.org/openh264-win64-31c4d2e4a037526fd30d4e5c39f60885986cf865.zip", + "mirrorUrls": [], "filesize": 491284, "hashValue": "b667086ed49579592d435df2b486fe30ba1b62ddd169f19e700cd079239747dd3e20058c285fa9c10a533e34f22b5198ed9b1f92ae560a3067f3e3feacc724f1" }, diff -Nru firefox-esr-128.5.0esr/toolkit/content/gmp-sources/widevinecdm.json firefox-esr-128.6.0esr/toolkit/content/gmp-sources/widevinecdm.json --- firefox-esr-128.5.0esr/toolkit/content/gmp-sources/widevinecdm.json 2024-11-18 16:35:33.000000000 +0000 +++ firefox-esr-128.6.0esr/toolkit/content/gmp-sources/widevinecdm.json 2024-12-18 15:38:40.000000000 +0000 @@ -1,40 +1,55 @@ { "hashFunction": "sha512", - "name": "Widevine-4.10.2710.0", + "name": "Widevine-4.10.2830.0", "schema_version": 1000, "vendors": { "gmp-widevinecdm": { "platforms": { "Darwin_aarch64-gcc3": { - "fileUrl": "https://redirector.gvt1.com/edgedl/widevine-cdm/4.10.2710.0-mac-arm64.zip", - "filesize": 14190373, - "hashValue": "3aa1e3e34abffb781fbbcb411a0381a4eb641793042987a8b6bcffdb2c366b52b0cb059c36dceff7146e80fbb98c5ccb2f98af726ce2619fa7bbd4b1d388414e" + "fileUrl": "https://edgedl.me.gvt1.com/edgedl/release2/chrome_component/dhuvyipbjqknanqk7f3zqnv4ku_4.10.2830.0/oimompecagnajdejgnnjijobebaeigek_4.10.2830.0_mac_arm64_lt3covpsgi3bctnfic74bafcxa.crx3", + "mirrorUrls": [ + "https://www.google.com/dl/release2/chrome_component/dhuvyipbjqknanqk7f3zqnv4ku_4.10.2830.0/oimompecagnajdejgnnjijobebaeigek_4.10.2830.0_mac_arm64_lt3covpsgi3bctnfic74bafcxa.crx3" + ], + "filesize": 14171021, + "hashValue": "b960132db31c5ca04f678992a970d415deae3dc8f90b37c61d2d4b67e7a41588f69c08c59476f0a92c765f0d18733bc90ee0786eece936122007a51e609020d6" }, "Darwin_x86_64-gcc3": { "alias": "Darwin_x86_64-gcc3-u-i386-x86_64" }, "Darwin_x86_64-gcc3-u-i386-x86_64": { - "fileUrl": "https://redirector.gvt1.com/edgedl/widevine-cdm/4.10.2710.0-mac-x64.zip", - "filesize": 14934332, - "hashValue": "02e2e5d30cd35d74c8a32192d48b35863bcc71756a323eab84a3c71acfd41dcb56bbb18a0555139cd111f74f7d18dcd821a89f3be0a34b7517fadeaf8b535ac0" + "fileUrl": "https://edgedl.me.gvt1.com/edgedl/release2/chrome_component/huwtmpvskwwuqnqp6gacinr2pu_4.10.2830.0/oimompecagnajdejgnnjijobebaeigek_4.10.2830.0_mac64_ldaompc5meaw6wtyokr33tsf2u.crx3", + "mirrorUrls": [ + "https://www.google.com/dl/release2/chrome_component/huwtmpvskwwuqnqp6gacinr2pu_4.10.2830.0/oimompecagnajdejgnnjijobebaeigek_4.10.2830.0_mac64_ldaompc5meaw6wtyokr33tsf2u.crx3" + ], + "filesize": 14873746, + "hashValue": "681cc2da76bdf84a3dd53aad1b93dd96dc9ce0e75d3297bfc82c09c336ccf022cefdcf327d27f60a514e1f71f373f18812bf632cedf40105dfa6821426853020" }, "Linux_x86_64-gcc3": { - "fileUrl": "https://redirector.gvt1.com/edgedl/widevine-cdm/4.10.2710.0-linux-x64.zip", - "filesize": 13922119, - "hashValue": "661ad969099a89a278384f56a17ae912c3542d585ea4981f3b9a3c6e1a07f8da6ffad9db29cee194bf7834adc3ca258c775cd2b0980e3e6cb7ee8b39600dad58" + "fileUrl": "https://edgedl.me.gvt1.com/edgedl/release2/chrome_component/pjnu5jyln4kujhcmwstuyyvyyu_4.10.2830.0/oimompecagnajdejgnnjijobebaeigek_4.10.2830.0_linux_ace35m3jiw32bj5wzzow5nia7yta.crx3", + "mirrorUrls": [ + "https://www.google.com/dl/release2/chrome_component/pjnu5jyln4kujhcmwstuyyvyyu_4.10.2830.0/oimompecagnajdejgnnjijobebaeigek_4.10.2830.0_linux_ace35m3jiw32bj5wzzow5nia7yta.crx3" + ], + "filesize": 14157618, + "hashValue": "9f1fe2c912897bc644f936170eaa6a2cb13772e9456e377ebcb489ae58b85ce8095d7584c8e51658857e90e06b33f7e8005af58f6e91fe93bae752f3fe561ec6" }, "Linux_x86_64-gcc3-asan": { "alias": "Linux_x86_64-gcc3" }, "WINNT_aarch64-msvc-aarch64": { - "fileUrl": "https://redirector.gvt1.com/edgedl/widevine-cdm/4.10.2710.0-win-arm64.zip", - "filesize": 13900511, - "hashValue": "0f42c5dc0e040036653501fe32cb646123a1018804af4d8890d71bbd716c4e379a81a7d70c0cc5ca4b6ec3aa9cc2612cbc7599f63cbee5c82b03de499df3742e" + "fileUrl": "https://edgedl.me.gvt1.com/edgedl/release2/chrome_component/jglkcuy6uzlia2enwfqikazvyq_4.10.2830.0/oimompecagnajdejgnnjijobebaeigek_4.10.2830.0_win_arm64_hoeiownwxmiaevbnk2xz3nasri.crx3", + "mirrorUrls": [ + "https://www.google.com/dl/release2/chrome_component/jglkcuy6uzlia2enwfqikazvyq_4.10.2830.0/oimompecagnajdejgnnjijobebaeigek_4.10.2830.0_win_arm64_hoeiownwxmiaevbnk2xz3nasri.crx3" + ], + "filesize": 13934163, + "hashValue": "2057c7cfe61b0a55a46db7895aa25fc9a69daed5b924590c6e89700dd41914f22adaa1fec284577e615b0af3da83986d5ee19d405aa2ca57bf13c0b6afabd03d" }, "WINNT_x86-msvc": { - "fileUrl": "https://redirector.gvt1.com/edgedl/widevine-cdm/4.10.2710.0-win-x86.zip", - "filesize": 14250607, - "hashValue": "5e4b8672e9fd6bf7db4c85d7d49bf28a5ca2ed352238fe93610205d16c9af67855aa0b02c71b7410ad45716410fa540ddf5046201f0ff052b2c2374b4c9a4760" + "fileUrl": "https://edgedl.me.gvt1.com/edgedl/release2/chrome_component/adwxj5t3i5sknzmzrdcts2ahocna_4.10.2830.0/oimompecagnajdejgnnjijobebaeigek_4.10.2830.0_win32_pi7fbtgomadufx37pziz5b3buy.crx3", + "mirrorUrls": [ + "https://www.google.com/dl/release2/chrome_component/adwxj5t3i5sknzmzrdcts2ahocna_4.10.2830.0/oimompecagnajdejgnnjijobebaeigek_4.10.2830.0_win32_pi7fbtgomadufx37pziz5b3buy.crx3" + ], + "filesize": 14087836, + "hashValue": "986aa5c6e07e121176e05e1408241f8f3b7288c10ef154a270b0c327a8b0aeb867c963a5235bf80c244457a3e98833ef4a943a91e6bb9af7c52e13343738ac63" }, "WINNT_x86-msvc-x64": { "alias": "WINNT_x86-msvc" @@ -43,9 +58,12 @@ "alias": "WINNT_x86-msvc" }, "WINNT_x86_64-msvc": { - "fileUrl": "https://redirector.gvt1.com/edgedl/widevine-cdm/4.10.2710.0-win-x64.zip", - "filesize": 14485862, - "hashValue": "59521f8c61236641b3299ab460c58c8f5f26fa67e828de853c2cf372f9614d58b9f541aae325b1600ec4f3a47953caacb8122b0dfce7481acfec81045735947d" + "fileUrl": "https://edgedl.me.gvt1.com/edgedl/release2/chrome_component/acccxbt6wwsvpxzpob4hojndwkqq_4.10.2830.0/oimompecagnajdejgnnjijobebaeigek_4.10.2830.0_win64_dldxogwi36sxwpr57ta4lg57z4.crx3", + "mirrorUrls": [ + "https://www.google.com/dl/release2/chrome_component/acccxbt6wwsvpxzpob4hojndwkqq_4.10.2830.0/oimompecagnajdejgnnjijobebaeigek_4.10.2830.0_win64_dldxogwi36sxwpr57ta4lg57z4.crx3" + ], + "filesize": 14507539, + "hashValue": "03105dcf804e4713b6ed7c281ad0343ac6d6eb2aed57a897c6a09515a8c7f3e06b344563e224365dc9159cfd8ed3ef665d6aec18cc07aaad66eed0dc4957dde3" }, "WINNT_x86_64-msvc-x64": { "alias": "WINNT_x86_64-msvc" @@ -54,7 +72,7 @@ "alias": "WINNT_x86_64-msvc" } }, - "version": "4.10.2710.0" + "version": "4.10.2830.0" } } } diff -Nru firefox-esr-128.5.0esr/toolkit/content/gmp-sources/widevinecdm_l1.json firefox-esr-128.6.0esr/toolkit/content/gmp-sources/widevinecdm_l1.json --- firefox-esr-128.5.0esr/toolkit/content/gmp-sources/widevinecdm_l1.json 2024-11-18 16:35:34.000000000 +0000 +++ firefox-esr-128.6.0esr/toolkit/content/gmp-sources/widevinecdm_l1.json 2024-12-18 15:38:39.000000000 +0000 @@ -6,7 +6,10 @@ "gmp-widevinecdm-l1": { "platforms": { "WINNT_x86_64-msvc": { - "fileUrl": "https://redirector.gvt1.com/edgedl/release2/chrome_component/imoffpf67hel7kbknqflao2oo4_1.0.2738.0/neifaoindggfcjicffkgpmnlppeffabd_1.0.2738.0_win64_kj4dp5kifwxbdodqls7e5nzhtm.crx3", + "fileUrl": "https://edgedl.me.gvt1.com/edgedl/release2/chrome_component/imoffpf67hel7kbknqflao2oo4_1.0.2738.0/neifaoindggfcjicffkgpmnlppeffabd_1.0.2738.0_win64_kj4dp5kifwxbdodqls7e5nzhtm.crx3", + "mirrorUrls": [ + "https://www.google.com/dl/release2/chrome_component/imoffpf67hel7kbknqflao2oo4_1.0.2738.0/neifaoindggfcjicffkgpmnlppeffabd_1.0.2738.0_win64_kj4dp5kifwxbdodqls7e5nzhtm.crx3" + ], "filesize": 1181927, "hashValue": "4fd27594c459fb1cd94a857be10f7d1d6216dbf202cd43e8a3fa395a268c72fc5f5c456c9cb314f2220d766af741db469c8bb106acbed419149a44a3b87619f1" }, diff -Nru firefox-esr-128.5.0esr/toolkit/library/build/dependentlibs.py firefox-esr-128.6.0esr/toolkit/library/build/dependentlibs.py --- firefox-esr-128.5.0esr/toolkit/library/build/dependentlibs.py 2024-11-18 16:35:33.000000000 +0000 +++ firefox-esr-128.6.0esr/toolkit/library/build/dependentlibs.py 2024-12-18 15:38:40.000000000 +0000 @@ -95,6 +95,24 @@ return deps +def is_skiplisted(dep): + # Skip the ICU data DLL because preloading it at startup + # leads to startup performance problems because of its excessive + # size (around 10MB). + if dep.startswith("icu"): + return True + # Skip the MSVC Runtimes. See bug #1921713. + if substs.get("WIN32_REDIST_DIR"): + for runtime in [ + "MSVC_C_RUNTIME_DLL", + "MSVC_C_RUNTIME_1_DLL", + "MSVC_CXX_RUNTIME_DLL", + ]: + dll = substs.get(runtime) + if dll and dep == dll: + return True + + def dependentlibs(lib, libpaths, func): """For a given library, returns the list of recursive dependencies that can be found in the given list of paths, followed by the library itself.""" @@ -108,10 +126,7 @@ deppath = os.path.join(dir, dep) if os.path.exists(deppath): deps.update(dependentlibs(deppath, libpaths, func)) - # Black list the ICU data DLL because preloading it at startup - # leads to startup performance problems because of its excessive - # size (around 10MB). - if not dep.startswith(("icu")): + if not is_skiplisted(dep): deps[dep] = deppath break diff -Nru firefox-esr-128.5.0esr/toolkit/modules/GMPInstallManager.sys.mjs firefox-esr-128.6.0esr/toolkit/modules/GMPInstallManager.sys.mjs --- firefox-esr-128.5.0esr/toolkit/modules/GMPInstallManager.sys.mjs 2024-11-18 16:35:34.000000000 +0000 +++ firefox-esr-128.6.0esr/toolkit/modules/GMPInstallManager.sys.mjs 2024-12-18 15:38:40.000000000 +0000 @@ -137,6 +137,7 @@ return { id: conf.id, URL: details.fileUrl, + mirrorURLs: details.mirrorUrls, hashFunction: addons.hashFunction, hashValue: details.hashValue, version: addons.vendors[conf.id].version, @@ -521,6 +522,7 @@ // Update the addon with the final URL and the extracted version. gmpAddon.URL = redirectUrl; + gmpAddon.mirrorURLs = []; gmpAddon.version = version; gmpAddon.usedChromiumUpdate = true; diff -Nru firefox-esr-128.5.0esr/toolkit/modules/tests/browser/browser_web_channel.js firefox-esr-128.6.0esr/toolkit/modules/tests/browser/browser_web_channel.js --- firefox-esr-128.5.0esr/toolkit/modules/tests/browser/browser_web_channel.js 2024-11-18 16:35:34.000000000 +0000 +++ firefox-esr-128.6.0esr/toolkit/modules/tests/browser/browser_web_channel.js 2024-12-18 15:38:39.000000000 +0000 @@ -425,14 +425,13 @@ }, }, { - desc: "WebChannel disallows non-string message from non-whitelisted origin", + desc: "WebChannel disallows non-string messages", async run() { /** * This test ensures that non-string messages can't be sent via WebChannels. - * We create a page (on a non-whitelisted origin) which should send us two - * messages immediately. The first message has an object for it's detail, - * and the second has a string. We check that we only get the second - * message. + * We create a page which should send us two messages immediately. The first + * message has an object for its detail, and the second has a string. We + * check that we only get the second message. */ let channel = new WebChannel("objects", Services.io.newURI(HTTP_PATH)); let testDonePromise = new Promise(resolve => { @@ -452,51 +451,6 @@ channel.stopListening(); } ); - }, - }, - { - desc: "WebChannel allows both string and non-string message from whitelisted origin", - async run() { - /** - * Same process as above, but we whitelist the origin before loading the page, - * and expect to get *both* messages back (each exactly once). - */ - let channel = new WebChannel("objects", Services.io.newURI(HTTP_PATH)); - - let testDonePromise = new Promise((resolve, reject) => { - let sawObject = false; - let sawString = false; - channel.listen((id, message) => { - is(id, "objects"); - if (message.type === "object") { - ok(!sawObject); - sawObject = true; - } else if (message.type === "string") { - ok(!sawString); - sawString = true; - } else { - reject(new Error(`Unknown message type: ${message.type}`)); - } - if (sawObject && sawString) { - resolve(); - } - }); - }); - const webchannelWhitelistPref = "webchannel.allowObject.urlWhitelist"; - let origWhitelist = Services.prefs.getCharPref(webchannelWhitelistPref); - let newWhitelist = origWhitelist + " " + HTTP_PATH; - Services.prefs.setCharPref(webchannelWhitelistPref, newWhitelist); - await BrowserTestUtils.withNewTab( - { - gBrowser, - url: HTTP_PATH + HTTP_ENDPOINT + "?object", - }, - async function () { - await testDonePromise; - Services.prefs.setCharPref(webchannelWhitelistPref, origWhitelist); - channel.stopListening(); - } - ); }, }, { diff -Nru firefox-esr-128.5.0esr/toolkit/modules/tests/xpcshell/test_GMPInstallManager.js firefox-esr-128.6.0esr/toolkit/modules/tests/xpcshell/test_GMPInstallManager.js --- firefox-esr-128.5.0esr/toolkit/modules/tests/xpcshell/test_GMPInstallManager.js 2024-11-18 16:35:35.000000000 +0000 +++ firefox-esr-128.6.0esr/toolkit/modules/tests/xpcshell/test_GMPInstallManager.js 2024-12-18 15:38:40.000000000 +0000 @@ -577,16 +577,34 @@ // Smoke test the results are as expected. // If the checkForAddons fails we'll get a fallback config, // so we'll get incorrect addons and these asserts will fail. - Assert.equal(res.addons.length, 5); + Assert.equal(res.addons.length, 7); Assert.equal(res.addons[0].id, "test1"); Assert.equal(res.addons[0].usedFallback, false); + Assert.deepEqual(res.addons[0].mirrorURLs, []); Assert.equal(res.addons[1].id, "test2"); Assert.equal(res.addons[1].usedFallback, false); + Assert.deepEqual(res.addons[1].mirrorURLs, []); Assert.equal(res.addons[2].id, "test3"); Assert.equal(res.addons[2].usedFallback, false); + Assert.deepEqual(res.addons[2].mirrorURLs, []); Assert.equal(res.addons[3].id, "test4"); Assert.equal(res.addons[3].usedFallback, false); + Assert.deepEqual(res.addons[3].mirrorURLs, []); Assert.equal(res.addons[4].id, undefined); + Assert.equal(res.addons[4].usedFallback, false); + Assert.deepEqual(res.addons[4].mirrorURLs, []); + Assert.equal(res.addons[5].id, "test6"); + Assert.equal(res.addons[5].usedFallback, false); + Assert.deepEqual(res.addons[5].mirrorURLs, [ + "http://alt.example.com/test6.xpi", + ]); + Assert.equal(res.addons[5].mirrorURLs.length, 1); + Assert.equal(res.addons[6].id, "test7"); + Assert.equal(res.addons[6].usedFallback, false); + Assert.deepEqual(res.addons[6].mirrorURLs, [ + "http://alt.example.com/test7.xpi", + "http://alt2.example.com/test7.xpi", + ]); } catch (e) { Assert.ok(false, "checkForAddons should succeed"); } @@ -646,14 +664,33 @@ if (res.addons.length == 1) { Assert.equal(res.addons[0].id, "gmp-widevinecdm"); Assert.equal(res.addons[0].usedFallback, true); + Assert.ok(res.addons[0].URL.startsWith("https://edgedl.me.gvt1.com")); + Assert.equal(res.addons[0].mirrorURLs.length, 1); + Assert.ok( + res.addons[0].mirrorURLs[0].startsWith("https://www.google.com") + ); } else { Assert.equal(res.addons[0].id, "gmp-gmpopenh264"); Assert.equal(res.addons[0].usedFallback, true); + Assert.ok( + res.addons[0].URL.startsWith("http://ciscobinary.openh264.org") + ); + Assert.deepEqual(res.addons[0].mirrorURLs, []); Assert.equal(res.addons[1].id, "gmp-widevinecdm"); Assert.equal(res.addons[1].usedFallback, true); + Assert.ok(res.addons[1].URL.startsWith("https://edgedl.me.gvt1.com")); + Assert.equal(res.addons[1].mirrorURLs.length, 1); + Assert.ok( + res.addons[1].mirrorURLs[0].startsWith("https://www.google.com") + ); if (res.addons.length >= 3) { Assert.equal(res.addons[2].id, "gmp-widevinecdm-l1"); Assert.equal(res.addons[2].usedFallback, true); + Assert.ok(res.addons[2].URL.startsWith("https://edgedl.me.gvt1.com")); + Assert.equal(res.addons[2].mirrorURLs.length, 1); + Assert.ok( + res.addons[2].mirrorURLs[0].startsWith("https://www.google.com") + ); } } } catch (e) { @@ -1019,17 +1056,27 @@ */ async function test_checkForAddons_installAddon( id, - includeSize, - wantInstallReject + sizeConfig, + defaultConfig, + mirrorConfig, + secondMirrorConfig, + expectedError ) { info( "Running installAddon for id: " + id + - ", includeSize: " + - includeSize + - " and wantInstallReject: " + - wantInstallReject + ", sizeConfig: " + + sizeConfig + + ", defaultConfig: " + + defaultConfig + + ", mirrorConfig: " + + mirrorConfig + + ", secondMirrorConfig: " + + secondMirrorConfig + + ", expectedError: " + + expectedError ); + let httpServer = new HttpServer(); let dir = FileUtils.getDir("TmpD", []); httpServer.registerDirectory("/", dir); @@ -1045,10 +1092,45 @@ let hashFunc = "sha256"; let expectedDigest = await IOUtils.computeHexDigest(zipFile.path, hashFunc); let fileSize = zipFile.fileSize; - if (wantInstallReject) { + if (sizeConfig === "mismatch") { fileSize = 1; } + let badZipURL; + let badZipFileName; + let badZipFile; + if ( + defaultConfig === "mismatch" || + mirrorConfig === "mismatch" || + secondMirrorConfig === "mismatch" + ) { + let badData = "e~=0.5772156648"; + badZipFileName = "test_" + id + "_bad_GMP.zip"; + badZipFile = createNewZipFile(badZipFileName, badData); + badZipURL = URL_HOST + ":" + testserverPort + "/" + badZipFileName; + } + + let missingZipURL = zipURL + ".missing"; + + function selectUrl(config) { + switch (config) { + case "success": + return zipURL; + case "not_found": + return missingZipURL; + case "mismatch": + return badZipURL; + case "none": + return null; + default: + throw new Error("bad config " + config); + } + } + + let defaultURL = selectUrl(defaultConfig); + let mirrorURL = selectUrl(mirrorConfig); + let secondMirrorURL = selectUrl(secondMirrorConfig); + let responseXML = '' + "" + @@ -1056,17 +1138,20 @@ ' ' + + (sizeConfig !== "none" ? ' size="' + fileSize + '"' : "") + + ' version="1.1">' + + (mirrorURL ? ' ' : "") + + (secondMirrorURL + ? ' ' + : "") + + " " + " " + ""; @@ -1082,7 +1167,7 @@ try { let extractedPaths = await installManager.installAddon(gmpAddon); - if (wantInstallReject) { + if (sizeConfig === "mismatch") { Assert.ok(false); // installAddon() should have thrown. } Assert.equal(extractedPaths.length, 1); @@ -1120,20 +1205,333 @@ // Cleanup extractedFile.parent.remove(true); - zipFile.remove(false); httpServer.stop(function () {}); installManager.uninit(); + Assert.equal(expectedError, null, "Succeeded without errors"); } catch (ex) { + Assert.ok( + ex?.message?.match(expectedError), + ex?.message + " matches " + expectedError + ); + } finally { zipFile.remove(false); - if (!wantInstallReject) { - do_throw("install update should not reject " + ex.message); + if (badZipFile) { + badZipFile.remove(false); } } } -add_task(test_checkForAddons_installAddon.bind(null, "1", true, false)); -add_task(test_checkForAddons_installAddon.bind(null, "2", false, false)); -add_task(test_checkForAddons_installAddon.bind(null, "3", true, true)); +add_task( + async function test_checkForAddons_installAddon_includeSize_successURL_noMirror() { + await test_checkForAddons_installAddon( + /* id */ "includeSize_successURL_noMirror", + /* sizeConfig */ "include", + /* defaultConfig */ "success", + /* mirrorConfig */ "none", + /* secondMirrorConfig */ "none", + /* expectedError */ null + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_noSize_successURL_noMirror() { + await test_checkForAddons_installAddon( + /* id */ "noSize_successURL_noMirror", + /* sizeConfig */ "none", + /* defaultConfig */ "success", + /* mirrorConfig */ "none", + /* secondMirrorConfig */ "none", + /* expectedError */ null + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_mismatchSize_successURL_noMirror() { + await test_checkForAddons_installAddon( + /* id */ "mismatchSize_successURL_noMirror", + /* sizeConfig */ "mismatch", + /* defaultConfig */ "success", + /* mirrorConfig */ "none", + /* secondMirrorConfig */ "none", + /* expectedError */ /Downloaded file was \d+ bytes but expected \d+ bytes/ + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_includeSize_notFoundURL_noMirror() { + await test_checkForAddons_installAddon( + /* id */ "includeSize_notFoundURL_noMirror", + /* sizeConfig */ "include", + /* defaultConfig */ "not_found", + /* mirrorConfig */ "none", + /* secondMirrorConfig */ "none", + /* expectedError */ /File download failed/ + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_noSize_notFoundURL_noMirror() { + await test_checkForAddons_installAddon( + /* id */ "noSize_notFoundURL_noMirror", + /* sizeConfig */ "none", + /* defaultConfig */ "not_found", + /* mirrorConfig */ "none", + /* secondMirrorConfig */ "none", + /* expectedError */ /File download failed/ + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_includeSize_mismatchURL_noMirror() { + await test_checkForAddons_installAddon( + /* id */ "includeSize_mismatchURL_noMirror", + /* sizeConfig */ "include", + /* defaultConfig */ "mismatch", + /* mirrorConfig */ "none", + /* secondMirrorConfig */ "none", + /* expectedError */ /Hash was [\w`]+ but expected [\w`]+/ + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_noSize_mismatchURL_noMirror() { + await test_checkForAddons_installAddon( + /* id */ "noSize_mismatchURL_noMirror", + /* sizeConfig */ "none", + /* defaultConfig */ "mismatch", + /* mirrorConfig */ "none", + /* secondMirrorConfig */ "none", + /* expectedError */ /Hash was [\w`]+ but expected [\w`]+/ + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_includeSize_successURL_successMirror() { + await test_checkForAddons_installAddon( + /* id */ "includeSize_successURL_successMirror", + /* sizeConfig */ "include", + /* defaultConfig */ "success", + /* mirrorConfig */ "success", + /* secondMirrorConfig */ "none", + /* expectedError */ null + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_noSize_successURL_successMirror() { + await test_checkForAddons_installAddon( + /* id */ "noSize_successURL_successMirror", + /* sizeConfig */ "none", + /* defaultConfig */ "success", + /* mirrorConfig */ "success", + /* secondMirrorConfig */ "none", + /* expectedError */ null + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_mismatchSize_successURL_successMirror() { + await test_checkForAddons_installAddon( + /* id */ "mismatchSize_successURL_successMirror", + /* sizeConfig */ "mismatch", + /* defaultConfig */ "success", + /* mirrorConfig */ "success", + /* secondMirrorConfig */ "none", + /* expectedError */ /Downloaded file was \d+ bytes but expected \d+ bytes/ + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_includeSize_notFoundURL_successMirror() { + await test_checkForAddons_installAddon( + /* id */ "includeSize_notFoundURL_successMirror", + /* sizeConfig */ "include", + /* defaultConfig */ "not_found", + /* mirrorConfig */ "success", + /* secondMirrorConfig */ "none", + /* expectedError */ null + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_noSize_notFoundURL_successMirror() { + await test_checkForAddons_installAddon( + /* id */ "noSize_notFoundURL_successMirror", + /* sizeConfig */ "none", + /* defaultConfig */ "not_found", + /* mirrorConfig */ "success", + /* secondMirrorConfig */ "none", + /* expectedError */ null + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_mismatchSize_notFoundURL_successMirror() { + await test_checkForAddons_installAddon( + /* id */ "mismatchSize_notFoundURL_successMirror", + /* sizeConfig */ "mismatch", + /* defaultConfig */ "not_found", + /* mirrorConfig */ "success", + /* secondMirrorConfig */ "none", + /* expectedError */ /File download failed/ + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_includeSize_mismatchURL_successMirror() { + await test_checkForAddons_installAddon( + /* id */ "includeSize_mismatchURL_successMirror", + /* sizeConfig */ "include", + /* defaultConfig */ "mismatch", + /* mirrorConfig */ "success", + /* secondMirrorConfig */ "none", + /* expectedError */ null + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_noSize_mismatchURL_successMirror() { + await test_checkForAddons_installAddon( + /* id */ "noSize_mismatchURL_successMirror", + /* sizeConfig */ "none", + /* defaultConfig */ "mismatch", + /* mirrorConfig */ "success", + /* secondMirrorConfig */ "none", + /* expectedError */ null + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_mismatchSize_mismatchURL_successMirror() { + await test_checkForAddons_installAddon( + /* id */ "mismatchSize_mismatchURL_successMirror", + /* sizeConfig */ "mismatch", + /* defaultConfig */ "mismatch", + /* mirrorConfig */ "success", + /* secondMirrorConfig */ "none", + /* expectedError */ /Downloaded file was \d+ bytes but expected \d+ bytes/ + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_noSize_mismatchURL_mismatchMirror() { + await test_checkForAddons_installAddon( + /* id */ "noSize_mismatchURL_mismatchMirror", + /* sizeConfig */ "none", + /* defaultConfig */ "mismatch", + /* mirrorConfig */ "mismatch", + /* secondMirrorConfig */ "none", + /* expectedError */ /Hash was [\w`]+ but expected [\w`]+/ + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_noSize_notFoundURL_notFoundMirrors() { + await test_checkForAddons_installAddon( + /* id */ "noSize_notFoundURL_notFoundMirrors", + /* sizeConfig */ "none", + /* defaultConfig */ "not_found", + /* mirrorConfig */ "not_found", + /* secondMirrorConfig */ "not_found", + /* expectedError */ /File download failed/ + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_noSize_notFoundURL_notFoundAndSuccessMirrors() { + await test_checkForAddons_installAddon( + /* id */ "noSize_notFoundURL_notFoundAndSuccessMirrors", + /* sizeConfig */ "none", + /* defaultConfig */ "not_found", + /* mirrorConfig */ "not_found", + /* secondMirrorConfig */ "success", + /* expectedError */ null + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_noSize_mismatchURL_mismatchMirrors() { + await test_checkForAddons_installAddon( + /* id */ "noSize_mismatchURL_mismatchMirrors", + /* sizeConfig */ "none", + /* defaultConfig */ "mismatch", + /* mirrorConfig */ "mismatch", + /* secondMirrorConfig */ "mismatch", + /* expectedError */ /Hash was [\w`]+ but expected [\w`]+/ + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_noSize_mismatchURL_mismatchAndSuccessMirrors() { + await test_checkForAddons_installAddon( + /* id */ "noSize_mismatchURL_mismatchAndSuccessMirrors", + /* sizeConfig */ "none", + /* defaultConfig */ "mismatch", + /* mirrorConfig */ "mismatch", + /* secondMirrorConfig */ "success", + /* expectedError */ null + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_includeSize_successURL_notFoundMirrors() { + await test_checkForAddons_installAddon( + /* id */ "includeSize_successURL_notFoundMirrors", + /* sizeConfig */ "include", + /* defaultConfig */ "success", + /* mirrorConfig */ "not_found", + /* secondMirrorConfig */ "not_found", + /* expectedError */ null + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_includeSize_successURL_mismatchMirrors() { + await test_checkForAddons_installAddon( + /* id */ "includeSize_successURL_mismatchMirrors", + /* sizeConfig */ "include", + /* defaultConfig */ "success", + /* mirrorConfig */ "mismatch", + /* secondMirrorConfig */ "mismatch", + /* expectedError */ null + ); + } +); + +add_task( + async function test_checkForAddons_installAddon_includeSize_mismatchURL_successAndMismatchMirrors() { + await test_checkForAddons_installAddon( + /* id */ "includeSize_mismatchURL_successAndMismatchMirrors", + /* sizeConfig */ "include", + /* defaultConfig */ "mismatch", + /* mirrorConfig */ "success", + /* secondMirrorConfig */ "mismatch", + /* expectedError */ null + ); + } +); /** * Tests simpleCheckAndInstall when autoupdate is disabled for a GMP @@ -1633,7 +2031,7 @@ // `cat toolkit/mozapps/extensions/test/xpcshell/data/productaddons/good.xml | ./mach python security/manager/ssl/tests/unit/test_content_signing/pysign.py` // If test certificates are regenerated, this signature must also be. const goodXmlContentSignature = - "7QYnPqFoOlS02BpDdIRIljzmPr6BFwPs1z1y8KJUBlnU7EVG6FbnXmVVt5Op9wDzgvhXX7th8qFJvpPOZs_B_tHRDNJ8SK0HN95BAN15z3ZW2r95SSHmU-fP2JgoNOR3"; + "7QYnPqFoOlS02BpDdIRIljzmPr6BFwPs1z1y8KJUBlnU7EVG6FbnXmVVt5Op9wDzHeN7pJOM7ANmTqU50IbHnV8q87wmY83QL4p6NZzjsFnWolFmwK2ZjlLnhyxFcVSz"; // Setup endpoint to handle x5u lookups correctly. const validX5uPath = "/valid_x5u"; diff -Nru firefox-esr-128.5.0esr/toolkit/mozapps/extensions/internal/ProductAddonChecker.sys.mjs firefox-esr-128.6.0esr/toolkit/mozapps/extensions/internal/ProductAddonChecker.sys.mjs --- firefox-esr-128.5.0esr/toolkit/mozapps/extensions/internal/ProductAddonChecker.sys.mjs 2024-11-18 16:35:35.000000000 +0000 +++ firefox-esr-128.6.0esr/toolkit/mozapps/extensions/internal/ProductAddonChecker.sys.mjs 2024-12-18 15:38:40.000000000 +0000 @@ -386,7 +386,7 @@ let results = []; let addonList = document.querySelectorAll("updates:root > addons > addon"); for (let addonElement of addonList) { - let addon = {}; + let addon = { mirrorURLs: [] }; for (let name of [ "id", @@ -402,6 +402,13 @@ } addon.size = Number(addon.size) || undefined; + let mirrorList = addonElement.querySelectorAll("mirror"); + for (let mirrorElement of mirrorList) { + if (mirrorElement.hasAttribute("URL")) { + addon.mirrorURLs.push(mirrorElement.getAttribute("URL")); + } + } + results.push(addon); } @@ -479,6 +486,26 @@ }); } +async function downloadAndVerifyFile(addon, url, options) { + logger.info(`Try to download addon ${addon.id} from ${url}`); + let path; + try { + path = await downloadFile(url, options); + } catch (e) { + logger.warn(`Failed to download addon ${addon.id} from ${url}: ${e}`); + throw e; + } + + try { + await verifyFile(addon, path); + return path; + } catch (e) { + logger.warn(`Failed to verify addon ${addon.id} from ${url}: ${e}`); + await IOUtils.remove(path); + throw e; + } +} + /** * Verifies that a downloaded file matches what was expected. * @@ -577,12 +604,16 @@ * with a JS exception in case of error. */ async downloadAddon(addon, options = { httpsOnlyNoUpgrade: false }) { - let path = await downloadFile(addon.URL, options); try { - await verifyFile(addon, path); - return path; + return await downloadAndVerifyFile(addon, addon.URL, options); } catch (e) { - await IOUtils.remove(path); + for (const url of addon.mirrorURLs) { + try { + return await downloadAndVerifyFile(addon, url, options); + } catch { + // Already logged; ignore error and continue. + } + } throw e; } }, diff -Nru firefox-esr-128.5.0esr/toolkit/mozapps/extensions/test/xpcshell/data/productaddons/good.xml firefox-esr-128.6.0esr/toolkit/mozapps/extensions/test/xpcshell/data/productaddons/good.xml --- firefox-esr-128.5.0esr/toolkit/mozapps/extensions/test/xpcshell/data/productaddons/good.xml 2024-11-18 16:35:34.000000000 +0000 +++ firefox-esr-128.6.0esr/toolkit/mozapps/extensions/test/xpcshell/data/productaddons/good.xml 2024-12-18 15:38:40.000000000 +0000 @@ -7,5 +7,12 @@ + + + + + + + diff -Nru firefox-esr-128.5.0esr/toolkit/mozapps/extensions/test/xpcshell/test_ProductAddonChecker.js firefox-esr-128.6.0esr/toolkit/mozapps/extensions/test/xpcshell/test_ProductAddonChecker.js --- firefox-esr-128.5.0esr/toolkit/mozapps/extensions/test/xpcshell/test_ProductAddonChecker.js 2024-11-18 16:35:34.000000000 +0000 +++ firefox-esr-128.6.0esr/toolkit/mozapps/extensions/test/xpcshell/test_ProductAddonChecker.js 2024-12-18 15:38:40.000000000 +0000 @@ -124,8 +124,7 @@ let res = await ProductAddonChecker.getProductAddonList(root + "good.xml"); Assert.ok(Array.isArray(res.addons)); - // There are three valid entries in the XML - Assert.equal(res.addons.length, 5); + Assert.equal(res.addons.length, 7); let addon = res.addons[0]; Assert.equal(addon.id, "test1"); @@ -134,6 +133,7 @@ Assert.equal(addon.hashValue, undefined); Assert.equal(addon.version, undefined); Assert.equal(addon.size, undefined); + Assert.deepEqual(addon.mirrorURLs, []); addon = res.addons[1]; Assert.equal(addon.id, "test2"); @@ -142,6 +142,7 @@ Assert.equal(addon.hashValue, "djhfgsjdhf"); Assert.equal(addon.version, undefined); Assert.equal(addon.size, undefined); + Assert.deepEqual(addon.mirrorURLs, []); addon = res.addons[2]; Assert.equal(addon.id, "test3"); @@ -150,6 +151,7 @@ Assert.equal(addon.hashValue, undefined); Assert.equal(addon.version, "1.0"); Assert.equal(addon.size, 45); + Assert.deepEqual(addon.mirrorURLs, []); addon = res.addons[3]; Assert.equal(addon.id, "test4"); @@ -158,6 +160,7 @@ Assert.equal(addon.hashValue, undefined); Assert.equal(addon.version, undefined); Assert.equal(addon.size, undefined); + Assert.deepEqual(addon.mirrorURLs, []); addon = res.addons[4]; Assert.equal(addon.id, undefined); @@ -166,6 +169,28 @@ Assert.equal(addon.hashValue, undefined); Assert.equal(addon.version, undefined); Assert.equal(addon.size, undefined); + Assert.deepEqual(addon.mirrorURLs, []); + + addon = res.addons[5]; + Assert.equal(addon.id, "test6"); + Assert.equal(addon.URL, "http://example.com/test6.xpi"); + Assert.equal(addon.hashFunction, undefined); + Assert.equal(addon.hashValue, undefined); + Assert.equal(addon.version, undefined); + Assert.equal(addon.size, undefined); + Assert.deepEqual(addon.mirrorURLs, ["http://alt.example.com/test6.xpi"]); + + addon = res.addons[6]; + Assert.equal(addon.id, "test7"); + Assert.equal(addon.URL, "http://example.com/test7.xpi"); + Assert.equal(addon.hashFunction, undefined); + Assert.equal(addon.hashValue, undefined); + Assert.equal(addon.version, undefined); + Assert.equal(addon.size, undefined); + Assert.deepEqual(addon.mirrorURLs, [ + "http://alt.example.com/test7.xpi", + "http://alt2.example.com/test7.xpi", + ]); }); add_task(async function test_download_nourl() { @@ -195,6 +220,20 @@ } }); +add_task(async function test_download_mirror_missing() { + try { + let path = await ProductAddonChecker.downloadAddon({ + URL: root + "nofile.xpi", + mirrorURLs: [root + "nofile.xpi"], + }); + + await IOUtils.remove(path); + do_throw("Should not have downloaded a missing file"); + } catch (e) { + Assert.ok(true, "Should have thrown when downloading a missing file."); + } +}); + add_task(async function test_download_noverify() { let path = await ProductAddonChecker.downloadAddon({ URL: root + "unsigned.xpi", @@ -293,6 +332,29 @@ size: 452, hashFunction: "sha256", hashValue: + "9b9abf7ddfc1a6d7ffc7e0247481dcc202363e4445ad3494fb22036f1698c7f3", + }); + + let stat = await IOUtils.stat(path); + Assert.ok(stat.type !== "directory"); + + Assert.ok( + compareFiles( + do_get_file("data/productaddons/unsigned.xpi"), + new LocalFile(path) + ) + ); + + await IOUtils.remove(path); +}); + +add_task(async function test_download_mirror_works() { + let path = await ProductAddonChecker.downloadAddon({ + URL: root + "nofile.xpi", + mirrorURLs: [root + "unsigned.xpi"], + size: 452, + hashFunction: "sha256", + hashValue: "9b9abf7ddfc1a6d7ffc7e0247481dcc202363e4445ad3494fb22036f1698c7f3", }); diff -Nru firefox-esr-128.5.0esr/toolkit/mozapps/extensions/test/xpcshell/test_ProductAddonChecker_signatures.js firefox-esr-128.6.0esr/toolkit/mozapps/extensions/test/xpcshell/test_ProductAddonChecker_signatures.js --- firefox-esr-128.5.0esr/toolkit/mozapps/extensions/test/xpcshell/test_ProductAddonChecker_signatures.js 2024-11-18 16:35:34.000000000 +0000 +++ firefox-esr-128.6.0esr/toolkit/mozapps/extensions/test/xpcshell/test_ProductAddonChecker_signatures.js 2024-12-18 15:38:40.000000000 +0000 @@ -49,7 +49,7 @@ // `cat toolkit/mozapps/extensions/test/xpcshell/data/productaddons/good.xml | ./mach python security/manager/ssl/tests/unit/test_content_signing/pysign.py` // If test certificates are regenerated, this signature must also be. const goodXmlContentSignature = - "7QYnPqFoOlS02BpDdIRIljzmPr6BFwPs1z1y8KJUBlnU7EVG6FbnXmVVt5Op9wDzgvhXX7th8qFJvpPOZs_B_tHRDNJ8SK0HN95BAN15z3ZW2r95SSHmU-fP2JgoNOR3"; + "7QYnPqFoOlS02BpDdIRIljzmPr6BFwPs1z1y8KJUBlnU7EVG6FbnXmVVt5Op9wDzHeN7pJOM7ANmTqU50IbHnV8q87wmY83QL4p6NZzjsFnWolFmwK2ZjlLnhyxFcVSz"; const goodXmlPath = "/good.xml"; // Requests use query strings to test different signature states. diff -Nru firefox-esr-128.5.0esr/toolkit/xre/dllservices/mozglue/WindowsDllBlocklistDefs.in firefox-esr-128.6.0esr/toolkit/xre/dllservices/mozglue/WindowsDllBlocklistDefs.in --- firefox-esr-128.5.0esr/toolkit/xre/dllservices/mozglue/WindowsDllBlocklistDefs.in 2024-11-18 16:35:34.000000000 +0000 +++ firefox-esr-128.6.0esr/toolkit/xre/dllservices/mozglue/WindowsDllBlocklistDefs.in 2024-12-18 15:38:40.000000000 +0000 @@ -347,6 +347,9 @@ # old AMD JPEG decoder DLLs (bug 1328838) DllBlocklistEntry("amf-wic-jpeg-decoder64.dll", ALL_VERSIONS), DllBlocklistEntry("amf-wic-jpeg-decoder32.dll", ALL_VERSIONS), + + # Qihoo 360 Total Security (bug 1934258) + DllBlocklistEntry("chromesafe64.dll", (2, 0, 0, 26)), ] CHILD_PROCESSES += [ diff -Nru firefox-esr-128.5.0esr/toolkit/xre/nsAppRunner.cpp firefox-esr-128.6.0esr/toolkit/xre/nsAppRunner.cpp --- firefox-esr-128.5.0esr/toolkit/xre/nsAppRunner.cpp 2024-11-18 16:35:34.000000000 +0000 +++ firefox-esr-128.6.0esr/toolkit/xre/nsAppRunner.cpp 2024-12-18 15:38:39.000000000 +0000 @@ -2657,6 +2657,10 @@ rv = xpcom.SetWindowCreator(aNative); NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE); +# ifdef XP_MACOSX + InitializeMacApp(); +# endif + { // extra scoping is needed so we release these components before xpcom // shutdown nsCOMPtr sbs = @@ -2687,7 +2691,7 @@ return NS_ERROR_ABORT; } -#endif // MOZ_WIDGET_ANDROID +#endif // MOZ_WIDGET_ANDROID } static ReturnAbortOnError ProfileLockedDialog(nsIFile* aProfileDir, @@ -3241,6 +3245,10 @@ rv = xpcom.SetWindowCreator(aNative); NS_ENSURE_SUCCESS(rv, rv); +# ifdef XP_MACOSX + InitializeMacApp(); +# endif + { // extra scoping is needed so we release these components before xpcom // shutdown bool hasSync = false; diff -Nru firefox-esr-128.5.0esr/tools/lint/rejected-words.yml firefox-esr-128.6.0esr/tools/lint/rejected-words.yml --- firefox-esr-128.5.0esr/tools/lint/rejected-words.yml 2024-11-18 16:35:34.000000000 +0000 +++ firefox-esr-128.6.0esr/tools/lint/rejected-words.yml 2024-12-18 15:38:40.000000000 +0000 @@ -35,7 +35,6 @@ - browser/app/winlauncher/LauncherProcessWin.cpp - browser/base/content/browser.js - browser/base/content/contentTheme.js - - browser/base/content/test/general/browser_remoteTroubleshoot.js - browser/base/content/test/general/browser_tab_drag_drop_perwindow.js - browser/base/content/test/performance/browser_preferences_usage.js - browser/base/content/test/protectionsUI/browser_protectionsUI_cryptominers.js @@ -234,7 +233,6 @@ - testing/raptor/browsertime/browsertime_scenario.js - testing/web-platform/tests/tools/manifest/tests/test_manifest.py - toolkit/actors/RemotePageChild.sys.mjs - - toolkit/actors/WebChannelChild.sys.mjs - toolkit/components/antitracking/docs/tracking-lists/index.md - toolkit/components/antitracking/test/browser/browser_socialtracking_save_image.js - toolkit/components/reputationservice/ApplicationReputation.cpp @@ -270,7 +268,6 @@ - toolkit/content/tests/browser/browser_delay_autoplay_webAudio.js - toolkit/modules/PermissionsUtils.sys.mjs - toolkit/modules/tests/browser/browser_AsyncPrefs.js - - toolkit/modules/tests/browser/browser_web_channel.js - toolkit/modules/tests/xpcshell/test_PermissionsUtils.js - toolkit/modules/third_party/jsesc/jsesc.mjs - toolkit/modules/Troubleshoot.sys.mjs diff -Nru firefox-esr-128.5.0esr/widget/gtk/nsDragService.cpp firefox-esr-128.6.0esr/widget/gtk/nsDragService.cpp --- firefox-esr-128.5.0esr/widget/gtk/nsDragService.cpp 2024-11-18 16:35:35.000000000 +0000 +++ firefox-esr-128.6.0esr/widget/gtk/nsDragService.cpp 2024-12-18 15:38:40.000000000 +0000 @@ -62,7 +62,7 @@ using namespace mozilla::gfx; // The maximum time to wait for a "drag_received" arrived in microseconds. -#define NS_DND_TIMEOUT (5 * 1000000) +#define NS_DND_TIMEOUT (1 * 1000000) // The maximum time to wait before temporary files resulting // from drag'n'drop events will be removed in miliseconds. @@ -480,6 +480,18 @@ DragData::DragData(GdkAtom aDataFlavor, gchar** aDragUris) : mDataFlavor(aDataFlavor), mAsURIData(true), mDragUris(aDragUris) {} +bool DragData::IsDataValid() const { + if (mDragData) { + return mDragData.get() && mDragDataLen; + } else if (mDragUris) { + return !!(mDragUris.get()[0]); + } else if (mUris.Length()) { + return mUris.Length(); + } else { + return false; + } +} + #ifdef MOZ_LOGGING void DragData::Print() const { if (mDragData) { @@ -1469,18 +1481,32 @@ aContext, GUniquePtr(gdk_atom_name(target)).get(), mWaitingForDragDataRequests); - auto cacheClear = MakeScopeExit([&] { - LOGDRAGSERVICE(" failed to get data, MIME %s", - GUniquePtr(gdk_atom_name(target)).get()); - mCachedDragData.Remove(target); + RefPtr dragData; + + auto saveData = MakeScopeExit([&] { + if (dragData && !dragData->IsDataValid()) { + dragData = nullptr; + } + if (!dragData) { + LOGDRAGSERVICE(" failed to get data, MIME %s", + GUniquePtr(gdk_atom_name(target)).get()); + return; + } + mCachedDragData.InsertOrUpdate(target, dragData); }); - RefPtr dragData; - if (gtk_targets_include_uri(&target, 1)) { + if (target == sTextUriListTypeAtom || target == sPortalFileAtom || + target == sPortalFileTransferAtom) { + // Direct replace gtk_targets_include_uri() with explicit check. + // gtk_targets_include_uri() on old Gtk3 systems doesn't support + // portal filetypes. if (target == sPortalFileAtom || target == sPortalFileTransferAtom) { const guchar* data = gtk_selection_data_get_data(aSelectionData); if (!data || data[0] == '\0') { - LOGDRAGSERVICE(" TargetDataReceived() failed"); + LOGDRAGSERVICE( + "nsDragSession::TargetDataReceived() failed to get file portal data" + " (%s)", + GUniquePtr(gdk_atom_name(target)).get()); return; } @@ -1528,9 +1554,6 @@ #if MOZ_LOGGING dragData->Print(); #endif - - cacheClear.release(); - mCachedDragData.InsertOrUpdate(target, dragData); } static void TargetArrayAddTarget(nsTArray& aTargetArray, diff -Nru firefox-esr-128.5.0esr/widget/gtk/nsDragService.h firefox-esr-128.6.0esr/widget/gtk/nsDragService.h --- firefox-esr-128.5.0esr/widget/gtk/nsDragService.h 2024-11-18 16:35:34.000000000 +0000 +++ firefox-esr-128.6.0esr/widget/gtk/nsDragService.h 2024-12-18 15:38:40.000000000 +0000 @@ -58,6 +58,8 @@ int GetURIsNum() const; + bool IsDataValid() const; + #ifdef MOZ_LOGGING void Print() const; #endif diff -Nru firefox-esr-128.5.0esr/widget/windows/WinUtils.cpp firefox-esr-128.6.0esr/widget/windows/WinUtils.cpp --- firefox-esr-128.5.0esr/widget/windows/WinUtils.cpp 2024-11-18 16:35:34.000000000 +0000 +++ firefox-esr-128.6.0esr/widget/windows/WinUtils.cpp 2024-12-18 15:38:40.000000000 +0000 @@ -7,6 +7,7 @@ #include "WinUtils.h" #include +#include #include #include "gfxPlatform.h" @@ -2070,6 +2071,23 @@ : nullptr; } +nsresult WinUtils::GetProcessImageName(DWORD aProcessId, nsAString& aName) { + nsAutoHandle procHandle( + ::OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, aProcessId)); + if (!procHandle) { + return NS_ERROR_NOT_AVAILABLE; + } + + wchar_t path[MAX_PATH] = {L'\0'}; + auto len = ::GetProcessImageFileNameW(procHandle, path, std::size(path)); + if (!len) { + return NS_ERROR_FAILURE; + } + + aName = path; + return NS_OK; +} + // Note to testers and/or test-authors: on Windows 10, and possibly on other // versions as well, supplying the `WS_EX_LAYOUTRTL` flag here has no effect // whatsoever on child common-dialogs **unless the system UI locale is also set diff -Nru firefox-esr-128.5.0esr/widget/windows/WinUtils.h firefox-esr-128.6.0esr/widget/windows/WinUtils.h --- firefox-esr-128.5.0esr/widget/windows/WinUtils.h 2024-11-18 16:35:34.000000000 +0000 +++ firefox-esr-128.6.0esr/widget/windows/WinUtils.h 2024-12-18 15:38:40.000000000 +0000 @@ -566,6 +566,8 @@ static void GetClipboardFormatAsString(UINT aFormat, nsAString& aOutput); + static nsresult GetProcessImageName(DWORD aProcessId, nsAString& aName); + private: static WhitelistVec BuildWhitelist(); diff -Nru firefox-esr-128.5.0esr/widget/windows/nsClipboard.cpp firefox-esr-128.6.0esr/widget/windows/nsClipboard.cpp --- firefox-esr-128.5.0esr/widget/windows/nsClipboard.cpp 2024-11-18 16:35:34.000000000 +0000 +++ firefox-esr-128.6.0esr/widget/windows/nsClipboard.cpp 2024-12-18 15:38:39.000000000 +0000 @@ -393,6 +393,35 @@ } } +static void MaybeLogClipboardCurrentOwner( + const HRESULT aHres, const mozilla::StaticString& aMethodName) { + if (!MOZ_CLIPBOARD_LOG_ENABLED()) { + return; + } + + if (aHres != CLIPBRD_E_CANT_OPEN) { + return; + } + auto hwnd = ::GetOpenClipboardWindow(); + if (!hwnd) { + MOZ_CLIPBOARD_LOG( + "IDataObject::%s | Clipboard already opened by unknown process", + aMethodName.get()); + return; + } + DWORD procId; + DWORD threadId = ::GetWindowThreadProcessId(hwnd, &procId); + NS_ENSURE_TRUE_VOID(threadId); + nsAutoString procName; + NS_ENSURE_SUCCESS_VOID( + mozilla::widget::WinUtils::GetProcessImageName(procId, procName)); + MOZ_CLIPBOARD_LOG( + "IDataObject::%s | Clipboard already opened by HWND: %p | " + "Process ID: %lu | Thread ID: %lu | App name: %s", + aMethodName.get(), hwnd, procId, threadId, + NS_ConvertUTF16toUTF8(procName).get()); +} + // See // . static void LogOleGetClipboardResult(const HRESULT aHres) { @@ -400,6 +429,7 @@ nsAutoCString hresString; OleGetClipboardResultToString(aHres, hresString); MOZ_CLIPBOARD_LOG("OleGetClipboard result: %s", hresString.get()); + MaybeLogClipboardCurrentOwner(aHres, "OleGetClipboard"); } } @@ -438,6 +468,7 @@ nsAutoCString hresString; OleSetClipboardResultToString(aHres, hresString); MOZ_CLIPBOARD_LOG("OleSetClipboard result: %s", hresString.get()); + MaybeLogClipboardCurrentOwner(aHres, "OleSetClipboard"); } } @@ -459,7 +490,9 @@ break; } - std::this_thread::sleep_for(std::chrono::milliseconds(kDelayInMs)); + // TODO: This was formerly std::sleep_for, which wasn't actually sleeping + // in tests (bug 1927664). + ::SleepEx(kDelayInMs, TRUE); } return hres; @@ -603,12 +636,13 @@ // See methods listed at // . static void LogIDataObjectMethodResult(const HRESULT aHres, - const nsCString& aMethodName) { + mozilla::StaticString aMethodName) { if (MOZ_CLIPBOARD_LOG_ENABLED()) { nsAutoCString hresString; IDataObjectMethodResultToString(aHres, hresString); MOZ_CLIPBOARD_LOG("IDataObject::%s result : %s", aMethodName.get(), hresString.get()); + MaybeLogClipboardCurrentOwner(aHres, aMethodName); } } @@ -623,8 +657,7 @@ LPSTGMEDIUM pSTM) { return RepeatedlyTry( [&aDataObject, &pFE, &pSTM]() { return aDataObject.GetData(pFE, pSTM); }, - std::bind(LogIDataObjectMethodResult, std::placeholders::_1, - "GetData"_ns)); + [](HRESULT hres) { LogIDataObjectMethodResult(hres, "GetData"); }); } //------------------------------------------------------------------------- @@ -638,7 +671,7 @@ // memory HRESULT hres = S_FALSE; hres = aDataObject->QueryGetData(pFE); - LogIDataObjectMethodResult(hres, "QueryGetData"_ns); + LogIDataObjectMethodResult(hres, "QueryGetData"); if (S_OK == hres) { hres = RepeatedlyTryGetData(*aDataObject, pFE, pSTM); }