Version in base suite: 102.15.0esr-1~deb11u1 Version in overlay suite: 115.4.0esr-1~deb11u1 Base version: firefox-esr_115.4.0esr-1~deb11u1 Target version: firefox-esr_115.6.0esr-1~deb11u1 Base file: /srv/ftp-master.debian.org/ftp/pool/main/f/firefox-esr/firefox-esr_115.4.0esr-1~deb11u1.dsc Target file: /srv/ftp-master.debian.org/policy/pool/main/f/firefox-esr/firefox-esr_115.6.0esr-1~deb11u1.dsc /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.ca.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.dcissallowed.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.dcissblocked.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.dcisscopy.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.intermediate.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.intermediate2.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.intermediate3.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.intermediate4.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.intermediate5.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.intermediate6.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.ncca.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.server1.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.server10.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.server11.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.server12.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.server13.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.server14.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.server15.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.server16.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.server17.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.server2.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.server3.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.server4.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.server5.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.server6.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.server7.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.server8.cert |binary /srv/release.debian.org/tmp/xSHY2Qb5WK/firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/NameConstraints.server9.cert |binary firefox-esr-115.6.0esr/CLOBBER | 2 firefox-esr-115.6.0esr/Cargo.lock | 16 firefox-esr-115.6.0esr/accessible/atk/AccessibleWrap.cpp | 2 firefox-esr-115.6.0esr/accessible/base/AccGroupInfo.cpp | 32 firefox-esr-115.6.0esr/accessible/base/AccGroupInfo.h | 4 firefox-esr-115.6.0esr/accessible/base/CacheConstants.h | 4 firefox-esr-115.6.0esr/accessible/base/CachedTableAccessible.cpp | 25 firefox-esr-115.6.0esr/accessible/base/HTMLMarkupMap.h | 7 firefox-esr-115.6.0esr/accessible/base/nsAccUtils.cpp | 7 firefox-esr-115.6.0esr/accessible/generic/DocAccessible.cpp | 2 firefox-esr-115.6.0esr/accessible/generic/LocalAccessible.cpp | 4 firefox-esr-115.6.0esr/accessible/html/HTMLImageMapAccessible.cpp | 24 firefox-esr-115.6.0esr/accessible/ipc/DocAccessibleChildBase.cpp | 102 firefox-esr-115.6.0esr/accessible/ipc/DocAccessibleChildBase.h | 10 firefox-esr-115.6.0esr/accessible/ipc/DocAccessibleParent.cpp | 211 firefox-esr-115.6.0esr/accessible/ipc/DocAccessibleParent.h | 14 firefox-esr-115.6.0esr/accessible/ipc/RemoteAccessibleBase.h | 4 firefox-esr-115.6.0esr/accessible/ipc/other/PDocAccessible.ipdl | 14 firefox-esr-115.6.0esr/accessible/ipc/other/RemoteAccessible.h | 4 firefox-esr-115.6.0esr/accessible/ipc/win/PDocAccessible.ipdl | 14 firefox-esr-115.6.0esr/accessible/ipc/win/RemoteAccessible.h | 4 firefox-esr-115.6.0esr/accessible/tests/browser/e10s/browser.ini | 1 firefox-esr-115.6.0esr/accessible/tests/browser/e10s/browser_caching_large_update.js | 66 firefox-esr-115.6.0esr/accessible/tests/browser/e10s/browser_caching_relations.js | 2 firefox-esr-115.6.0esr/accessible/tests/browser/e10s/browser_caching_table.js | 26 firefox-esr-115.6.0esr/accessible/windows/msaa/MsaaAccessible.cpp | 6 firefox-esr-115.6.0esr/browser/actors/PromptParent.sys.mjs | 4 firefox-esr-115.6.0esr/browser/base/content/browser.js | 25 firefox-esr-115.6.0esr/browser/components/enterprisepolicies/Policies.sys.mjs | 9 firefox-esr-115.6.0esr/browser/components/enterprisepolicies/schemas/policies-schema.json | 4 firefox-esr-115.6.0esr/browser/components/extensions/parent/ext-browser.js | 5 firefox-esr-115.6.0esr/browser/components/extensions/test/browser/browser_ext_windows_update.js | 28 firefox-esr-115.6.0esr/browser/components/preferences/dialogs/browserLanguages.xhtml | 9 firefox-esr-115.6.0esr/browser/components/preferences/dialogs/languages.xhtml | 9 firefox-esr-115.6.0esr/browser/components/search/SearchSERPTelemetry.sys.mjs | 5 firefox-esr-115.6.0esr/browser/components/search/extensions/daum-kr/manifest.json | 6 firefox-esr-115.6.0esr/browser/components/search/extensions/salidzinilv/manifest.json | 6 firefox-esr-115.6.0esr/browser/components/search/extensions/yahoo-jp-auctions/manifest.json | 6 firefox-esr-115.6.0esr/browser/components/search/metrics.yaml | 17 firefox-esr-115.6.0esr/browser/components/search/schema/search-telemetry-schema.json | 88 firefox-esr-115.6.0esr/browser/components/search/schema/search-telemetry-ui-schema.json | 4 firefox-esr-115.6.0esr/browser/components/search/test/browser/browser_search_telemetry_engagement_content.js | 48 firefox-esr-115.6.0esr/browser/components/search/test/unit/test_search_telemetry_config_validation.js | 10 firefox-esr-115.6.0esr/browser/config/version.txt | 2 firefox-esr-115.6.0esr/browser/config/version_display.txt | 2 firefox-esr-115.6.0esr/browser/locales/en-US/browser/policies/policies-descriptions.ftl | 2 firefox-esr-115.6.0esr/browser/themes/shared/preferences/preferences.css | 13 firefox-esr-115.6.0esr/build/pgo/server-locations.txt | 4 firefox-esr-115.6.0esr/caps/OriginAttributes.cpp | 27 firefox-esr-115.6.0esr/config/milestone.txt | 2 firefox-esr-115.6.0esr/debian/changelog | 31 firefox-esr-115.6.0esr/debian/patches/debian-hacks/Allow-to-build-oxilangtag-ffi-with-rustc-1.65.patch | 34 firefox-esr-115.6.0esr/debian/patches/debian-hacks/Relax-minimum-supporter-rust-version-to-1.63.patch | 2 firefox-esr-115.6.0esr/debian/patches/debian-hacks/Set-DPI-to-system-settings.patch | 4 firefox-esr-115.6.0esr/debian/patches/series | 1 firefox-esr-115.6.0esr/dom/base/Document.cpp | 2 firefox-esr-115.6.0esr/dom/base/GlobalTeardownObserver.cpp | 73 firefox-esr-115.6.0esr/dom/base/GlobalTeardownObserver.h | 87 firefox-esr-115.6.0esr/dom/base/InProcessBrowserChildMessageManager.cpp | 2 firefox-esr-115.6.0esr/dom/base/VisualViewport.cpp | 12 firefox-esr-115.6.0esr/dom/base/moz.build | 2 firefox-esr-115.6.0esr/dom/base/nsContentUtils.h | 16 firefox-esr-115.6.0esr/dom/base/nsGlobalWindowInner.cpp | 58 firefox-esr-115.6.0esr/dom/base/nsGlobalWindowInner.h | 4 firefox-esr-115.6.0esr/dom/base/nsGlobalWindowOuter.cpp | 20 firefox-esr-115.6.0esr/dom/base/nsGlobalWindowOuter.h | 4 firefox-esr-115.6.0esr/dom/base/nsIGlobalObject.cpp | 43 firefox-esr-115.6.0esr/dom/base/nsIGlobalObject.h | 25 firefox-esr-115.6.0esr/dom/canvas/OffscreenCanvas.cpp | 2 firefox-esr-115.6.0esr/dom/canvas/WebGLContext.cpp | 12 firefox-esr-115.6.0esr/dom/canvas/WebGLTextureUpload.cpp | 1 firefox-esr-115.6.0esr/dom/canvas/test/webgl-conf/generated-mochitest.ini | 1 firefox-esr-115.6.0esr/dom/canvas/test/webgl-conf/mochitest-errata.ini | 1 firefox-esr-115.6.0esr/dom/events/DOMEventTargetHelper.cpp | 99 firefox-esr-115.6.0esr/dom/events/DOMEventTargetHelper.h | 44 firefox-esr-115.6.0esr/dom/fetch/FetchDriver.cpp | 26 firefox-esr-115.6.0esr/dom/fetch/FetchDriver.h | 3 firefox-esr-115.6.0esr/dom/file/uri/BlobURLProtocolHandler.cpp | 2 firefox-esr-115.6.0esr/dom/fs/api/FileSystemWritableFileStream.cpp | 369 firefox-esr-115.6.0esr/dom/fs/api/FileSystemWritableFileStream.h | 33 firefox-esr-115.6.0esr/dom/fs/child/FileSystemRequestHandler.cpp | 99 firefox-esr-115.6.0esr/dom/fs/test/crashtests/1841702.html | 16 firefox-esr-115.6.0esr/dom/fs/test/crashtests/crashtests.list | 1 firefox-esr-115.6.0esr/dom/html/HTMLFormElement.cpp | 47 firefox-esr-115.6.0esr/dom/html/HTMLFormElement.h | 11 firefox-esr-115.6.0esr/dom/html/HTMLInputElement.cpp | 72 firefox-esr-115.6.0esr/dom/html/HTMLInputElement.h | 8 firefox-esr-115.6.0esr/dom/html/nsGenericHTMLElement.cpp | 2 firefox-esr-115.6.0esr/dom/html/nsGenericHTMLElement.h | 3 firefox-esr-115.6.0esr/dom/indexedDB/ActorsParent.cpp | 3 firefox-esr-115.6.0esr/dom/indexedDB/IDBRequest.cpp | 2 firefox-esr-115.6.0esr/dom/ipc/BrowserChild.cpp | 2 firefox-esr-115.6.0esr/dom/ipc/ContentParent.cpp | 6 firefox-esr-115.6.0esr/dom/ipc/WindowGlobalParent.cpp | 6 firefox-esr-115.6.0esr/dom/media/DOMMediaStream.cpp | 2 firefox-esr-115.6.0esr/dom/media/gtest/TestCDMStorage.cpp | 33 firefox-esr-115.6.0esr/dom/media/gtest/TestGMPCrossOrigin.cpp | 3 firefox-esr-115.6.0esr/dom/media/imagecapture/ImageCapture.cpp | 4 firefox-esr-115.6.0esr/dom/media/ipc/PRDD.ipdl | 3 firefox-esr-115.6.0esr/dom/media/ipc/RDDParent.cpp | 6 firefox-esr-115.6.0esr/dom/media/ipc/RDDParent.h | 3 firefox-esr-115.6.0esr/dom/media/ipc/RDDProcessManager.cpp | 14 firefox-esr-115.6.0esr/dom/media/ipc/RDDProcessManager.h | 5 firefox-esr-115.6.0esr/dom/media/ipc/RemoteDecoderManagerParent.cpp | 11 firefox-esr-115.6.0esr/dom/media/ipc/RemoteDecoderManagerParent.h | 10 firefox-esr-115.6.0esr/dom/media/ipc/RemoteVideoDecoder.cpp | 2 firefox-esr-115.6.0esr/dom/media/mediasource/MediaSource.cpp | 2 firefox-esr-115.6.0esr/dom/media/mediasource/MediaSourceDemuxer.cpp | 21 firefox-esr-115.6.0esr/dom/media/mediasource/MediaSourceDemuxer.h | 21 firefox-esr-115.6.0esr/dom/media/webaudio/AudioContext.cpp | 6 firefox-esr-115.6.0esr/dom/media/webspeech/recognition/SpeechRecognitionAlternative.cpp | 2 firefox-esr-115.6.0esr/dom/media/webspeech/recognition/SpeechRecognitionResult.cpp | 2 firefox-esr-115.6.0esr/dom/media/webspeech/recognition/SpeechRecognitionResultList.cpp | 2 firefox-esr-115.6.0esr/dom/media/webvtt/TextTrackCue.cpp | 3 firefox-esr-115.6.0esr/dom/messagechannel/MessagePort.cpp | 8 firefox-esr-115.6.0esr/dom/performance/PerformanceMainThread.cpp | 2 firefox-esr-115.6.0esr/dom/quota/EncryptingOutputStream.h | 3 firefox-esr-115.6.0esr/dom/quota/EncryptingOutputStream_impl.h | 27 firefox-esr-115.6.0esr/dom/serviceworkers/ServiceWorker.cpp | 2 firefox-esr-115.6.0esr/dom/serviceworkers/ServiceWorkerRegistration.cpp | 2 firefox-esr-115.6.0esr/dom/streams/ReadableByteStreamController.cpp | 154 firefox-esr-115.6.0esr/dom/streams/ReadableByteStreamController.h | 138 firefox-esr-115.6.0esr/dom/streams/UnderlyingSourceCallbackHelpers.cpp | 43 firefox-esr-115.6.0esr/dom/streams/UnderlyingSourceCallbackHelpers.h | 30 firefox-esr-115.6.0esr/dom/vr/VRDisplay.cpp | 2 firefox-esr-115.6.0esr/dom/vr/XRSession.cpp | 6 firefox-esr-115.6.0esr/dom/webidl/Window.webidl | 8 firefox-esr-115.6.0esr/dom/websocket/WebSocket.cpp | 5 firefox-esr-115.6.0esr/dom/workers/ScriptLoader.cpp | 21 firefox-esr-115.6.0esr/dom/workers/WorkerPrivate.cpp | 2 firefox-esr-115.6.0esr/dom/workers/WorkerScope.cpp | 17 firefox-esr-115.6.0esr/dom/workers/loader/CacheLoadHandler.cpp | 7 firefox-esr-115.6.0esr/dom/workers/loader/CacheLoadHandler.h | 6 firefox-esr-115.6.0esr/dom/workers/loader/WorkerLoadContext.cpp | 7 firefox-esr-115.6.0esr/dom/workers/loader/WorkerLoadContext.h | 8 firefox-esr-115.6.0esr/dom/workers/loader/WorkerModuleLoader.cpp | 22 firefox-esr-115.6.0esr/dom/workers/sharedworkers/SharedWorkerService.cpp | 7 firefox-esr-115.6.0esr/dom/xhr/XMLHttpRequestWorker.cpp | 92 firefox-esr-115.6.0esr/dom/xhr/XMLHttpRequestWorker.h | 5 firefox-esr-115.6.0esr/editor/libeditor/HTMLEditor.cpp | 18 firefox-esr-115.6.0esr/editor/libeditor/HTMLEditor.h | 1 firefox-esr-115.6.0esr/editor/libeditor/HTMLStyleEditor.cpp | 44 firefox-esr-115.6.0esr/editor/libeditor/tests/mochitest.ini | 3 firefox-esr-115.6.0esr/editor/libeditor/tests/test_cmd_fontFace_with_empty_string.html | 30 firefox-esr-115.6.0esr/editor/spellchecker/tests/mochitest.ini | 1 firefox-esr-115.6.0esr/editor/spellchecker/tests/test_bug1837268.html | 79 firefox-esr-115.6.0esr/gfx/config/gfxVars.h | 3 firefox-esr-115.6.0esr/gfx/gl/GLContextProviderEGL.cpp | 22 firefox-esr-115.6.0esr/gfx/gl/GLLibraryEGL.cpp | 55 firefox-esr-115.6.0esr/gfx/ipc/GPUParent.cpp | 23 firefox-esr-115.6.0esr/gfx/ipc/GPUParent.h | 11 firefox-esr-115.6.0esr/gfx/ipc/GPUProcessManager.cpp | 34 firefox-esr-115.6.0esr/gfx/ipc/GPUProcessManager.h | 10 firefox-esr-115.6.0esr/gfx/ipc/PGPU.ipdl | 9 firefox-esr-115.6.0esr/gfx/layers/NativeLayerCA.mm | 1 firefox-esr-115.6.0esr/gfx/layers/apz/src/AsyncPanZoomController.cpp | 52 firefox-esr-115.6.0esr/gfx/layers/apz/src/AsyncPanZoomController.h | 1 firefox-esr-115.6.0esr/gfx/layers/client/TextureClient.cpp | 9 firefox-esr-115.6.0esr/gfx/layers/client/TextureClient.h | 4 firefox-esr-115.6.0esr/gfx/layers/composite/GPUVideoTextureHost.cpp | 15 firefox-esr-115.6.0esr/gfx/layers/composite/GPUVideoTextureHost.h | 9 firefox-esr-115.6.0esr/gfx/layers/composite/TextureHost.cpp | 25 firefox-esr-115.6.0esr/gfx/layers/composite/TextureHost.h | 7 firefox-esr-115.6.0esr/gfx/layers/ipc/CompositorBridgeChild.cpp | 3 firefox-esr-115.6.0esr/gfx/layers/ipc/CompositorBridgeChild.h | 3 firefox-esr-115.6.0esr/gfx/layers/ipc/CompositorBridgeParent.cpp | 37 firefox-esr-115.6.0esr/gfx/layers/ipc/CompositorBridgeParent.h | 3 firefox-esr-115.6.0esr/gfx/layers/ipc/CompositorManagerParent.cpp | 15 firefox-esr-115.6.0esr/gfx/layers/ipc/CompositorManagerParent.h | 9 firefox-esr-115.6.0esr/gfx/layers/ipc/ContentCompositorBridgeParent.cpp | 7 firefox-esr-115.6.0esr/gfx/layers/ipc/ISurfaceAllocator.h | 3 firefox-esr-115.6.0esr/gfx/layers/ipc/ImageBridgeChild.cpp | 3 firefox-esr-115.6.0esr/gfx/layers/ipc/ImageBridgeChild.h | 3 firefox-esr-115.6.0esr/gfx/layers/ipc/ImageBridgeParent.cpp | 18 firefox-esr-115.6.0esr/gfx/layers/ipc/ImageBridgeParent.h | 10 firefox-esr-115.6.0esr/gfx/layers/ipc/PVideoBridge.ipdl | 7 firefox-esr-115.6.0esr/gfx/layers/ipc/TextureForwarder.h | 4 firefox-esr-115.6.0esr/gfx/layers/ipc/VideoBridgeChild.cpp | 14 firefox-esr-115.6.0esr/gfx/layers/ipc/VideoBridgeChild.h | 4 firefox-esr-115.6.0esr/gfx/layers/ipc/VideoBridgeParent.cpp | 20 firefox-esr-115.6.0esr/gfx/layers/ipc/VideoBridgeParent.h | 4 firefox-esr-115.6.0esr/gfx/layers/wr/WebRenderBridgeParent.cpp | 5 firefox-esr-115.6.0esr/gfx/layers/wr/WebRenderBridgeParent.h | 1 firefox-esr-115.6.0esr/gfx/layers/wr/WebRenderLayerManager.cpp | 5 firefox-esr-115.6.0esr/gfx/thebes/SharedFontList-impl.h | 4 firefox-esr-115.6.0esr/gfx/thebes/SharedFontList.cpp | 43 firefox-esr-115.6.0esr/gfx/thebes/gfxDWriteFontList.cpp | 17 firefox-esr-115.6.0esr/gfx/thebes/gfxFont.cpp | 2 firefox-esr-115.6.0esr/gfx/thebes/gfxPlatform.cpp | 2 firefox-esr-115.6.0esr/gfx/thebes/gfxPlatformGtk.cpp | 5 firefox-esr-115.6.0esr/gfx/thebes/gfxTextRun.cpp | 10 firefox-esr-115.6.0esr/gfx/vr/ipc/VRManagerParent.cpp | 16 firefox-esr-115.6.0esr/gfx/vr/ipc/VRManagerParent.h | 8 firefox-esr-115.6.0esr/intl/locale/moz.build | 4 firefox-esr-115.6.0esr/intl/locale/rust/oxilangtag-ffi/Cargo.toml | 10 firefox-esr-115.6.0esr/intl/locale/rust/oxilangtag-ffi/cbindgen.toml | 15 firefox-esr-115.6.0esr/intl/locale/rust/oxilangtag-ffi/src/lib.rs | 126 firefox-esr-115.6.0esr/ipc/glue/BackgroundParentImpl.cpp | 48 firefox-esr-115.6.0esr/ipc/glue/PUtilityAudioDecoder.ipdl | 3 firefox-esr-115.6.0esr/ipc/glue/UtilityAudioDecoderParent.cpp | 6 firefox-esr-115.6.0esr/ipc/glue/UtilityAudioDecoderParent.h | 3 firefox-esr-115.6.0esr/ipc/glue/UtilityProcessManager.cpp | 10 firefox-esr-115.6.0esr/ipc/glue/UtilityProcessManager.h | 4 firefox-esr-115.6.0esr/js/src/vm/JSContext.cpp | 2 firefox-esr-115.6.0esr/js/src/wasm/WasmInstance.cpp | 36 firefox-esr-115.6.0esr/js/src/wasm/WasmValue.cpp | 14 firefox-esr-115.6.0esr/js/src/wasm/WasmValue.h | 5 firefox-esr-115.6.0esr/layout/base/crashtests/1442018-1.html | 45 firefox-esr-115.6.0esr/layout/base/crashtests/crashtests.list | 1 firefox-esr-115.6.0esr/layout/base/nsRefreshDriver.cpp | 295 firefox-esr-115.6.0esr/layout/base/nsRefreshDriver.h | 10 firefox-esr-115.6.0esr/layout/generic/nsFrameSelection.cpp | 7 firefox-esr-115.6.0esr/layout/generic/nsTextFrame.cpp | 18 firefox-esr-115.6.0esr/layout/reftests/bugs/reftest.list | 4 firefox-esr-115.6.0esr/layout/style/nsStyleUtil.cpp | 71 firefox-esr-115.6.0esr/layout/tables/nsCellMap.cpp | 11 firefox-esr-115.6.0esr/layout/tables/nsTableFrame.cpp | 7 firefox-esr-115.6.0esr/modules/libpref/init/StaticPrefList.yaml | 21 firefox-esr-115.6.0esr/netwerk/base/nsIOService.cpp | 7 firefox-esr-115.6.0esr/netwerk/base/nsSocketTransportService2.cpp | 8 firefox-esr-115.6.0esr/netwerk/base/nsStandardURL.cpp | 10 firefox-esr-115.6.0esr/netwerk/cache2/CacheIOThread.cpp | 2 firefox-esr-115.6.0esr/netwerk/dns/effective_tld_names.dat | 575 firefox-esr-115.6.0esr/netwerk/dns/nsDNSService2.cpp | 3 firefox-esr-115.6.0esr/netwerk/test/unit/test_dooh.js | 4 firefox-esr-115.6.0esr/netwerk/test/unit/test_race_cache_with_network.js | 2 firefox-esr-115.6.0esr/netwerk/test/unit/xpcshell.ini | 2 firefox-esr-115.6.0esr/remote/shared/RecommendedPreferences.sys.mjs | 4 firefox-esr-115.6.0esr/security/certverifier/CertVerifier.cpp | 9 firefox-esr-115.6.0esr/security/manager/pki/resources/content/certManager.css | 5 firefox-esr-115.6.0esr/security/manager/pki/resources/content/certManager.xhtml | 21 firefox-esr-115.6.0esr/security/manager/ssl/NSSSocketControl.cpp | 13 firefox-esr-115.6.0esr/security/manager/ssl/NSSSocketControl.h | 2 firefox-esr-115.6.0esr/security/manager/ssl/StaticHPKPins.h | 17 firefox-esr-115.6.0esr/security/manager/ssl/nsNSSIOLayer.cpp | 195 firefox-esr-115.6.0esr/security/manager/ssl/nsSTSPreloadList.inc | 6146 ++++------ firefox-esr-115.6.0esr/security/manager/ssl/tests/unit/test_self_signed_certs.js | 42 firefox-esr-115.6.0esr/security/manager/ssl/tests/unit/test_self_signed_certs/ca1.pem | 18 firefox-esr-115.6.0esr/security/manager/ssl/tests/unit/test_self_signed_certs/ca1.pem.certspec | 5 firefox-esr-115.6.0esr/security/manager/ssl/tests/unit/test_self_signed_certs/ca2.pem | 18 firefox-esr-115.6.0esr/security/manager/ssl/tests/unit/test_self_signed_certs/ca2.pem.certspec | 7 firefox-esr-115.6.0esr/security/manager/ssl/tests/unit/test_self_signed_certs/ee1.pem | 17 firefox-esr-115.6.0esr/security/manager/ssl/tests/unit/test_self_signed_certs/ee1.pem.certspec | 3 firefox-esr-115.6.0esr/security/manager/ssl/tests/unit/test_self_signed_certs/ee2.pem | 17 firefox-esr-115.6.0esr/security/manager/ssl/tests/unit/test_self_signed_certs/ee2.pem.certspec | 5 firefox-esr-115.6.0esr/security/nss/TAG-INFO | 2 firefox-esr-115.6.0esr/security/nss/coreconf/coreconf.dep | 1 firefox-esr-115.6.0esr/security/nss/doc/rst/releases/index.rst | 40 firefox-esr-115.6.0esr/security/nss/doc/rst/releases/nss_3_90_1.rst | 59 firefox-esr-115.6.0esr/security/nss/lib/freebl/blinit.c | 18 firefox-esr-115.6.0esr/security/nss/lib/nss/nss.h | 4 firefox-esr-115.6.0esr/security/nss/lib/softoken/softkver.h | 4 firefox-esr-115.6.0esr/security/nss/lib/util/nssutil.h | 4 firefox-esr-115.6.0esr/security/nss/tests/libpkix/certs/make-nc | 56 firefox-esr-115.6.0esr/services/settings/dumps/blocklists/addons-bloomfilters.json | 370 firefox-esr-115.6.0esr/services/settings/dumps/main/cookie-banner-rules-list.json | 2940 ++-- firefox-esr-115.6.0esr/services/settings/dumps/main/devtools-compatibility-browsers.json | 424 firefox-esr-115.6.0esr/services/settings/dumps/main/search-config.json | 382 firefox-esr-115.6.0esr/services/settings/dumps/main/search-telemetry-v2.json | 499 firefox-esr-115.6.0esr/services/settings/dumps/main/url-classifier-skip-urls.json | 20 firefox-esr-115.6.0esr/services/settings/dumps/security-state/intermediates.json | 1334 +- firefox-esr-115.6.0esr/services/settings/dumps/security-state/onecrl.json | 347 firefox-esr-115.6.0esr/sourcestamp.txt | 4 firefox-esr-115.6.0esr/supply-chain/audits.toml | 9 firefox-esr-115.6.0esr/taskcluster/ci/fetch/toolchains.yml | 3 firefox-esr-115.6.0esr/taskcluster/scripts/misc/repack_rust.py | 2 firefox-esr-115.6.0esr/testing/geckodriver/src/prefs.rs | 4 firefox-esr-115.6.0esr/testing/web-platform/tests/FileAPI/blob/Blob-stream.any.js | 13 firefox-esr-115.6.0esr/testing/web-platform/tests/css/selectors/selectors-4/lang-020.html | 14 firefox-esr-115.6.0esr/testing/web-platform/tests/css/selectors/selectors-4/lang-021.html | 15 firefox-esr-115.6.0esr/testing/web-platform/tests/css/selectors/selectors-4/lang-022.html | 14 firefox-esr-115.6.0esr/testing/web-platform/tests/css/selectors/selectors-4/lang-023.html | 15 firefox-esr-115.6.0esr/testing/web-platform/tests/css/selectors/selectors-4/lang-024.html | 14 firefox-esr-115.6.0esr/testing/web-platform/tests/css/selectors/selectors-4/lang-025.html | 16 firefox-esr-115.6.0esr/testing/web-platform/tests/editing/other/inserttext-after-bold-in-font-face-monospace.html | 32 firefox-esr-115.6.0esr/testing/web-platform/tests/tools/wptrunner/wptrunner/browsers/firefox.py | 11 firefox-esr-115.6.0esr/third_party/rust/oxilangtag/.cargo-checksum.json | 1 firefox-esr-115.6.0esr/third_party/rust/oxilangtag/CHANGELOG.md | 16 firefox-esr-115.6.0esr/third_party/rust/oxilangtag/Cargo.toml | 39 firefox-esr-115.6.0esr/third_party/rust/oxilangtag/LICENSE | 19 firefox-esr-115.6.0esr/third_party/rust/oxilangtag/README.md | 46 firefox-esr-115.6.0esr/third_party/rust/oxilangtag/benches/lib.rs | 77 firefox-esr-115.6.0esr/third_party/rust/oxilangtag/deny.toml | 11 firefox-esr-115.6.0esr/third_party/rust/oxilangtag/src/lib.rs | 923 + firefox-esr-115.6.0esr/third_party/rust/oxilangtag/tests/lib.rs | 722 + firefox-esr-115.6.0esr/toolkit/components/extensions/webrequest/ChannelWrapper.cpp | 5 firefox-esr-115.6.0esr/toolkit/components/httpsonlyerror/tests/browser/browser.ini | 1 firefox-esr-115.6.0esr/toolkit/components/httpsonlyerror/tests/browser/browser_fpi_nested_uri.js | 51 firefox-esr-115.6.0esr/toolkit/components/passwordmgr/LoginManagerChild.sys.mjs | 7 firefox-esr-115.6.0esr/toolkit/components/passwordmgr/test/browser/browser_DOMFormHasPassword.js | 73 firefox-esr-115.6.0esr/toolkit/components/passwordmgr/test/browser/browser_DOMFormHasPossibleUsername.js | 126 firefox-esr-115.6.0esr/toolkit/components/passwordmgr/test/browser/browser_DOMInputPasswordAdded.js | 38 firefox-esr-115.6.0esr/toolkit/components/passwordmgr/test/mochitest/test_formless_autofill.html | 3 firefox-esr-115.6.0esr/toolkit/components/pdfjs/content/build/pdf.js | 4 firefox-esr-115.6.0esr/toolkit/components/places/Database.cpp | 35 firefox-esr-115.6.0esr/toolkit/components/places/tests/maintenance/head.js | 14 firefox-esr-115.6.0esr/toolkit/components/printing/tests/browser.ini | 1 firefox-esr-115.6.0esr/toolkit/components/printing/tests/browser_print_disabled.js | 43 firefox-esr-115.6.0esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_distributions.js | 92 firefox-esr-115.6.0esr/toolkit/components/telemetry/Histograms.json | 33 firefox-esr-115.6.0esr/toolkit/components/telemetry/histogram-allowlists.json | 2 firefox-esr-115.6.0esr/toolkit/content/gmp-sources/widevinecdm.json | 40 firefox-esr-115.6.0esr/toolkit/content/widgets/wizard.js | 4 firefox-esr-115.6.0esr/toolkit/library/rust/shared/Cargo.toml | 2 firefox-esr-115.6.0esr/toolkit/library/rust/shared/lib.rs | 2 firefox-esr-115.6.0esr/toolkit/modules/PopupNotifications.sys.mjs | 48 firefox-esr-115.6.0esr/toolkit/xre/dllservices/mozglue/WindowsDllBlocklistDefs.in | 4 firefox-esr-115.6.0esr/toolkit/xre/dllservices/mozglue/interceptor/PatcherDetour.h | 10 firefox-esr-115.6.0esr/widget/GfxDriverInfo.cpp | 8 firefox-esr-115.6.0esr/widget/GfxDriverInfo.h | 6 firefox-esr-115.6.0esr/widget/GfxInfoBase.cpp | 3 firefox-esr-115.6.0esr/widget/gtk/GfxInfo.cpp | 7 firefox-esr-115.6.0esr/widget/gtk/nsWindow.cpp | 8 firefox-esr-115.6.0esr/widget/nsIGfxInfo.idl | 4 firefox-esr-115.6.0esr/widget/windows/nsDragService.cpp | 15 firefox-esr-115.6.0esr/widget/windows/nsFilePicker.cpp | 10 firefox-esr-115.6.0esr/xpcom/base/CycleCollectedJSContext.h | 5 firefox-esr-115.6.0esr/xpcom/base/CycleCollectedJSRuntime.cpp | 83 firefox-esr-115.6.0esr/xpcom/base/CycleCollectedJSRuntime.h | 12 firefox-esr-115.6.0esr/xpcom/base/nsCycleCollector.cpp | 4 firefox-esr-115.6.0esr/xpcom/ds/nsObserverService.cpp | 10 firefox-esr-115.6.0esr/xpcom/io/nsLocalFileUnix.cpp | 68 firefox-esr-115.6.0esr/xpfe/appshell/AppWindow.cpp | 5 351 files changed, 12674 insertions(+), 8432 deletions(-) diff -Nru firefox-esr-115.4.0esr/CLOBBER firefox-esr-115.6.0esr/CLOBBER --- firefox-esr-115.4.0esr/CLOBBER 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/CLOBBER 2023-12-11 19:05:28.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 2023-09-25 \ No newline at end of file +Merge day clobber 2023-11-20 \ No newline at end of file diff -Nru firefox-esr-115.4.0esr/Cargo.lock firefox-esr-115.6.0esr/Cargo.lock --- firefox-esr-115.4.0esr/Cargo.lock 2023-10-17 02:48:50.000000000 +0000 +++ firefox-esr-115.6.0esr/Cargo.lock 2023-12-11 19:05:28.000000000 +0000 @@ -2141,6 +2141,8 @@ "nsstring", "oblivious_http", "origin-trials-ffi", + "oxilangtag", + "oxilangtag-ffi", "prefs_parser", "processtools", "profiler_helper", @@ -3890,6 +3892,20 @@ ] [[package]] +name = "oxilangtag" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d91edf4fbb970279443471345a4e8c491bf05bb283b3e6c88e4e606fd8c181b" + +[[package]] +name = "oxilangtag-ffi" +version = "0.1.0" +dependencies = [ + "nsstring", + "oxilangtag", +] + +[[package]] name = "packed_simd" version = "0.3.9" source = "git+https://github.com/hsivonen/packed_simd?rev=e588ceb568878e1a3156ea9ce551d5b63ef0cdc4#e588ceb568878e1a3156ea9ce551d5b63ef0cdc4" diff -Nru firefox-esr-115.4.0esr/accessible/atk/AccessibleWrap.cpp firefox-esr-115.6.0esr/accessible/atk/AccessibleWrap.cpp --- firefox-esr-115.4.0esr/accessible/atk/AccessibleWrap.cpp 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/atk/AccessibleWrap.cpp 2023-12-11 19:05:27.000000000 +0000 @@ -927,6 +927,8 @@ } void a11y::ProxyCreated(RemoteAccessible* aProxy) { + MOZ_ASSERT(aProxy->RemoteParent() || aProxy->IsDoc(), + "Need parent to check for HyperLink interface"); GType type = GetMaiAtkType(GetInterfacesForProxy(aProxy)); NS_ASSERTION(type, "why don't we have a type!"); diff -Nru firefox-esr-115.4.0esr/accessible/base/AccGroupInfo.cpp firefox-esr-115.6.0esr/accessible/base/AccGroupInfo.cpp --- firefox-esr-115.4.0esr/accessible/base/AccGroupInfo.cpp 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/base/AccGroupInfo.cpp 2023-12-11 19:05:28.000000000 +0000 @@ -47,13 +47,13 @@ }; AccGroupInfo::AccGroupInfo(const Accessible* aItem, role aRole) - : mPosInSet(0), mSetSize(0), mParent(nullptr), mItem(aItem), mRole(aRole) { + : mPosInSet(0), mSetSize(0), mParentId(0), mItem(aItem), mRole(aRole) { MOZ_COUNT_CTOR(AccGroupInfo); Update(); } void AccGroupInfo::Update() { - mParent = nullptr; + mParentId = 0; Accessible* parent = mItem->GetNonGenericParent(); if (!parent) { @@ -89,7 +89,7 @@ // (group will be continued). const int32_t siblingLevel = GetARIAOrDefaultLevel(candidateSibling); if (siblingLevel < level) { - mParent = candidateSibling; + mParentId = candidateSibling->ID(); break; } @@ -102,7 +102,7 @@ // build group information for this item based on found one. if (siblingGroupInfo) { mPosInSet += siblingGroupInfo->mPosInSet; - mParent = siblingGroupInfo->mParent; + mParentId = siblingGroupInfo->mParentId; mSetSize = siblingGroupInfo->mSetSize; return; } @@ -142,7 +142,7 @@ // If the next item in the group has calculated group information then // build group information for this item based on found one. if (siblingGroupInfo) { - mParent = siblingGroupInfo->mParent; + mParentId = siblingGroupInfo->mParentId; mSetSize = siblingGroupInfo->mSetSize; return; } @@ -150,13 +150,13 @@ mSetSize++; } - if (mParent) { + if (mParentId) { return; } roles::Role parentRole = parent->Role(); if (ShouldReportRelations(mRole, parentRole)) { - mParent = parent; + mParentId = parent->ID(); } // ARIA tree and list can be arranged by using ARIA groups to organize levels. @@ -177,7 +177,7 @@ CompoundWidgetSiblingRule parentSiblingRule{mRole}; Accessible* parentPrevSibling = pivot.Prev(parent, widgetSiblingRule); if (parentPrevSibling && parentPrevSibling->Role() == mRole) { - mParent = parentPrevSibling; + mParentId = parentPrevSibling->ID(); return; } } @@ -188,7 +188,7 @@ if (mRole == roles::LISTITEM || mRole == roles::OUTLINEITEM) { Accessible* grandParent = parent->GetNonGenericParent(); if (grandParent && grandParent->Role() == mRole) { - mParent = grandParent; + mParentId = grandParent->ID(); } } } @@ -347,7 +347,7 @@ } size_t AccGroupInfo::SizeOfIncludingThis(MallocSizeOf aMallocSizeOf) { - // We don't count mParent or mItem since they (should be) counted + // We don't count mParentId or mItem since they (should be) counted // as part of the document. return aMallocSizeOf(this); } @@ -371,6 +371,18 @@ return aAccessible->GetLevel(true); } +Accessible* AccGroupInfo::ConceptualParent() const { + if (!mParentId) { + // The conceptual parent can never be the document, so id 0 means none. + return nullptr; + } + if (Accessible* doc = + nsAccUtils::DocumentFor(const_cast(mItem))) { + return nsAccUtils::GetAccessibleByID(doc, mParentId); + } + return nullptr; +} + static role BaseRole(role aRole) { if (aRole == roles::CHECK_MENU_ITEM || aRole == roles::PARENT_MENUITEM || aRole == roles::RADIO_MENU_ITEM) { diff -Nru firefox-esr-115.4.0esr/accessible/base/AccGroupInfo.h firefox-esr-115.6.0esr/accessible/base/AccGroupInfo.h --- firefox-esr-115.4.0esr/accessible/base/AccGroupInfo.h 2023-10-17 02:48:50.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/base/AccGroupInfo.h 2023-12-11 19:05:28.000000000 +0000 @@ -39,7 +39,7 @@ * Return a direct or logical parent of the accessible that this group info is * created for. */ - Accessible* ConceptualParent() const { return mParent; } + Accessible* ConceptualParent() const; /** * Update group information. @@ -90,7 +90,7 @@ uint32_t mPosInSet; uint32_t mSetSize; - Accessible* mParent; + uint64_t mParentId; const Accessible* mItem; a11y::role mRole; }; diff -Nru firefox-esr-115.4.0esr/accessible/base/CacheConstants.h firefox-esr-115.6.0esr/accessible/base/CacheConstants.h --- firefox-esr-115.4.0esr/accessible/base/CacheConstants.h 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/base/CacheConstants.h 2023-12-11 19:05:27.000000000 +0000 @@ -82,6 +82,10 @@ RelationType::DESCRIPTION_FOR}, {nsGkAtoms::aria_flowto, nullptr, RelationType::FLOWS_TO, RelationType::FLOWS_FROM}, + {nsGkAtoms::aria_details, nullptr, RelationType::DETAILS, + RelationType::DETAILS_FOR}, + {nsGkAtoms::aria_errormessage, nullptr, RelationType::ERRORMSG, + RelationType::ERRORMSG_FOR}, }; // The count of numbers needed to serialize an nsRect. This is used when diff -Nru firefox-esr-115.4.0esr/accessible/base/CachedTableAccessible.cpp firefox-esr-115.6.0esr/accessible/base/CachedTableAccessible.cpp --- firefox-esr-115.4.0esr/accessible/base/CachedTableAccessible.cpp 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/base/CachedTableAccessible.cpp 2023-12-11 19:05:27.000000000 +0000 @@ -230,11 +230,30 @@ Accessible* aAcc) { MOZ_ASSERT(aAcc->IsTableCell()); for (Accessible* parent = aAcc; parent; parent = parent->Parent()) { - if (auto* table = static_cast(parent->AsTable())) { - if (auto cellIdx = table->mAccToCellIdx.Lookup(aAcc)) { - return &table->mCells[*cellIdx]; + if (parent->IsDoc()) { + break; // Never cross document boundaries. + } + TableAccessible* table = parent->AsTable(); + if (!table) { + continue; + } + if (LocalAccessible* local = parent->AsLocal()) { + nsIContent* content = local->GetContent(); + if (content && content->IsXULElement()) { + // XUL tables don't use CachedTableAccessible. + break; } } + // Non-XUL tables only use CachedTableAccessible. + auto* cachedTable = static_cast(table); + if (auto cellIdx = cachedTable->mAccToCellIdx.Lookup(aAcc)) { + return &cachedTable->mCells[*cellIdx]; + } + // We found a table, but it doesn't know about this cell. This can happen + // if a cell is outside of a row due to authoring error. We must not search + // ancestor tables, since this cell's data is not valid there and vice + // versa. + break; } return nullptr; } diff -Nru firefox-esr-115.4.0esr/accessible/base/HTMLMarkupMap.h firefox-esr-115.6.0esr/accessible/base/HTMLMarkupMap.h --- firefox-esr-115.4.0esr/accessible/base/HTMLMarkupMap.h 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/base/HTMLMarkupMap.h 2023-12-11 19:05:27.000000000 +0000 @@ -393,6 +393,13 @@ // A within a row isn't valid. return nullptr; } + const nsRoleMapEntry* roleMapEntry = aria::GetRoleMap(aElement); + if (roleMapEntry && roleMapEntry->role != roles::NOTHING && + roleMapEntry->role != roles::ROW) { + // There is a valid ARIA role which isn't "row". Don't treat this as an + // HTML table row. + return nullptr; + } // Check if this is within a table. We check the grandparent because // it might be inside a rowgroup. We don't specifically check for an HTML // table because there are cases where there is a inside a diff -Nru firefox-esr-115.4.0esr/accessible/base/nsAccUtils.cpp firefox-esr-115.6.0esr/accessible/base/nsAccUtils.cpp --- firefox-esr-115.4.0esr/accessible/base/nsAccUtils.cpp 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/base/nsAccUtils.cpp 2023-12-11 19:05:27.000000000 +0000 @@ -324,12 +324,17 @@ LayoutDeviceIntPoint nsAccUtils::GetScreenCoordsForWindow( Accessible* aAccessible) { + LayoutDeviceIntPoint coords(0, 0); a11y::LocalAccessible* localAcc = aAccessible->AsLocal(); if (!localAcc) { localAcc = aAccessible->AsRemote()->OuterDocOfRemoteBrowser(); + if (!localAcc) { + // This could be null if the tab is closing but the document is still + // being shut down. + return coords; + } } - LayoutDeviceIntPoint coords(0, 0); nsCOMPtr treeItem( nsCoreUtils::GetDocShellFor(localAcc->GetNode())); if (!treeItem) return coords; diff -Nru firefox-esr-115.4.0esr/accessible/generic/DocAccessible.cpp firefox-esr-115.6.0esr/accessible/generic/DocAccessible.cpp --- firefox-esr-115.4.0esr/accessible/generic/DocAccessible.cpp 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/generic/DocAccessible.cpp 2023-12-11 19:05:27.000000000 +0000 @@ -1673,7 +1673,7 @@ SendCache(CacheDomain::All, CacheUpdateType::Initial); for (auto idx = 0U; idx < mChildren.Length(); idx++) { - ipcDoc->InsertIntoIpcTree(this, mChildren.ElementAt(idx), idx, true); + ipcDoc->InsertIntoIpcTree(mChildren.ElementAt(idx), true); } } } diff -Nru firefox-esr-115.4.0esr/accessible/generic/LocalAccessible.cpp firefox-esr-115.6.0esr/accessible/generic/LocalAccessible.cpp --- firefox-esr-115.4.0esr/accessible/generic/LocalAccessible.cpp 2023-10-17 02:48:50.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/generic/LocalAccessible.cpp 2023-12-11 19:05:28.000000000 +0000 @@ -1415,7 +1415,9 @@ } if (aAttribute == nsGkAtoms::aria_controls || - aAttribute == nsGkAtoms::aria_flowto) { + aAttribute == nsGkAtoms::aria_flowto || + aAttribute == nsGkAtoms::aria_details || + aAttribute == nsGkAtoms::aria_errormessage) { mDoc->QueueCacheUpdate(this, CacheDomain::Relations); } diff -Nru firefox-esr-115.4.0esr/accessible/html/HTMLImageMapAccessible.cpp firefox-esr-115.6.0esr/accessible/html/HTMLImageMapAccessible.cpp --- firefox-esr-115.4.0esr/accessible/html/HTMLImageMapAccessible.cpp 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/html/HTMLImageMapAccessible.cpp 2023-12-11 19:05:28.000000000 +0000 @@ -174,21 +174,17 @@ nsRect HTMLAreaAccessible::ParentRelativeBounds() { nsIFrame* boundingFrame = nullptr; nsRect relativeBoundsRect = RelativeBounds(&boundingFrame); - - nsIFrame* parentBoundingFrame = nullptr; - if (mParent) { - parentBoundingFrame = mParent->GetFrame(); - } - - if (!parentBoundingFrame) { - // if we can't get the bounding frame, use the pres shell root for the - // bounding frame RelativeBounds returned - parentBoundingFrame = - nsLayoutUtils::GetContainingBlockForClientRect(boundingFrame); + if (MOZ_UNLIKELY(!boundingFrame)) { + // Area is not attached to an image map? + return nsRect(); } - nsLayoutUtils::TransformRect(boundingFrame, parentBoundingFrame, - relativeBoundsRect); - + // The relative bounds returned above are relative to this area's + // image map, which is technically already "parent relative". + // Because area elements are `display:none` to layout, they can't + // have transforms or other styling applied directly, and so we + // don't apply any additional transforms here. Any transform + // at the image map layer will be taken care of when computing bounds + // in the parent process. return relativeBoundsRect; } diff -Nru firefox-esr-115.4.0esr/accessible/ipc/DocAccessibleChildBase.cpp firefox-esr-115.6.0esr/accessible/ipc/DocAccessibleChildBase.cpp --- firefox-esr-115.4.0esr/accessible/ipc/DocAccessibleChildBase.cpp 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/ipc/DocAccessibleChildBase.cpp 2023-12-11 19:05:27.000000000 +0000 @@ -4,6 +4,7 @@ * 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/. */ +#include "chrome/common/ipc_channel.h" #include "mozilla/a11y/DocAccessibleChildBase.h" #include "mozilla/a11y/CacheConstants.h" #include "mozilla/a11y/RemoteAccessible.h" @@ -35,71 +36,76 @@ } /* static */ -void DocAccessibleChildBase::SerializeTree(nsTArray& aTree, - nsTArray& aData) { - for (LocalAccessible* acc : aTree) { - uint64_t id = reinterpret_cast(acc->UniqueID()); - a11y::role role = acc->Role(); - uint32_t childCount = acc->IsOuterDoc() ? 0 : acc->ChildCount(); - - uint32_t genericTypes = acc->mGenericTypes; - if (acc->ARIAHasNumericValue()) { - // XXX: We need to do this because this requires a state check. - genericTypes |= eNumericValue; - } - if (acc->IsTextLeaf() || acc->IsImage()) { - // Ideally, we'd set eActionable for any Accessible with an ancedstor - // action. However, that requires an ancestor walk which is too expensive - // here. eActionable is only used by ATK. For now, we only expose ancestor - // actions on text leaf and image Accessibles. This means that we don't - // support "click ancestor" for ATK. - if (acc->ActionCount()) { - genericTypes |= eActionable; - } - } else if (acc->HasPrimaryAction()) { +AccessibleData DocAccessibleChildBase::SerializeAcc(LocalAccessible* aAcc) { + uint32_t genericTypes = aAcc->mGenericTypes; + if (aAcc->ARIAHasNumericValue()) { + // XXX: We need to do this because this requires a state check. + genericTypes |= eNumericValue; + } + if (aAcc->IsTextLeaf() || aAcc->IsImage()) { + // Ideally, we'd set eActionable for any Accessible with an ancedstor + // action. However, that requires an ancestor walk which is too expensive + // here. eActionable is only used by ATK. For now, we only expose ancestor + // actions on text leaf and image Accessibles. This means that we don't + // support "click ancestor" for ATK. + if (aAcc->ActionCount()) { genericTypes |= eActionable; } + } else if (aAcc->HasPrimaryAction()) { + genericTypes |= eActionable; + } - RefPtr fields; - // Even though we send moves as a hide and a show, we don't want to - // push the cache again for moves. - if (!acc->Document()->IsAccessibleBeingMoved(acc)) { - fields = - acc->BundleFieldsForCache(CacheDomain::All, CacheUpdateType::Initial); - if (fields->Count() == 0) { - fields = nullptr; - } + RefPtr fields; + // Even though we send moves as a hide and a show, we don't want to + // push the cache again for moves. + if (!aAcc->Document()->IsAccessibleBeingMoved(aAcc)) { + fields = + aAcc->BundleFieldsForCache(CacheDomain::All, CacheUpdateType::Initial); + if (fields->Count() == 0) { + fields = nullptr; } - - aData.AppendElement( - AccessibleData(id, role, childCount, static_cast(acc->mType), - static_cast(genericTypes), - acc->mRoleMapEntryIndex, fields)); } + + return AccessibleData(aAcc->ID(), aAcc->Role(), aAcc->LocalParent()->ID(), + static_cast(aAcc->IndexInParent()), + static_cast(aAcc->mType), + static_cast(genericTypes), + aAcc->mRoleMapEntryIndex, fields); } -void DocAccessibleChildBase::InsertIntoIpcTree(LocalAccessible* aParent, - LocalAccessible* aChild, - uint32_t aIdxInParent, +void DocAccessibleChildBase::InsertIntoIpcTree(LocalAccessible* aChild, bool aSuppressShowEvent) { - uint64_t parentID = - aParent->IsDoc() ? 0 : reinterpret_cast(aParent->UniqueID()); nsTArray shownTree; FlattenTree(aChild, shownTree); - ShowEventData data(parentID, aIdxInParent, - nsTArray(shownTree.Length()), - aSuppressShowEvent); - SerializeTree(shownTree, data.NewTree()); + uint32_t totalAccs = shownTree.Length(); + // Exceeding the IPDL maximum message size will cause a crash. Try to avoid + // this by only including kMaxAccsPerMessage Accessibels in a single IPDL + // call. If there are Accessibles beyond this, they will be split across + // multiple calls. + constexpr uint32_t kMaxAccsPerMessage = + IPC::Channel::kMaximumMessageSize / (2 * 1024); + nsTArray data(std::min(kMaxAccsPerMessage, totalAccs)); + for (LocalAccessible* child : shownTree) { + if (data.Length() == kMaxAccsPerMessage) { + if (ipc::ProcessChild::ExpectingShutdown()) { + return; + } + SendShowEvent(data, aSuppressShowEvent, false, false); + data.ClearAndRetainStorage(); + } + data.AppendElement(SerializeAcc(child)); + } if (ipc::ProcessChild::ExpectingShutdown()) { return; } - MaybeSendShowEvent(data, false); + if (!data.IsEmpty()) { + SendShowEvent(data, aSuppressShowEvent, true, false); + } } void DocAccessibleChildBase::ShowEvent(AccShowEvent* aShowEvent) { LocalAccessible* child = aShowEvent->GetAccessible(); - InsertIntoIpcTree(aShowEvent->LocalParent(), child, child->IndexInParent(), - false); + InsertIntoIpcTree(child, false); } mozilla::ipc::IPCResult DocAccessibleChildBase::RecvTakeFocus( diff -Nru firefox-esr-115.4.0esr/accessible/ipc/DocAccessibleChildBase.h firefox-esr-115.6.0esr/accessible/ipc/DocAccessibleChildBase.h --- firefox-esr-115.4.0esr/accessible/ipc/DocAccessibleChildBase.h 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/ipc/DocAccessibleChildBase.h 2023-12-11 19:05:27.000000000 +0000 @@ -43,8 +43,7 @@ /** * Serializes a shown tree and sends it to the chrome process. */ - void InsertIntoIpcTree(LocalAccessible* aParent, LocalAccessible* aChild, - uint32_t aIdxInParent, bool aSuppressShowEvent); + void InsertIntoIpcTree(LocalAccessible* aChild, bool aSuppressShowEvent); void ShowEvent(AccShowEvent* aShowEvent); virtual void ActorDestroy(ActorDestroyReason) override { @@ -122,12 +121,7 @@ static void FlattenTree(LocalAccessible* aRoot, nsTArray& aTree); - static void SerializeTree(nsTArray& aTree, - nsTArray& aData); - - virtual void MaybeSendShowEvent(ShowEventData& aData, bool aFromUser) { - Unused << SendShowEvent(aData, aFromUser); - } + static AccessibleData SerializeAcc(LocalAccessible* aAcc); void DetachDocument() { if (mDoc) { diff -Nru firefox-esr-115.4.0esr/accessible/ipc/DocAccessibleParent.cpp firefox-esr-115.6.0esr/accessible/ipc/DocAccessibleParent.cpp --- firefox-esr-115.4.0esr/accessible/ipc/DocAccessibleParent.cpp 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/ipc/DocAccessibleParent.cpp 2023-12-11 19:05:27.000000000 +0000 @@ -83,64 +83,102 @@ } mozilla::ipc::IPCResult DocAccessibleParent::RecvShowEvent( - const ShowEventData& aData, const bool& aFromUser) { + nsTArray&& aNewTree, const bool& aEventSuppressed, + const bool& aComplete, const bool& aFromUser) { ACQUIRE_ANDROID_LOCK if (mShutdown) return IPC_OK(); MOZ_ASSERT(CheckDocTree()); - if (aData.NewTree().IsEmpty()) { + if (aNewTree.IsEmpty()) { return IPC_FAIL(this, "No children being added"); } - RemoteAccessible* parent = GetAccessible(aData.ID()); - - // XXX This should really never happen, but sometimes we fail to fire the - // required show events. - if (!parent) { - NS_ERROR("adding child to unknown accessible"); + RemoteAccessible* root = nullptr; + RemoteAccessible* rootParent = nullptr; + RemoteAccessible* lastParent = this; + uint64_t lastParentID = 0; + for (const auto& accData : aNewTree) { + RemoteAccessible* parent = accData.ParentID() == lastParentID + ? lastParent + : GetAccessible(accData.ParentID()); + // XXX This should really never happen, but sometimes we fail to fire the + // required show events. + if (!parent) { + NS_ERROR("adding child to unknown accessible"); #ifdef DEBUG - return IPC_FAIL(this, "unknown parent accessible"); + return IPC_FAIL(this, "unknown parent accessible"); #else - return IPC_OK(); + return IPC_OK(); #endif - } + } - uint32_t newChildIdx = aData.Idx(); - if (newChildIdx > parent->ChildCount()) { - NS_ERROR("invalid index to add child at"); + uint32_t childIdx = accData.IndexInParent(); + if (childIdx > parent->ChildCount()) { + NS_ERROR("invalid index to add child at"); #ifdef DEBUG - return IPC_FAIL(this, "invalid index"); + return IPC_FAIL(this, "invalid index"); #else - return IPC_OK(); + return IPC_OK(); #endif - } - - uint32_t consumed = AddSubtree(parent, aData.NewTree(), 0, newChildIdx); - MOZ_ASSERT(consumed == aData.NewTree().Length()); - - // XXX This shouldn't happen, but if we failed to add children then the below - // is pointless and can crash. - if (!consumed) { - return IPC_FAIL(this, "failed to add children"); - } + } -#ifdef DEBUG - for (uint32_t i = 0; i < consumed; i++) { - uint64_t id = aData.NewTree()[i].ID(); - MOZ_ASSERT(mAccessibles.GetEntry(id)); + RemoteAccessible* child = CreateAcc(accData); + if (!child) { + // This shouldn't happen. + return IPC_FAIL(this, "failed to add children"); + } + if (!root && !mPendingShowChild) { + // This is the first Accessible, which is the root of the shown subtree. + root = child; + rootParent = parent; + } + // If this show event has been split across multiple messages and this is + // not the last message, don't attach the shown root to the tree yet. + // Otherwise, clients might crawl the incomplete subtree and they won't get + // mutation events for the remaining pieces. + if (aComplete || root != child) { + AttachChild(parent, childIdx, child); + } } -#endif MOZ_ASSERT(CheckDocTree()); + if (!aComplete && !mPendingShowChild) { + // This is the first message for a show event split across multiple + // messages. Save the show target for subsequent messages and return. + const auto& accData = aNewTree[0]; + mPendingShowChild = accData.ID(); + mPendingShowParent = accData.ParentID(); + mPendingShowIndex = accData.IndexInParent(); + return IPC_OK(); + } + if (!aComplete) { + // This show event has been split into multiple messages, but this is + // neither the first nor the last message. There's nothing more to do here. + return IPC_OK(); + } + MOZ_ASSERT(aComplete); + if (mPendingShowChild) { + // This is the last message for a show event split across multiple + // messages. Retrieve the saved show target, attach it to the tree and fire + // an event if appropriate. + rootParent = GetAccessible(mPendingShowParent); + MOZ_ASSERT(rootParent); + root = GetAccessible(mPendingShowChild); + MOZ_ASSERT(root); + AttachChild(rootParent, mPendingShowIndex, root); + mPendingShowChild = 0; + mPendingShowParent = 0; + mPendingShowIndex = 0; + } + // Just update, no events. - if (aData.EventSuppressed()) { + if (aEventSuppressed) { return IPC_OK(); } - RemoteAccessible* target = parent->RemoteChildAt(newChildIdx); - ProxyShowHideEvent(target, parent, true, aFromUser); + ProxyShowHideEvent(root, rootParent, true, aFromUser); if (nsCOMPtr obsService = services::GetObserverService()) { @@ -152,7 +190,7 @@ } uint32_t type = nsIAccessibleEvent::EVENT_SHOW; - xpcAccessibleGeneric* xpcAcc = GetXPCAccessible(target); + xpcAccessibleGeneric* xpcAcc = GetXPCAccessible(root); xpcAccessibleDocument* doc = GetAccService()->GetXPCDocument(this); nsINode* node = nullptr; RefPtr event = @@ -162,71 +200,60 @@ return IPC_OK(); } -uint32_t DocAccessibleParent::AddSubtree( - RemoteAccessible* aParent, const nsTArray& aNewTree, - uint32_t aIdx, uint32_t aIdxInParent) { - if (aNewTree.Length() <= aIdx) { - NS_ERROR("bad index in serialized tree!"); - return 0; - } - - const AccessibleData& newChild = aNewTree[aIdx]; - +RemoteAccessible* DocAccessibleParent::CreateAcc( + const AccessibleData& aAccData) { RemoteAccessible* newProxy; - if ((newProxy = GetAccessible(newChild.ID()))) { + if ((newProxy = GetAccessible(aAccData.ID()))) { // This is a move. Reuse the Accessible; don't destroy it. MOZ_ASSERT(!newProxy->RemoteParent()); - aParent->AddChildAt(aIdxInParent, newProxy); - newProxy->SetParent(aParent); - } else { - if (!aria::IsRoleMapIndexValid(newChild.RoleMapEntryIndex())) { - MOZ_ASSERT_UNREACHABLE("Invalid role map entry index"); - return 0; - } - newProxy = new RemoteAccessible( - newChild.ID(), aParent, this, newChild.Role(), newChild.Type(), - newChild.GenericTypes(), newChild.RoleMapEntryIndex()); - - aParent->AddChildAt(aIdxInParent, newProxy); - mAccessibles.PutEntry(newChild.ID())->mProxy = newProxy; - ProxyCreated(newProxy); + return newProxy; + } - if (RefPtr fields = newChild.CacheFields()) { - newProxy->ApplyCache(CacheUpdateType::Initial, fields); - } + if (!aria::IsRoleMapIndexValid(aAccData.RoleMapEntryIndex())) { + MOZ_ASSERT_UNREACHABLE("Invalid role map entry index"); + return nullptr; + } + + newProxy = new RemoteAccessible(aAccData.ID(), this, aAccData.Role(), + aAccData.Type(), aAccData.GenericTypes(), + aAccData.RoleMapEntryIndex()); + mAccessibles.PutEntry(aAccData.ID())->mProxy = newProxy; + + if (RefPtr fields = aAccData.CacheFields()) { + newProxy->ApplyCache(CacheUpdateType::Initial, fields); + } + return newProxy; +} + +void DocAccessibleParent::AttachChild(RemoteAccessible* aParent, + uint32_t aIndex, + RemoteAccessible* aChild) { + aParent->AddChildAt(aIndex, aChild); + aChild->SetParent(aParent); + // ProxyCreated might have already been called if aChild is being moved. + if (!aChild->GetWrapper()) { + ProxyCreated(aChild); + } + if (aChild->IsTableCell()) { + CachedTableAccessible::Invalidate(aChild); + } + if (aChild->IsOuterDoc()) { + // We can only do this after ProxyCreated is called because it will fire an + // event on aChild. mPendingOOPChildDocs.RemoveIf([&](dom::BrowserBridgeParent* bridge) { MOZ_ASSERT(bridge->GetBrowserParent(), "Pending BrowserBridgeParent should be alive"); - if (bridge->GetEmbedderAccessibleId() != newChild.ID()) { + if (bridge->GetEmbedderAccessibleId() != aChild->ID()) { return false; } MOZ_ASSERT(bridge->GetEmbedderAccessibleDoc() == this); if (DocAccessibleParent* childDoc = bridge->GetDocAccessibleParent()) { - AddChildDoc(childDoc, newChild.ID(), false); + AddChildDoc(childDoc, aChild->ID(), false); } return true; }); } - - if (newProxy->IsTableCell()) { - CachedTableAccessible::Invalidate(newProxy); - } - - DebugOnly isOuterDoc = newProxy->ChildCount() == 1; - - uint32_t accessibles = 1; - uint32_t kids = newChild.ChildrenCount(); - for (uint32_t i = 0; i < kids; i++) { - uint32_t consumed = AddSubtree(newProxy, aNewTree, aIdx + accessibles, i); - if (!consumed) return 0; - - accessibles += consumed; - } - - MOZ_ASSERT((isOuterDoc && kids == 0) || newProxy->ChildCount() == kids); - - return accessibles; } void DocAccessibleParent::ShutdownOrPrepareForMove(RemoteAccessible* aAcc) { @@ -323,6 +350,10 @@ if (mShutdown) { return IPC_OK(); } + if (aEventType == 0 || aEventType >= nsIAccessibleEvent::EVENT_LAST_ENTRY) { + MOZ_ASSERT_UNREACHABLE("Invalid event"); + return IPC_FAIL(this, "Invalid event"); + } RemoteAccessible* remote = GetAccessible(aID); if (!remote) { @@ -516,6 +547,10 @@ if (mShutdown) { return IPC_OK(); } + if (aType == 0 || aType >= nsIAccessibleEvent::EVENT_LAST_ENTRY) { + MOZ_ASSERT_UNREACHABLE("Invalid event"); + return IPC_FAIL(this, "Invalid event"); + } RemoteAccessible* target = GetAccessible(aID); RemoteAccessible* widget = GetAccessible(aWidgetID); @@ -588,6 +623,10 @@ if (mShutdown) { return IPC_OK(); } + if (aType == 0 || aType >= nsIAccessibleEvent::EVENT_LAST_ENTRY) { + MOZ_ASSERT_UNREACHABLE("Invalid event"); + return IPC_FAIL(this, "Invalid event"); + } RemoteAccessible* target = GetAccessible(aID); if (!target) { @@ -764,6 +803,10 @@ if (mShutdown) { return IPC_OK(); } + if (!aria::IsRoleMapIndexValid(aRoleMapEntryIndex)) { + MOZ_ASSERT_UNREACHABLE("Invalid role map entry index"); + return IPC_FAIL(this, "Invalid role map entry index"); + } mRole = aRole; mRoleMapEntryIndex = aRoleMapEntryIndex; diff -Nru firefox-esr-115.4.0esr/accessible/ipc/DocAccessibleParent.h firefox-esr-115.6.0esr/accessible/ipc/DocAccessibleParent.h --- firefox-esr-115.4.0esr/accessible/ipc/DocAccessibleParent.h 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/ipc/DocAccessibleParent.h 2023-12-11 19:05:27.000000000 +0000 @@ -106,8 +106,9 @@ virtual mozilla::ipc::IPCResult RecvEvent(const uint64_t& aID, const uint32_t& aType) override; - virtual mozilla::ipc::IPCResult RecvShowEvent(const ShowEventData& aData, - const bool& aFromUser) override; + virtual mozilla::ipc::IPCResult RecvShowEvent( + nsTArray&& aNewTree, const bool& aEventSuppressed, + const bool& aComplete, const bool& aFromUser) override; virtual mozilla::ipc::IPCResult RecvHideEvent(const uint64_t& aRootID, const bool& aFromUser) override; mozilla::ipc::IPCResult RecvStateChangeEvent(const uint64_t& aID, @@ -379,9 +380,9 @@ RemoteAccessible* mProxy; }; - uint32_t AddSubtree(RemoteAccessible* aParent, - const nsTArray& aNewTree, uint32_t aIdx, - uint32_t aIdxInParent); + RemoteAccessible* CreateAcc(const AccessibleData& aAccData); + void AttachChild(RemoteAccessible* aParent, uint32_t aIndex, + RemoteAccessible* aChild); [[nodiscard]] bool CheckDocTree() const; xpcAccessibleGeneric* GetXPCAccessible(RemoteAccessible* aProxy); @@ -406,6 +407,9 @@ * proxy object so we can't use a real map. */ nsTHashtable mAccessibles; + uint64_t mPendingShowChild = 0; + uint64_t mPendingShowParent = 0; + uint32_t mPendingShowIndex = 0; nsTHashSet mMovingIDs; uint64_t mActorID; bool mTopLevel; diff -Nru firefox-esr-115.4.0esr/accessible/ipc/RemoteAccessibleBase.h firefox-esr-115.6.0esr/accessible/ipc/RemoteAccessibleBase.h --- firefox-esr-115.4.0esr/accessible/ipc/RemoteAccessibleBase.h 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/ipc/RemoteAccessibleBase.h 2023-12-11 19:05:27.000000000 +0000 @@ -421,11 +421,11 @@ virtual size_t SizeOfExcludingThis(MallocSizeOf aMallocSizeOf); protected: - RemoteAccessibleBase(uint64_t aID, Derived* aParent, + RemoteAccessibleBase(uint64_t aID, DocAccessibleParent* aDoc, role aRole, AccType aType, AccGenericType aGenericTypes, uint8_t aRoleMapEntryIndex) : Accessible(aType, aGenericTypes, aRoleMapEntryIndex), - mParent(aParent->ID()), + mParent(kNoParent), mDoc(aDoc), mWrapper(0), mID(aID), diff -Nru firefox-esr-115.4.0esr/accessible/ipc/other/PDocAccessible.ipdl firefox-esr-115.6.0esr/accessible/ipc/other/PDocAccessible.ipdl --- firefox-esr-115.4.0esr/accessible/ipc/other/PDocAccessible.ipdl 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/ipc/other/PDocAccessible.ipdl 2023-12-11 19:05:27.000000000 +0000 @@ -28,7 +28,8 @@ { uint64_t ID; role Role; - uint32_t ChildrenCount; + uint64_t ParentID; + uint32_t IndexInParent; AccType Type; AccGenericType GenericTypes; uint8_t RoleMapEntryIndex; @@ -40,14 +41,6 @@ PDocAccessible; }; -struct ShowEventData -{ - uint64_t ID; - uint32_t Idx; - AccessibleData[] NewTree; - bool EventSuppressed; -}; - struct RelationTargets { uint32_t Type; @@ -77,7 +70,8 @@ * event. */ async Event(uint64_t aID, uint32_t type); - async ShowEvent(ShowEventData data, bool aFromuser); + async ShowEvent(AccessibleData[] aNewTree, bool aEventSuppressed, + bool aComplete, bool aFromuser); async HideEvent(uint64_t aRootID, bool aFromUser); async StateChangeEvent(uint64_t aID, uint64_t aState, bool aEnabled); async CaretMoveEvent(uint64_t aID, int32_t aOffset, diff -Nru firefox-esr-115.4.0esr/accessible/ipc/other/RemoteAccessible.h firefox-esr-115.6.0esr/accessible/ipc/other/RemoteAccessible.h --- firefox-esr-115.4.0esr/accessible/ipc/other/RemoteAccessible.h 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/ipc/other/RemoteAccessible.h 2023-12-11 19:05:27.000000000 +0000 @@ -25,10 +25,10 @@ */ class RemoteAccessible : public RemoteAccessibleBase { public: - RemoteAccessible(uint64_t aID, RemoteAccessible* aParent, + RemoteAccessible(uint64_t aID, DocAccessibleParent* aDoc, role aRole, AccType aType, AccGenericType aGenericTypes, uint8_t aRoleMapEntryIndex) - : RemoteAccessibleBase(aID, aParent, aDoc, aRole, aType, aGenericTypes, + : RemoteAccessibleBase(aID, aDoc, aRole, aType, aGenericTypes, aRoleMapEntryIndex) { MOZ_COUNT_CTOR(RemoteAccessible); } diff -Nru firefox-esr-115.4.0esr/accessible/ipc/win/PDocAccessible.ipdl firefox-esr-115.6.0esr/accessible/ipc/win/PDocAccessible.ipdl --- firefox-esr-115.4.0esr/accessible/ipc/win/PDocAccessible.ipdl 2023-10-17 02:48:50.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/ipc/win/PDocAccessible.ipdl 2023-12-11 19:05:28.000000000 +0000 @@ -26,21 +26,14 @@ { uint64_t ID; role Role; - uint32_t ChildrenCount; + uint64_t ParentID; + uint32_t IndexInParent; AccType Type; AccGenericType GenericTypes; uint8_t RoleMapEntryIndex; nullable AccAttributes CacheFields; }; -struct ShowEventData -{ - uint64_t ID; - uint32_t Idx; - AccessibleData[] NewTree; - bool EventSuppressed; -}; - struct TextRangeData { uint64_t StartID; @@ -62,7 +55,8 @@ * event. */ async Event(uint64_t aID, uint32_t type); - async ShowEvent(ShowEventData data, bool aFromUser); + async ShowEvent(AccessibleData[] aNewTree, bool aEventSuppressed, + bool aComplete, bool aFromuser); async HideEvent(uint64_t aRootID, bool aFromUser); async StateChangeEvent(uint64_t aID, uint64_t aState, bool aEnabled); async CaretMoveEvent(uint64_t aID, LayoutDeviceIntRect aCaretRect, diff -Nru firefox-esr-115.4.0esr/accessible/ipc/win/RemoteAccessible.h firefox-esr-115.6.0esr/accessible/ipc/win/RemoteAccessible.h --- firefox-esr-115.4.0esr/accessible/ipc/win/RemoteAccessible.h 2023-10-17 02:48:50.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/ipc/win/RemoteAccessible.h 2023-12-11 19:05:28.000000000 +0000 @@ -19,10 +19,10 @@ */ class RemoteAccessible : public RemoteAccessibleBase { public: - RemoteAccessible(uint64_t aID, RemoteAccessible* aParent, + RemoteAccessible(uint64_t aID, DocAccessibleParent* aDoc, role aRole, AccType aType, AccGenericType aGenericTypes, uint8_t aRoleMapEntryIndex) - : RemoteAccessibleBase(aID, aParent, aDoc, aRole, aType, aGenericTypes, + : RemoteAccessibleBase(aID, aDoc, aRole, aType, aGenericTypes, aRoleMapEntryIndex) { MOZ_COUNT_CTOR(RemoteAccessible); } diff -Nru firefox-esr-115.4.0esr/accessible/tests/browser/e10s/browser.ini firefox-esr-115.6.0esr/accessible/tests/browser/e10s/browser.ini --- firefox-esr-115.4.0esr/accessible/tests/browser/e10s/browser.ini 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/tests/browser/e10s/browser.ini 2023-12-11 19:05:27.000000000 +0000 @@ -28,6 +28,7 @@ [browser_caching_innerHTML.js] skip-if = os != 'win' [browser_caching_interfaces.js] +[browser_caching_large_update.js] [browser_caching_name.js] [browser_caching_position.js] [browser_caching_relations.js] diff -Nru firefox-esr-115.4.0esr/accessible/tests/browser/e10s/browser_caching_large_update.js firefox-esr-115.6.0esr/accessible/tests/browser/e10s/browser_caching_large_update.js --- firefox-esr-115.4.0esr/accessible/tests/browser/e10s/browser_caching_large_update.js 1970-01-01 00:00:00.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/tests/browser/e10s/browser_caching_large_update.js 2023-12-11 19:05:27.000000000 +0000 @@ -0,0 +1,66 @@ +/* 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"; + +/** + * Test a large update which adds many thousands of Accessibles with a + * lot of content in each. + */ +addAccessibleTask( + `
`, + async function (browser, docAcc) { + let shown = waitForEvent(EVENT_SHOW, "main"); + await invokeContentTask(browser, [], () => { + // Make a long string. + let text = ""; + for (let i = 0; i < 100; ++i) { + text += "a"; + } + // Create lots of nodes which include the long string. + const contMain = content.document.getElementById("main"); + // 15000 children of main. + for (let w = 0; w < 15000; ++w) { + // Each of those goes 9 deep. + let parent = contMain; + for (let d = 0; d < 10; ++d) { + const div = content.document.createElement("div"); + div.setAttribute("aria-label", `${w} ${d} ${text}`); + parent.append(div); + parent = div; + } + } + contMain.hidden = false; + }); + const main = (await shown).accessible; + is(main.childCount, 15000, "main has correct number of children"); + + // We don't want to output passes for every check, since that would output + // hundreds of thousands of lines, which slows the test to a crawl. Instead, + // output any failures and keep track of overall success/failure. + let treeOk = true; + function check(val, msg) { + if (!val) { + ok(false, msg); + treeOk = false; + } + } + + info("Checking tree"); + for (let w = 0; w < 15000; ++w) { + let acc = main.getChildAt(w); + let parent = main; + for (let d = 0; d < 10; ++d) { + check(acc, `Got child ${w} depth ${d}`); + const name = `${w} ${d}`; + check(acc.name.startsWith(name + " "), `${name}: correct name`); + check(acc.parent == parent, `${name}: correct parent`); + parent = acc; + acc = acc.firstChild; + } + } + // check() sets treeOk to false for any failure. + ok(treeOk, "Tree is correct"); + } +); diff -Nru firefox-esr-115.4.0esr/accessible/tests/browser/e10s/browser_caching_relations.js firefox-esr-115.6.0esr/accessible/tests/browser/e10s/browser_caching_relations.js --- firefox-esr-115.4.0esr/accessible/tests/browser/e10s/browser_caching_relations.js 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/tests/browser/e10s/browser_caching_relations.js 2023-12-11 19:05:27.000000000 +0000 @@ -18,6 +18,8 @@ ["aria-describedby", RELATION_DESCRIBED_BY, RELATION_DESCRIPTION_FOR], ["aria-controls", RELATION_CONTROLLER_FOR, RELATION_CONTROLLED_BY], ["aria-flowto", RELATION_FLOWS_TO, RELATION_FLOWS_FROM], + ["aria-details", RELATION_DETAILS, RELATION_DETAILS_FOR], + ["aria-errormessage", RELATION_ERRORMSG, RELATION_ERRORMSG_FOR], ]; /** diff -Nru firefox-esr-115.4.0esr/accessible/tests/browser/e10s/browser_caching_table.js firefox-esr-115.6.0esr/accessible/tests/browser/e10s/browser_caching_table.js --- firefox-esr-115.4.0esr/accessible/tests/browser/e10s/browser_caching_table.js 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/tests/browser/e10s/browser_caching_table.js 2023-12-11 19:05:27.000000000 +0000 @@ -504,3 +504,29 @@ }, { chrome: true, topLevel: true } ); + +/** + * Verify that we don't crash for authoring error like . + */ +addAccessibleTask( + ` + + + +
a
b
+ `, + async function (browser, docAcc) { + const table = findAccessibleChildByID(docAcc, "table", [ + nsIAccessibleTable, + ]); + is(table.rowCount, 1, "table rowCount correct"); + is(table.columnCount, 1, "table columnCount correct"); + const b = findAccessibleChildByID(docAcc, "b"); + let queryOk = false; + try { + b.QueryInterface(nsIAccessibleTableCell); + queryOk = true; + } catch (e) {} + ok(!queryOk, "No nsIAccessibleTableCell on invalid cell b"); + } +); diff -Nru firefox-esr-115.4.0esr/accessible/windows/msaa/MsaaAccessible.cpp firefox-esr-115.6.0esr/accessible/windows/msaa/MsaaAccessible.cpp --- firefox-esr-115.4.0esr/accessible/windows/msaa/MsaaAccessible.cpp 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/accessible/windows/msaa/MsaaAccessible.cpp 2023-12-11 19:05:27.000000000 +0000 @@ -206,8 +206,10 @@ nsIAccessibleEvent::EVENT_LAST_ENTRY, "MSAA event map skewed"); - NS_ASSERTION(aEventType > 0 && aEventType < ArrayLength(gWinEventMap), - "invalid event type"); + if (aEventType == 0 || aEventType >= ArrayLength(gWinEventMap)) { + MOZ_ASSERT_UNREACHABLE("invalid event type"); + return; + } uint32_t winEvent = gWinEventMap[aEventType]; if (!winEvent) return; diff -Nru firefox-esr-115.4.0esr/browser/actors/PromptParent.sys.mjs firefox-esr-115.6.0esr/browser/actors/PromptParent.sys.mjs --- firefox-esr-115.4.0esr/browser/actors/PromptParent.sys.mjs 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/browser/actors/PromptParent.sys.mjs 2023-12-11 19:05:28.000000000 +0000 @@ -132,6 +132,10 @@ switch (message.name) { case "Prompt:Open": + if (!this.windowContext.isCurrentGlobal) { + return undefined; + } + if ( (args.modalType === Ci.nsIPrompt.MODAL_TYPE_CONTENT && !lazy.contentPromptSubDialog) || diff -Nru firefox-esr-115.4.0esr/browser/base/content/browser.js firefox-esr-115.6.0esr/browser/base/content/browser.js --- firefox-esr-115.4.0esr/browser/base/content/browser.js 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/browser/base/content/browser.js 2023-12-11 19:05:27.000000000 +0000 @@ -579,6 +579,16 @@ XPCOMUtils.defineLazyPreferenceGetter( this, + "gPrintEnabled", + "print.enabled", + false, + (aPref, aOldVal, aNewVal) => { + updatePrintCommands(aNewVal); + } +); + +XPCOMUtils.defineLazyPreferenceGetter( + this, "gScreenshotsComponentEnabled", "screenshots.browser.component.enabled", false, @@ -811,6 +821,19 @@ } } +function updatePrintCommands(enabled) { + var printCommand = document.getElementById("cmd_print"); + var printPreviewCommand = document.getElementById("cmd_printPreviewToggle"); + + if (enabled) { + printCommand.removeAttribute("disabled"); + printPreviewCommand.removeAttribute("disabled"); + } else { + printCommand.setAttribute("disabled", "true"); + printPreviewCommand.setAttribute("disabled", "true"); + } +} + /** * Click-and-Hold implementation for the Back and Forward buttons * XXXmano: should this live in toolbarbutton.js? @@ -1636,6 +1659,8 @@ updateFxaToolbarMenu(gFxaToolbarEnabled, true); + updatePrintCommands(gPrintEnabled); + gUnifiedExtensions.init(); // Setting the focus will cause a style flush, it's preferable to call anything diff -Nru firefox-esr-115.4.0esr/browser/components/enterprisepolicies/Policies.sys.mjs firefox-esr-115.6.0esr/browser/components/enterprisepolicies/Policies.sys.mjs --- firefox-esr-115.4.0esr/browser/components/enterprisepolicies/Policies.sys.mjs 2023-10-17 02:48:50.000000000 +0000 +++ firefox-esr-115.6.0esr/browser/components/enterprisepolicies/Policies.sys.mjs 2023-12-11 19:05:27.000000000 +0000 @@ -1712,6 +1712,7 @@ "network.", "pdfjs.", "places.", + "pref.", "print.", "signon.", "spellchecker.", @@ -1726,6 +1727,8 @@ const allowedSecurityPrefs = [ "security.block_fileuri_script_with_wrong_mime", "security.default_personal_cert", + "security.disable_button.openCertManager", + "security.disable_button.openDeviceManager", "security.insecure_connection_text.enabled", "security.insecure_connection_text.pbmode.enabled", "security.mixed_content.block_active_content", @@ -1863,6 +1866,12 @@ }, }, + PrintingEnabled: { + onBeforeUIStartup(manager, param) { + setAndLockPref("print.enabled", param); + }, + }, + PromptForDownloadLocation: { onBeforeAddons(manager, param) { setAndLockPref("browser.download.useDownloadDir", !param); diff -Nru firefox-esr-115.4.0esr/browser/components/enterprisepolicies/schemas/policies-schema.json firefox-esr-115.6.0esr/browser/components/enterprisepolicies/schemas/policies-schema.json --- firefox-esr-115.4.0esr/browser/components/enterprisepolicies/schemas/policies-schema.json 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/browser/components/enterprisepolicies/schemas/policies-schema.json 2023-12-11 19:05:27.000000000 +0000 @@ -1141,6 +1141,10 @@ "type": "boolean" }, + "PrintingEnabled": { + "type": "boolean" + }, + "PromptForDownloadLocation": { "type": "boolean" }, diff -Nru firefox-esr-115.4.0esr/browser/components/extensions/parent/ext-browser.js firefox-esr-115.6.0esr/browser/components/extensions/parent/ext-browser.js --- firefox-esr-115.4.0esr/browser/components/extensions/parent/ext-browser.js 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/browser/components/extensions/parent/ext-browser.js 2023-12-11 19:05:27.000000000 +0000 @@ -1057,11 +1057,6 @@ if (window.windowState !== window.STATE_NORMAL) { window.restore(); } - if (window.windowState !== window.STATE_NORMAL) { - // And on OS-X, where normal vs. maximized is basically a heuristic, - // we need to cheat. - window.sizeToContent(); - } break; case window.STATE_FULLSCREEN: diff -Nru firefox-esr-115.4.0esr/browser/components/extensions/test/browser/browser_ext_windows_update.js firefox-esr-115.6.0esr/browser/components/extensions/test/browser/browser_ext_windows_update.js --- firefox-esr-115.4.0esr/browser/components/extensions/test/browser/browser_ext_windows_update.js 2023-10-17 02:48:49.000000000 +0000 +++ firefox-esr-115.6.0esr/browser/components/extensions/test/browser/browser_ext_windows_update.js 2023-12-11 19:05:27.000000000 +0000 @@ -68,7 +68,7 @@ } let currentWindowId; - async function updateWindow(windowId, params, expected) { + async function updateWindow(windowId, params, expected, otherChecks) { let window = await browser.windows.update(windowId, params); browser.test.assertEq( @@ -92,6 +92,15 @@ ); } } + if (otherChecks) { + for (let key of Object.keys(otherChecks)) { + browser.test.assertEq( + otherChecks[key], + window[key], + `Got expected value for window.${key}` + ); + } + } return checkWindow(expected); } @@ -104,6 +113,11 @@ let window = await browser.windows.getCurrent(); currentWindowId = window.id; + // Store current, "normal" width and height to compare against + // window width and height after updating to "normal" state. + let normalWidth = window.width; + let normalHeight = window.height; + await updateWindow( windowId, { state: "maximized" }, @@ -111,13 +125,20 @@ ); await updateWindow( windowId, + { state: "normal" }, + { state: "STATE_NORMAL" }, + { width: normalWidth, height: normalHeight } + ); + await updateWindow( + windowId, { state: "minimized" }, { state: "STATE_MINIMIZED" } ); await updateWindow( windowId, { state: "normal" }, - { state: "STATE_NORMAL" } + { state: "STATE_NORMAL" }, + { width: normalWidth, height: normalHeight } ); await updateWindow( windowId, @@ -127,7 +148,8 @@ await updateWindow( windowId, { state: "normal" }, - { state: "STATE_NORMAL" } + { state: "STATE_NORMAL" }, + { width: normalWidth, height: normalHeight } ); browser.test.notifyPass("window-update"); diff -Nru firefox-esr-115.4.0esr/browser/components/preferences/dialogs/browserLanguages.xhtml firefox-esr-115.6.0esr/browser/components/preferences/dialogs/browserLanguages.xhtml --- firefox-esr-115.4.0esr/browser/components/preferences/dialogs/browserLanguages.xhtml 2023-10-17 02:48:50.000000000 +0000 +++ firefox-esr-115.6.0esr/browser/components/preferences/dialogs/browserLanguages.xhtml 2023-12-11 19:05:28.000000000 +0000 @@ -31,14 +31,7 @@ - +