Version in base suite: 128.5.0esr-1~deb12u1
Base version: thunderbird_128.5.0esr-1~deb12u1
Target version: thunderbird_128.6.0esr-1~deb12u1
Base file: /srv/ftp-master.debian.org/ftp/pool/main/t/thunderbird/thunderbird_128.5.0esr-1~deb12u1.dsc
Target file: /srv/ftp-master.debian.org/policy/pool/main/t/thunderbird/thunderbird_128.6.0esr-1~deb12u1.dsc
/srv/release.debian.org/tmp/HKQRBO7Ngj/thunderbird-128.6.0esr/services/settings/dumps/blocklists/addons-bloomfilters/addons-mlbf.bin |binary
thunderbird-128.6.0esr/CLOBBER | 2
thunderbird-128.6.0esr/accessible/windows/ia2/ia2Accessible.cpp | 18
thunderbird-128.6.0esr/browser/base/content/test/general/browser_remoteTroubleshoot.js | 14
thunderbird-128.6.0esr/browser/base/content/test/general/test_remoteTroubleshoot.html | 13
thunderbird-128.6.0esr/browser/components/enterprisepolicies/Policies.sys.mjs | 1
thunderbird-128.6.0esr/browser/components/places/tests/browser/browser_bookmark_copy_folder_tree.js | 27
thunderbird-128.6.0esr/browser/components/shopping/tests/browser/browser.toml | 4
thunderbird-128.6.0esr/browser/config/version.txt | 2
thunderbird-128.6.0esr/browser/config/version_display.txt | 2
thunderbird-128.6.0esr/build/moz.configure/bootstrap.configure | 4
thunderbird-128.6.0esr/comm/.gecko_rev.yml | 4
thunderbird-128.6.0esr/comm/calendar/base/content/calendar-chrome-startup.js | 50
thunderbird-128.6.0esr/comm/calendar/base/content/today-pane-agenda.js | 33
thunderbird-128.6.0esr/comm/calendar/base/content/today-pane.js | 16
thunderbird-128.6.0esr/comm/calendar/base/content/widgets/calendar-minimonth.js | 26
thunderbird-128.6.0esr/comm/calendar/providers/caldav/modules/CalDavRequestHandlers.sys.mjs | 13
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/README.md | 88
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/base-x/index.js | 2
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/bs58/index.js | 12
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/@types/AESEncryptedSecretStoragePayload.js | 5
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/@types/another-json.js | 1
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/@types/auth.js | 2
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/@types/beacon.js | 2
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/@types/event.js | 26
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/@types/events.js | 5
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/@types/extensible_events.js | 2
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/@types/location.js | 4
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/@types/matrix-sdk-crypto-wasm.d.js | 5
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/@types/media.js | 5
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/@types/membership.js | 40
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/@types/oidc-client-ts.d.js | 3
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/@types/requests.js | 27
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/@types/state_events.js | 5
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/@types/sync.js | 2
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/@types/topic.js | 2
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/NamespacedValue.js | 4
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/ReEmitter.js | 4
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/ToDeviceMessageQueue.js | 16
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/autodiscovery.js | 106
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/base64.js | 4
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/browser-index.js | 6
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/client.js | 1283 ++-
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/common-crypto/CryptoBackend.js | 78
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/common-crypto/key-passphrase.js | 37
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/content-helpers.js | 14
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/content-repo.js | 77
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto-api.js | 218
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto-api/CryptoEvent.js | 37
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto-api/CryptoEventHandlerMap.js | 3
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto-api/index.js | 354 +
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto-api/key-passphrase.js | 48
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto-api/recovery-key.js | 70
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/CrossSigning.js | 36
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/DeviceList.js | 22
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/EncryptionSetup.js | 26
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/OlmDevice.js | 29
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/OutgoingRoomKeyRequestManager.js | 10
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/RoomList.js | 6
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/SecretSharing.js | 14
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/SecretStorage.js | 8
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/aes.js | 140
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/algorithms/base.js | 50
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/algorithms/index.js | 6
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/algorithms/megolm.js | 45
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/algorithms/olm.js | 34
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/api.js | 4
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/backup.js | 56
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/crypto.js | 37
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/dehydration.js | 25
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/device-converter.js | 2
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/deviceinfo.js | 6
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/index.js | 354 -
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/key_passphrase.js | 62
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/olmlib.js | 12
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/recoverykey.js | 65
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/store/indexeddb-crypto-store-backend.js | 14
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/store/indexeddb-crypto-store.js | 20
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/store/localStorage-crypto-store.js | 8
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/store/memory-crypto-store.js | 61
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/verification/Base.js | 20
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/verification/Error.js | 4
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/verification/IllegalMethod.js | 6
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/verification/QRCode.js | 22
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/verification/SAS.js | 21
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/verification/request/InRoomChannel.js | 10
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/verification/request/ToDeviceChannel.js | 14
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/crypto/verification/request/VerificationRequest.js | 21
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/digest.js | 38
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/embedded.js | 104
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/errors.js | 21
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/event-mapper.js | 8
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/extensible_events_v1/MessageEvent.js | 12
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/extensible_events_v1/PollEndEvent.js | 14
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/extensible_events_v1/PollResponseEvent.js | 12
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/extensible_events_v1/PollStartEvent.js | 14
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/filter-component.js | 2
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/filter.js | 8
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/http-api/errors.js | 4
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/http-api/fetch.js | 20
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/http-api/index.js | 22
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/http-api/method.js | 3
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/http-api/utils.js | 48
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/index.js | 4
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/indexeddb-worker.js | 2
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/interactive-auth.js | 30
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/logger.js | 6
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/matrix.js | 261
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/matrixrtc/CallMembership.js | 176
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/matrixrtc/LivekitFocus.js | 28
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/matrixrtc/MatrixRTCSession.js | 638 +
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/matrixrtc/MatrixRTCSessionManager.js | 43
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/matrixrtc/index.js | 49
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/MSC3089Branch.js | 8
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/MSC3089TreeSpace.js | 38
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/beacon.js | 10
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/compare-event-ordering.js | 2
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/device.js | 7
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/event-context.js | 6
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/event-timeline-set.js | 46
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/event-timeline.js | 39
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/event.js | 153
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/invites-ignorer.js | 30
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/poll.js | 10
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/profile-keys.js | 13
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/read-receipt.js | 20
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/related-relations.js | 4
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/relations-container.js | 8
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/relations.js | 14
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/room-member.js | 21
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/room-receipts.js | 14
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/room-state.js | 79
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/room.js | 354 -
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/search-result.js | 2
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/thread.js | 123
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/typed-event-emitter.js | 8
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/models/user.js | 6
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/oidc/authorize.js | 22
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/oidc/discovery.js | 32
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/oidc/index.js | 12
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/oidc/register.js | 55
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/oidc/tokenRefresher.js | 26
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/oidc/validate.js | 49
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/pushprocessor.js | 225
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/randomstring.js | 5
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/realtime-callbacks.js | 2
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/receipt-accumulator.js | 8
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rendezvous/MSC3906Rendezvous.js | 241
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rendezvous/MSC4108SignInWithQR.js | 363 +
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rendezvous/RendezvousFailureReason.js | 35
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rendezvous/channels/MSC3903ECDHv1RendezvousChannel.js | 178
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rendezvous/channels/MSC3903ECDHv2RendezvousChannel.js | 194
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rendezvous/channels/MSC4108SecureChannel.js | 224
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rendezvous/channels/index.js | 8
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rendezvous/index.js | 55
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rendezvous/transports/MSC3886SimpleHttpRendezvousTransport.js | 176
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rendezvous/transports/MSC4108RendezvousSession.js | 238
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rendezvous/transports/index.js | 8
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/room-hierarchy.js | 6
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rust-crypto/CrossSigningIdentity.js | 6
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rust-crypto/DehydratedDeviceManager.js | 267
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rust-crypto/KeyClaimManager.js | 4
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rust-crypto/OutgoingRequestProcessor.js | 57
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rust-crypto/OutgoingRequestsManager.js | 6
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rust-crypto/PerSessionKeyBackupDownloader.js | 68
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rust-crypto/RoomEncryptor.js | 67
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rust-crypto/backup.js | 75
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rust-crypto/device-converter.js | 7
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rust-crypto/index.js | 50
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rust-crypto/libolm_migration.js | 171
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rust-crypto/rust-crypto.js | 529 +
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/rust-crypto/verification.js | 111
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/scheduler.js | 40
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/secret-storage.js | 35
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/serverCapabilities.js | 106
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/sliding-sync-sdk.js | 47
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/sliding-sync.js | 30
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/store/indexeddb-local-backend.js | 12
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/store/indexeddb-remote-backend.js | 8
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/store/indexeddb-store-worker.js | 8
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/store/indexeddb.js | 27
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/store/local-storage-events-emitter.js | 2
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/store/memory.js | 15
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/store/stub.js | 4
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/sync-accumulator.js | 14
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/sync.js | 113
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/testing.js | 136
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/thread-utils.js | 2
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/timeline-window.js | 10
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/types.js | 50
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/utils.js | 27
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/utils/decryptAESSecretStorageItem.js | 48
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/utils/encryptAESSecretStorageItem.js | 66
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/utils/internal/deriveKeys.js | 58
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/webrtc/call.js | 67
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/webrtc/callEventHandler.js | 16
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/webrtc/callFeed.js | 14
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/webrtc/groupCall.js | 43
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/webrtc/groupCallEventHandler.js | 16
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/webrtc/mediaHandler.js | 12
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/webrtc/stats/callStatsReportGatherer.js | 26
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/webrtc/stats/connectionStats.js | 4
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/webrtc/stats/groupCallStats.js | 12
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/webrtc/stats/media/mediaSsrcHandler.js | 4
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/webrtc/stats/media/mediaTrackStats.js | 4
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/webrtc/stats/media/mediaTrackStatsHandler.js | 6
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/webrtc/stats/statsReportEmitter.js | 4
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-sdk/webrtc/stats/trackStatsBuilder.js | 4
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-widget-api/ClientWidgetApi.js | 186
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-widget-api/WidgetApi.js | 81
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-widget-api/driver/WidgetDriver.js | 51
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-widget-api/index.js | 22
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-widget-api/interfaces/Capabilities.js | 3
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-widget-api/interfaces/DownloadFileAction.js | 6
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-widget-api/interfaces/UpdateDelayedEventAction.js | 29
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/matrix-widget-api/interfaces/WidgetApiAction.js | 2
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/moz.build | 44
thunderbird-128.6.0esr/comm/chat/protocols/matrix/lib/oidc-client-ts/oidc-client-ts.js | 553 +
thunderbird-128.6.0esr/comm/chat/protocols/matrix/matrix-sdk.sys.mjs | 16
thunderbird-128.6.0esr/comm/chat/protocols/matrix/matrixAccount.sys.mjs | 110
thunderbird-128.6.0esr/comm/chat/protocols/matrix/matrixTextForEvent.sys.mjs | 15
thunderbird-128.6.0esr/comm/chat/protocols/matrix/test/test_matrixMessageContent.js | 4
thunderbird-128.6.0esr/comm/chat/protocols/matrix/test/test_matrixRoom.js | 4
thunderbird-128.6.0esr/comm/chat/protocols/xmpp/test/test_xmppParser.js | 14
thunderbird-128.6.0esr/comm/chat/protocols/xmpp/xmpp-xml.sys.mjs | 11
thunderbird-128.6.0esr/comm/mail/app/profile/all-thunderbird.js | 11
thunderbird-128.6.0esr/comm/mail/base/content/about3Pane.js | 8
thunderbird-128.6.0esr/comm/mail/base/content/aboutMessage.js | 11
thunderbird-128.6.0esr/comm/mail/base/content/hiddenWindowMac.js | 6
thunderbird-128.6.0esr/comm/mail/base/content/mailContext.js | 2
thunderbird-128.6.0esr/comm/mail/base/content/mailWindowOverlay.js | 11
thunderbird-128.6.0esr/comm/mail/base/content/messenger-menubar.inc.xhtml | 2
thunderbird-128.6.0esr/comm/mail/base/content/msgHdrView.js | 3
thunderbird-128.6.0esr/comm/mail/base/content/specialTabs.js | 7
thunderbird-128.6.0esr/comm/mail/base/content/widgets/auto-tree-view.mjs | 12
thunderbird-128.6.0esr/comm/mail/base/content/widgets/folder-tree-row.mjs | 8
thunderbird-128.6.0esr/comm/mail/base/content/widgets/header-fields.js | 6
thunderbird-128.6.0esr/comm/mail/base/content/widgets/listbox/tree-listbox-mixin.mjs | 11
thunderbird-128.6.0esr/comm/mail/base/content/widgets/tree-view.mjs | 71
thunderbird-128.6.0esr/comm/mail/base/content/widgets/treeview/thread-card.mjs | 10
thunderbird-128.6.0esr/comm/mail/base/content/widgets/treeview/thread-row.mjs | 21
thunderbird-128.6.0esr/comm/mail/base/test/browser/browser_cardsView.js | 1
thunderbird-128.6.0esr/comm/mail/base/test/browser/browser_dummyRow.js | 5
thunderbird-128.6.0esr/comm/mail/base/test/browser/browser_mailContext.js | 1
thunderbird-128.6.0esr/comm/mail/base/test/browser/browser_preferDisplayName.js | 7
thunderbird-128.6.0esr/comm/mail/base/test/browser/browser_threadTreeDeleting.js | 2
thunderbird-128.6.0esr/comm/mail/base/test/browser/browser_threadTreeQuirks.js | 3
thunderbird-128.6.0esr/comm/mail/base/test/browser/browser_threadTreeSorting.js | 12
thunderbird-128.6.0esr/comm/mail/base/test/browser/browser_threads.js | 3
thunderbird-128.6.0esr/comm/mail/base/test/webextensions/browser_permissions_installTrigger.js | 3
thunderbird-128.6.0esr/comm/mail/base/test/widgets/browser_autoTreeView.js | 15
thunderbird-128.6.0esr/comm/mail/base/test/widgets/browser_treeView.js | 185
thunderbird-128.6.0esr/comm/mail/base/test/widgets/files/tree-element-test-common.mjs | 22
thunderbird-128.6.0esr/comm/mail/base/test/widgets/files/tree-element-test-header.xhtml | 11
thunderbird-128.6.0esr/comm/mail/base/test/widgets/files/tree-element-test-levels.mjs | 13
thunderbird-128.6.0esr/comm/mail/base/test/widgets/files/tree-element-test-levels.xhtml | 11
thunderbird-128.6.0esr/comm/mail/base/test/widgets/files/tree-element-test-no-header.xhtml | 11
thunderbird-128.6.0esr/comm/mail/base/test/widgets/files/tree-element-test-scroll.mjs | 13
thunderbird-128.6.0esr/comm/mail/base/test/widgets/files/tree-element-test-scroll.xhtml | 11
thunderbird-128.6.0esr/comm/mail/components/addrbook/content/aboutAddressBook.js | 36
thunderbird-128.6.0esr/comm/mail/components/addrbook/test/browser/browser_contact_tree.js | 2
thunderbird-128.6.0esr/comm/mail/components/addrbook/test/browser/head.js | 1
thunderbird-128.6.0esr/comm/mail/components/extensions/ExtensionPopups.sys.mjs | 3
thunderbird-128.6.0esr/comm/mail/components/extensions/extensionPopup.xhtml | 3
thunderbird-128.6.0esr/comm/mail/components/extensions/test/browser/browser_ext_tabs_create_update_with_real_application_chooser.js | 2
thunderbird-128.6.0esr/comm/mail/config/version.txt | 2
thunderbird-128.6.0esr/comm/mail/config/version_display.txt | 2
thunderbird-128.6.0esr/comm/mail/modules/DBViewWrapper.sys.mjs | 1
thunderbird-128.6.0esr/comm/mail/test/browser/composition/browser.ini | 1
thunderbird-128.6.0esr/comm/mail/test/browser/composition/browser_mailtoComposeFormat.js | 141
thunderbird-128.6.0esr/comm/mail/test/browser/folder-display/browser_columns.js | 37
thunderbird-128.6.0esr/comm/mail/test/browser/folder-display/browser_deletionFromThreads.js | 38
thunderbird-128.6.0esr/comm/mail/test/browser/folder-pane/browser_folderPaneHeader.js | 96
thunderbird-128.6.0esr/comm/mail/test/browser/notification/browser.ini | 1
thunderbird-128.6.0esr/comm/mail/test/browser/notification/browser_filtered.js | 211
thunderbird-128.6.0esr/comm/mail/test/browser/notification/browser_notification.js | 44
thunderbird-128.6.0esr/comm/mail/themes/shared/mail/threadCard.css | 2
thunderbird-128.6.0esr/comm/mailnews/base/src/MailNotificationManager.sys.mjs | 40
thunderbird-128.6.0esr/comm/mailnews/base/src/nsMsgAccountManager.cpp | 9
thunderbird-128.6.0esr/comm/mailnews/compose/public/nsIMsgComposeService.idl | 11
thunderbird-128.6.0esr/comm/mailnews/compose/src/nsMsgComposeService.cpp | 18
thunderbird-128.6.0esr/comm/mailnews/db/msgdb/public/nsMsgDatabase.h | 2
thunderbird-128.6.0esr/comm/mailnews/db/msgdb/src/nsMsgDatabase.cpp | 14
thunderbird-128.6.0esr/comm/mailnews/db/msgdb/src/nsMsgThread.cpp | 1
thunderbird-128.6.0esr/comm/mailnews/extensions/smime/nsMsgComposeSecure.cpp | 28
thunderbird-128.6.0esr/comm/mailnews/local/src/Pop3Client.sys.mjs | 79
thunderbird-128.6.0esr/comm/mailnews/local/src/nsLocalUndoTxn.cpp | 121
thunderbird-128.6.0esr/comm/mailnews/local/src/nsLocalUndoTxn.h | 7
thunderbird-128.6.0esr/comm/mailnews/mime/cthandlers/pgpmime/nsPgpMimeProxy.cpp | 128
thunderbird-128.6.0esr/comm/mailnews/mime/cthandlers/pgpmime/nsPgpMimeProxy.h | 3
thunderbird-128.6.0esr/comm/mailnews/mime/public/MimeEncoder.h | 13
thunderbird-128.6.0esr/comm/mailnews/mime/public/nsIPgpMimeProxy.idl | 3
thunderbird-128.6.0esr/comm/mailnews/mime/src/mime_closure.cpp | 68
thunderbird-128.6.0esr/comm/mailnews/mime/src/mime_closure.h | 74
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimebuf.cpp | 64
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimebuf.h | 20
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimecms.cpp | 176
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimecryp.cpp | 84
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimecryp.h | 23
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimedrft.cpp | 137
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimeenc.cpp | 23
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimeeobj.cpp | 21
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimei.cpp | 27
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimeiimg.cpp | 33
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimeiimg.h | 4
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimeleaf.cpp | 30
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimeleaf.h | 5
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimemalt.cpp | 7
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimemcms.cpp | 141
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimemcms.h | 2
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimemoz2.cpp | 150
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimemoz2.h | 20
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimemrel.cpp | 30
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimemrel.h | 4
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimemsg.cpp | 30
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimemsig.cpp | 34
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimemsig.h | 22
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimemult.cpp | 19
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimeobj.cpp | 15
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimeobj.h | 2
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimepbuf.cpp | 3
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimepbuf.h | 2
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimesun.cpp | 3
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimetext.cpp | 52
thunderbird-128.6.0esr/comm/mailnews/mime/src/mimeunty.cpp | 4
thunderbird-128.6.0esr/comm/mailnews/mime/src/modlmime.h | 37
thunderbird-128.6.0esr/comm/mailnews/mime/src/modmimee.h | 12
thunderbird-128.6.0esr/comm/mailnews/mime/src/moz.build | 2
thunderbird-128.6.0esr/comm/mailnews/mime/src/nsSimpleMimeConverterStub.cpp | 7
thunderbird-128.6.0esr/comm/mailnews/mime/src/nsStreamConverter.cpp | 54
thunderbird-128.6.0esr/comm/mailnews/search/src/nsMsgLocalSearch.cpp | 6
thunderbird-128.6.0esr/config/milestone.txt | 2
thunderbird-128.6.0esr/debian/changelog | 42
thunderbird-128.6.0esr/debian/control | 6
thunderbird-128.6.0esr/debian/rules | 1
thunderbird-128.6.0esr/docshell/base/nsDocShell.cpp | 8
thunderbird-128.6.0esr/dom/base/StructuredCloneHolder.cpp | 12
thunderbird-128.6.0esr/dom/base/nsLineBreaker.cpp | 16
thunderbird-128.6.0esr/dom/canvas/DrawTargetWebgl.cpp | 7
thunderbird-128.6.0esr/dom/html/HTMLInputElement.cpp | 4
thunderbird-128.6.0esr/dom/media/eme/mediafoundation/WMFCDMImpl.cpp | 2
thunderbird-128.6.0esr/dom/media/ipc/MFCDMChild.cpp | 17
thunderbird-128.6.0esr/dom/media/ipc/MFCDMChild.h | 6
thunderbird-128.6.0esr/dom/media/tools/generateGmpJson.py | 199
thunderbird-128.6.0esr/dom/midi/MIDIAccess.cpp | 8
thunderbird-128.6.0esr/dom/midi/MIDIAccess.h | 18
thunderbird-128.6.0esr/dom/midi/MIDIPort.cpp | 15
thunderbird-128.6.0esr/dom/midi/MIDIPort.h | 14
thunderbird-128.6.0esr/dom/streams/ReadableByteStreamController.cpp | 8
thunderbird-128.6.0esr/dom/streams/test/xpcshell/xpcshell.toml | 1
thunderbird-128.6.0esr/image/AnimationFrameBuffer.cpp | 54
thunderbird-128.6.0esr/image/Decoder.cpp | 14
thunderbird-128.6.0esr/image/imgFrame.cpp | 49
thunderbird-128.6.0esr/image/imgFrame.h | 44
thunderbird-128.6.0esr/image/test/gtest/TestAnimationFrameBuffer.cpp | 9
thunderbird-128.6.0esr/js/src/builtin/intl/Segmenter.cpp | 37
thunderbird-128.6.0esr/js/src/builtin/intl/Segmenter.h | 91
thunderbird-128.6.0esr/js/src/vm/Modules.cpp | 15
thunderbird-128.6.0esr/layout/generic/nsPageContentFrame.cpp | 9
thunderbird-128.6.0esr/modules/libpref/init/StaticPrefList.yaml | 15
thunderbird-128.6.0esr/netwerk/dns/effective_tld_names.dat | 1471 ++--
thunderbird-128.6.0esr/netwerk/dns/nsHostRecord.cpp | 9
thunderbird-128.6.0esr/netwerk/dns/nsHostRecord.h | 4
thunderbird-128.6.0esr/netwerk/dns/nsHostResolver.cpp | 8
thunderbird-128.6.0esr/netwerk/protocol/http/Http2Session.cpp | 12
thunderbird-128.6.0esr/netwerk/protocol/http/Http2StreamBase.cpp | 4
thunderbird-128.6.0esr/netwerk/protocol/http/nsHttpConnection.cpp | 11
thunderbird-128.6.0esr/netwerk/test/unit/head_channels.js | 1
thunderbird-128.6.0esr/netwerk/wifi/gtest/TestWifiMonitorListenerRemoval.cpp | 159
thunderbird-128.6.0esr/netwerk/wifi/gtest/moz.build | 1
thunderbird-128.6.0esr/netwerk/wifi/nsWifiMonitor.cpp | 54
thunderbird-128.6.0esr/netwerk/wifi/nsWifiMonitor.h | 14
thunderbird-128.6.0esr/python/mach/mach/site.py | 89
thunderbird-128.6.0esr/python/mozboot/mozboot/base.py | 40
thunderbird-128.6.0esr/python/mozboot/mozboot/mozillabuild.py | 4
thunderbird-128.6.0esr/python/mozboot/mozboot/osx.py | 4
thunderbird-128.6.0esr/python/mozbuild/mozbuild/artifact_commands.py | 1
thunderbird-128.6.0esr/python/mozbuild/mozbuild/test/configure/test_bootstrap.py | 3
thunderbird-128.6.0esr/python/mozversioncontrol/mozversioncontrol/__init__.py | 5
thunderbird-128.6.0esr/security/manager/ssl/StaticHPKPins.h | 2
thunderbird-128.6.0esr/security/manager/ssl/nsSTSPreloadList.inc | 3318 ++++------
thunderbird-128.6.0esr/services/settings/dumps/blocklists/addons-bloomfilters.json | 94
thunderbird-128.6.0esr/services/settings/dumps/blocklists/addons-bloomfilters/addons-mlbf.bin.meta.json | 2
thunderbird-128.6.0esr/services/settings/dumps/main/devtools-compatibility-browsers.json | 317
thunderbird-128.6.0esr/services/settings/dumps/main/search-config-v2.json | 46
thunderbird-128.6.0esr/services/settings/dumps/main/search-telemetry-v2.json | 715 +-
thunderbird-128.6.0esr/services/settings/dumps/main/translations-models.json | 110
thunderbird-128.6.0esr/services/settings/dumps/main/translations-wasm.json | 40
thunderbird-128.6.0esr/services/settings/dumps/security-state/intermediates.json | 769 --
thunderbird-128.6.0esr/servo/components/selectors/context.rs | 2
thunderbird-128.6.0esr/servo/components/style/values/generics/calc.rs | 2
thunderbird-128.6.0esr/servo/components/style/values/specified/calc.rs | 9
thunderbird-128.6.0esr/sourcestamp.txt | 6
thunderbird-128.6.0esr/taskcluster/docker/debian-repackage/Dockerfile | 5
thunderbird-128.6.0esr/taskcluster/docker/firefox-snap/Dockerfile | 71
thunderbird-128.6.0esr/taskcluster/docker/firefox-snap/Makefile | 12
thunderbird-128.6.0esr/taskcluster/docker/firefox-snap/download_and_install_snap.sh | 27
thunderbird-128.6.0esr/taskcluster/docker/firefox-snap/extract_locales_from_l10n_json.py | 15
thunderbird-128.6.0esr/taskcluster/docker/firefox-snap/firefox.snapcraft.yaml.in | 91
thunderbird-128.6.0esr/taskcluster/docker/firefox-snap/policies.json | 5
thunderbird-128.6.0esr/taskcluster/docker/firefox-snap/runme.sh | 104
thunderbird-128.6.0esr/taskcluster/docker/firefox-snap/tmpdir | 6
thunderbird-128.6.0esr/taskcluster/docs/attributes.rst | 5
thunderbird-128.6.0esr/taskcluster/docs/kinds.rst | 8
thunderbird-128.6.0esr/taskcluster/gecko_taskgraph/transforms/beetmover.py | 11
thunderbird-128.6.0esr/taskcluster/gecko_taskgraph/transforms/beetmover_snap.py | 42
thunderbird-128.6.0esr/taskcluster/gecko_taskgraph/transforms/job/__init__.py | 8
thunderbird-128.6.0esr/taskcluster/gecko_taskgraph/transforms/job/toolchain.py | 8
thunderbird-128.6.0esr/taskcluster/kinds/docker-image/kind.yml | 2
thunderbird-128.6.0esr/taskcluster/kinds/release-snap-repackage/kind.yml | 60
thunderbird-128.6.0esr/taskcluster/kinds/toolchain/dist-toolchains.yml | 2
thunderbird-128.6.0esr/taskcluster/scripts/misc/build-custom-car.sh | 4
thunderbird-128.6.0esr/taskcluster/scripts/misc/build-custom-v8.sh | 2
thunderbird-128.6.0esr/testing/web-platform/meta/css/css-page/pseudo-first-margin-004-print.html.ini | 2
thunderbird-128.6.0esr/testing/web-platform/tests/css/css-values/round-function.html | 7
thunderbird-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-first-of-type-when-ancestor-changes-ref.html | 8
thunderbird-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-first-of-type-when-ancestor-changes.html | 33
thunderbird-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-last-of-type-when-ancestor-changes-ref.html | 8
thunderbird-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-always-matches-negated-last-of-type-when-ancestor-changes.html | 33
thunderbird-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-first-of-type-when-ancestor-changes-ref.html | 9
thunderbird-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-first-of-type-when-ancestor-changes.html | 30
thunderbird-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-last-of-type-when-ancestor-changes-ref.html | 9
thunderbird-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-always-matches-negated-last-of-type-when-ancestor-changes.html | 30
thunderbird-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-first-of-type-when-ancestor-changes-ref.html | 8
thunderbird-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-first-of-type-when-ancestor-changes.html | 33
thunderbird-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-last-of-type-when-ancestor-changes-ref.html | 8
thunderbird-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-is-never-matches-negated-last-of-type-when-ancestor-changes.html | 33
thunderbird-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-first-of-type-when-ancestor-changes-ref.html | 8
thunderbird-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-first-of-type-when-ancestor-changes.html | 34
thunderbird-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-last-of-type-when-ancestor-changes-ref.html | 8
thunderbird-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-negated-last-of-type-when-ancestor-changes.html | 34
thunderbird-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-first-of-type-when-ancestor-changes-ref.html | 2
thunderbird-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-first-of-type-when-ancestor-changes.html | 30
thunderbird-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-last-of-type-when-ancestor-changes-ref.html | 2
thunderbird-128.6.0esr/testing/web-platform/tests/css/selectors/invalidation/negated-never-matches-negated-last-of-type-when-ancestor-changes.html | 30
thunderbird-128.6.0esr/thunderbird-l10n/af/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/ar/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/ast/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/be/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/bg/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/br/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/ca/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/cak/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/cs/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/cy/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/da/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/de/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/dsb/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/el/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/en-CA/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/en-GB/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/es-AR/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/es-ES/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/es-MX/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/et/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/eu/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/fi/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/fr/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/fy-NL/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/ga-IE/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/gd/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/gl/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/he/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/hr/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/hsb/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/hu/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/hy-AM/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/id/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/is/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/it/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/ja/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/ka/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/kab/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/kk/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/ko/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/lt/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/lv/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/ms/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/nb-NO/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/nl/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/nn-NO/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/pa-IN/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/pl/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/pt-BR/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/pt-PT/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/rm/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/ro/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/ru/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/sk/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/sl/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/sq/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/sr/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/sv-SE/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/th/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/tr/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/uk/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/uz/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/vi/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/zh-CN/manifest.json | 4
thunderbird-128.6.0esr/thunderbird-l10n/zh-TW/manifest.json | 4
thunderbird-128.6.0esr/toolkit/actors/WebChannelChild.sys.mjs | 50
thunderbird-128.6.0esr/toolkit/actors/WebChannelParent.sys.mjs | 33
thunderbird-128.6.0esr/toolkit/components/extensions/test/mochitest/test_ext_protocolHandlers.html | 42
thunderbird-128.6.0esr/toolkit/components/search/tests/xpcshell/searchconfigs/test_ecosia.js | 3
thunderbird-128.6.0esr/toolkit/content/gmp-sources/openh264.json | 8
thunderbird-128.6.0esr/toolkit/content/gmp-sources/widevinecdm.json | 58
thunderbird-128.6.0esr/toolkit/content/gmp-sources/widevinecdm_l1.json | 5
thunderbird-128.6.0esr/toolkit/library/build/dependentlibs.py | 23
thunderbird-128.6.0esr/toolkit/modules/GMPInstallManager.sys.mjs | 2
thunderbird-128.6.0esr/toolkit/modules/tests/browser/browser_web_channel.js | 54
thunderbird-128.6.0esr/toolkit/modules/tests/xpcshell/test_GMPInstallManager.js | 440 +
thunderbird-128.6.0esr/toolkit/mozapps/extensions/internal/ProductAddonChecker.sys.mjs | 41
thunderbird-128.6.0esr/toolkit/mozapps/extensions/test/xpcshell/data/productaddons/good.xml | 7
thunderbird-128.6.0esr/toolkit/mozapps/extensions/test/xpcshell/test_ProductAddonChecker.js | 66
thunderbird-128.6.0esr/toolkit/mozapps/extensions/test/xpcshell/test_ProductAddonChecker_signatures.js | 2
thunderbird-128.6.0esr/toolkit/xre/dllservices/mozglue/WindowsDllBlocklistDefs.in | 3
thunderbird-128.6.0esr/toolkit/xre/nsAppRunner.cpp | 10
thunderbird-128.6.0esr/tools/lint/rejected-words.yml | 3
thunderbird-128.6.0esr/widget/gtk/nsDragService.cpp | 45
thunderbird-128.6.0esr/widget/gtk/nsDragService.h | 2
thunderbird-128.6.0esr/widget/windows/WinUtils.cpp | 18
thunderbird-128.6.0esr/widget/windows/WinUtils.h | 2
thunderbird-128.6.0esr/widget/windows/nsClipboard.cpp | 43
523 files changed, 15167 insertions(+), 10564 deletions(-)
diff -Nru thunderbird-128.5.0esr/CLOBBER thunderbird-128.6.0esr/CLOBBER
--- thunderbird-128.5.0esr/CLOBBER 2024-11-25 20:12:29.000000000 +0000
+++ thunderbird-128.6.0esr/CLOBBER 2025-01-07 20:45:10.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 thunderbird-128.5.0esr/accessible/windows/ia2/ia2Accessible.cpp thunderbird-128.6.0esr/accessible/windows/ia2/ia2Accessible.cpp
--- thunderbird-128.5.0esr/accessible/windows/ia2/ia2Accessible.cpp 2024-11-25 20:12:29.000000000 +0000
+++ thunderbird-128.6.0esr/accessible/windows/ia2/ia2Accessible.cpp 2025-01-07 20:45:11.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 thunderbird-128.5.0esr/browser/base/content/test/general/browser_remoteTroubleshoot.js thunderbird-128.6.0esr/browser/base/content/test/general/browser_remoteTroubleshoot.js
--- thunderbird-128.5.0esr/browser/base/content/test/general/browser_remoteTroubleshoot.js 2024-11-25 20:12:29.000000000 +0000
+++ thunderbird-128.6.0esr/browser/base/content/test/general/browser_remoteTroubleshoot.js 2025-01-07 20:45:12.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 thunderbird-128.5.0esr/browser/base/content/test/general/test_remoteTroubleshoot.html thunderbird-128.6.0esr/browser/base/content/test/general/test_remoteTroubleshoot.html
--- thunderbird-128.5.0esr/browser/base/content/test/general/test_remoteTroubleshoot.html 2024-11-25 20:12:29.000000000 +0000
+++ thunderbird-128.6.0esr/browser/base/content/test/general/test_remoteTroubleshoot.html 2025-01-07 20:45:12.000000000 +0000
@@ -1,21 +1,12 @@
diff -Nru thunderbird-128.5.0esr/comm/mail/base/test/widgets/files/tree-element-test-levels.mjs thunderbird-128.6.0esr/comm/mail/base/test/widgets/files/tree-element-test-levels.mjs
--- thunderbird-128.5.0esr/comm/mail/base/test/widgets/files/tree-element-test-levels.mjs 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mail/base/test/widgets/files/tree-element-test-levels.mjs 2025-01-07 20:45:52.000000000 +0000
@@ -40,16 +40,13 @@
this.d2.classList.add("d2");
}
- get index() {
- return super.index;
- }
+ _fillRow() {
+ super._fillRow();
- set index(index) {
- super.index = index;
- this.id = this.view.getRowProperties(index);
+ this.id = this.view.getRowProperties(this._index);
this.classList.remove("level0", "level1", "level2");
- this.classList.add(`level${this.view.getLevel(index)}`);
- this.d2.textContent = this.view.getCellText(index, "text");
+ this.classList.add(`level${this.view.getLevel(this._index)}`);
+ this.d2.textContent = this.view.getCellText(this._index, "text");
}
}
customElements.define("test-row", TestCardRow, { extends: "tr" });
diff -Nru thunderbird-128.5.0esr/comm/mail/base/test/widgets/files/tree-element-test-levels.xhtml thunderbird-128.6.0esr/comm/mail/base/test/widgets/files/tree-element-test-levels.xhtml
--- thunderbird-128.5.0esr/comm/mail/base/test/widgets/files/tree-element-test-levels.xhtml 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mail/base/test/widgets/files/tree-element-test-levels.xhtml 2025-01-07 20:45:52.000000000 +0000
@@ -5,12 +5,6 @@
Test for the tree-view custom element
diff -Nru thunderbird-128.5.0esr/comm/mail/base/test/widgets/files/tree-element-test-no-header.xhtml thunderbird-128.6.0esr/comm/mail/base/test/widgets/files/tree-element-test-no-header.xhtml
--- thunderbird-128.5.0esr/comm/mail/base/test/widgets/files/tree-element-test-no-header.xhtml 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mail/base/test/widgets/files/tree-element-test-no-header.xhtml 2025-01-07 20:45:52.000000000 +0000
@@ -10,12 +10,6 @@
Test for the tree-view custom element
diff -Nru thunderbird-128.5.0esr/comm/mail/base/test/widgets/files/tree-element-test-scroll.mjs thunderbird-128.6.0esr/comm/mail/base/test/widgets/files/tree-element-test-scroll.mjs
--- thunderbird-128.5.0esr/comm/mail/base/test/widgets/files/tree-element-test-scroll.mjs 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mail/base/test/widgets/files/tree-element-test-scroll.mjs 2025-01-07 20:45:52.000000000 +0000
@@ -40,16 +40,13 @@
this.d2.classList.add("d2");
}
- get index() {
- return super.index;
- }
+ _fillRow() {
+ super._fillRow();
- set index(index) {
- super.index = index;
- this.id = this.view.getRowProperties(index);
+ this.id = this.view.getRowProperties(this._index);
this.classList.remove("level0", "level1", "level2");
- this.classList.add(`level${this.view.getLevel(index)}`);
- this.d2.textContent = this.view.getCellText(index, "text");
+ this.classList.add(`level${this.view.getLevel(this._index)}`);
+ this.d2.textContent = this.view.getCellText(this._index, "text");
}
}
customElements.define("test-row", TestCardRow, { extends: "tr" });
diff -Nru thunderbird-128.5.0esr/comm/mail/base/test/widgets/files/tree-element-test-scroll.xhtml thunderbird-128.6.0esr/comm/mail/base/test/widgets/files/tree-element-test-scroll.xhtml
--- thunderbird-128.5.0esr/comm/mail/base/test/widgets/files/tree-element-test-scroll.xhtml 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mail/base/test/widgets/files/tree-element-test-scroll.xhtml 2025-01-07 20:45:52.000000000 +0000
@@ -5,12 +5,6 @@
Test for the tree-view custom element
diff -Nru thunderbird-128.5.0esr/comm/mail/components/addrbook/content/aboutAddressBook.js thunderbird-128.6.0esr/comm/mail/components/addrbook/content/aboutAddressBook.js
--- thunderbird-128.5.0esr/comm/mail/components/addrbook/content/aboutAddressBook.js 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mail/components/addrbook/content/aboutAddressBook.js 2025-01-07 20:45:52.000000000 +0000
@@ -1215,21 +1215,20 @@
this.appendChild(this.cell);
}
- get index() {
- return super.index;
- }
-
/**
- * Override the row setter to generate the layout.
+ * Generate the layout for the current card.
*
* @note This element could be recycled, make sure you set or clear all
* properties.
*/
- set index(index) {
- super.index = index;
+ _fillRow() {
+ super._fillRow();
- const card = this.view.getCardFromRow(index);
- this.name.textContent = this.view.getCellText(index, "GeneratedName");
+ const card = this.view.getCardFromRow(this._index);
+ this.name.textContent = this.view.getCellText(
+ this._index,
+ "GeneratedName"
+ );
// Add the address book name for All Address Books if in the sort Context
// Address Book is checked. This is done for the list view only.
@@ -1246,7 +1245,10 @@
addressBookName.classList.add("address-book-name");
this.firstLine.appendChild(addressBookName);
}
- addressBookName.textContent = this.view.getCellText(index, "addrbook");
+ addressBookName.textContent = this.view.getCellText(
+ this._index,
+ "addrbook"
+ );
} else {
this.querySelector(".address-book-name")?.remove();
}
@@ -1307,26 +1309,22 @@
}
}
- get index() {
- return super.index;
- }
-
/**
- * Override the row setter to generate the layout.
+ * Generate the layout for the current card.
*
* @note This element could be recycled, make sure you set or clear all
* properties.
*/
- set index(index) {
- super.index = index;
+ _fillRow() {
+ super._fillRow();
- const card = this.view.getCardFromRow(index);
+ const card = this.view.getCardFromRow(this._index);
this.classList.toggle("MailList", card.isMailList);
for (const column of cardsPane.COLUMNS) {
const cell = this.querySelector(`.${column.id.toLowerCase()}-column`);
if (!column.hidden) {
- cell.textContent = this.view.getCellText(index, column.id);
+ cell.textContent = this.view.getCellText(this._index, column.id);
continue;
}
diff -Nru thunderbird-128.5.0esr/comm/mail/components/addrbook/test/browser/browser_contact_tree.js thunderbird-128.6.0esr/comm/mail/components/addrbook/test/browser/browser_contact_tree.js
--- thunderbird-128.5.0esr/comm/mail/components/addrbook/test/browser/browser_contact_tree.js 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mail/components/addrbook/test/browser/browser_contact_tree.js 2025-01-07 20:45:52.000000000 +0000
@@ -1138,6 +1138,7 @@
await TestUtils.waitForCondition(
() => !cardsHeader.querySelector(`[id="addrbook"]`).hidden
);
+ await new Promise(resolve => abWindow.requestAnimationFrame(resolve));
// Check for the contact that the column is shown.
Assert.ok(
@@ -1201,6 +1202,7 @@
await TestUtils.waitForCondition(
() => !cardsHeader.querySelector(`[id="addrbook"]`).hidden
);
+ await new Promise(resolve => abWindow.requestAnimationFrame(resolve));
Assert.ok(
cardsList
diff -Nru thunderbird-128.5.0esr/comm/mail/components/addrbook/test/browser/head.js thunderbird-128.6.0esr/comm/mail/components/addrbook/test/browser/head.js
--- thunderbird-128.5.0esr/comm/mail/components/addrbook/test/browser/head.js 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mail/components/addrbook/test/browser/head.js 2025-01-07 20:45:52.000000000 +0000
@@ -73,6 +73,7 @@
const eventName = "_treerowbufferfillAbListReady";
list._rowBufferReadyEvent = new CustomEvent(eventName);
await BrowserTestUtils.waitForEvent(list, eventName);
+ await new Promise(resolve => list.ownerGlobal.requestAnimationFrame(resolve));
}
async function openAddressBookWindow() {
diff -Nru thunderbird-128.5.0esr/comm/mail/components/extensions/ExtensionPopups.sys.mjs thunderbird-128.6.0esr/comm/mail/components/extensions/ExtensionPopups.sys.mjs
--- thunderbird-128.5.0esr/comm/mail/components/extensions/ExtensionPopups.sys.mjs 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mail/components/extensions/ExtensionPopups.sys.mjs 2025-01-07 20:45:52.000000000 +0000
@@ -239,6 +239,8 @@
browser.setAttribute("selectmenulist", "ContentSelectDropdown");
browser.setAttribute("constrainpopups", "false");
browser.setAttribute("datetimepicker", "DateTimePickerPanel");
+ browser.setAttribute("nodefaultsrc", "true");
+ browser.setAttribute("maychangeremoteness", "true");
// Ensure the browser will initially load in the same group as other
// browsers from the same extension.
@@ -250,7 +252,6 @@
if (this.extension.remote) {
browser.setAttribute("remote", "true");
browser.setAttribute("remoteType", this.extension.remoteType);
- browser.setAttribute("maychangeremoteness", "true");
}
// We only need flex sizing for the sake of the slide-in sub-views of the
diff -Nru thunderbird-128.5.0esr/comm/mail/components/extensions/extensionPopup.xhtml thunderbird-128.6.0esr/comm/mail/components/extensions/extensionPopup.xhtml
--- thunderbird-128.5.0esr/comm/mail/components/extensions/extensionPopup.xhtml 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mail/components/extensions/extensionPopup.xhtml 2025-01-07 20:45:52.000000000 +0000
@@ -83,7 +83,8 @@
{
+ await add_message_to_folder(
+ [folder],
+ create_message({
+ from: "Tester ",
+ to: identity.email,
+ subject: `Mailto Test`,
+ body: {
+ body: `
+
+
+Mailto Link
+
+`,
+ contentType: "text/html",
+ },
+ })
+ );
+ };
+
+ accountA = MailServices.accounts.createAccount();
+ accountA.incomingServer = MailServices.accounts.createIncomingServer(
+ "someone",
+ "accountA.invalid",
+ "pop3"
+ );
+
+ accountB = MailServices.accounts.createAccount();
+ accountB.incomingServer = MailServices.accounts.createIncomingServer(
+ "someone",
+ "accountB.invalid",
+ "pop3"
+ );
+
+ inboxA = accountA.incomingServer.rootFolder.getFolderWithFlags(
+ Ci.nsMsgFolderFlags.Inbox
+ );
+ inboxB = accountB.incomingServer.rootFolder.getFolderWithFlags(
+ Ci.nsMsgFolderFlags.Inbox
+ );
+
+ identityA0 = MailServices.accounts.createIdentity();
+ identityA0.email = "someone@accountA.invalid";
+ accountA.addIdentity(identityA0);
+
+ identityB0 = MailServices.accounts.createIdentity();
+ identityB0.email = "someone@accountB.invalid";
+ accountB.addIdentity(identityB0);
+
+ identityB1 = MailServices.accounts.createIdentity();
+ identityB1.email = "someone.else@accountB.invalid";
+ accountB.addIdentity(identityB1);
+
+ await createTestMessage(inboxA, identityA0);
+ await createTestMessage(inboxB, identityB1);
+ await createTestMessage(inboxB, identityB0);
+
+ registerCleanupFunction(() => {
+ accountB.removeIdentity(identityB1);
+ identityB0.clearAllValues();
+ MailServices.accounts.removeAccount(accountB, true);
+ identityA0.clearAllValues();
+ MailServices.accounts.removeAccount(accountA, true);
+ });
+});
+
+add_task(async function test_mailto_links() {
+ const subTest = async (formatA0, formatB0, formatB1) => {
+ const clickMailtoLink = async (folder, identity, row = 0) => {
+ await be_in_folder(folder);
+ const msg = await select_click_row(row);
+ await assert_selected_and_displayed(window, msg);
+
+ const composePromise = promise_new_window("msgcompose");
+ await BrowserTestUtils.synthesizeMouseAtCenter(
+ "#mailtolink",
+ {},
+ get_about_message().getMessagePaneBrowser()
+ );
+ const cwc = await compose_window_ready(composePromise);
+
+ Assert.equal(
+ cwc.gMsgCompose.identity,
+ identity,
+ "The correct identity should be selected."
+ );
+ Assert.equal(
+ cwc.gMsgCompose.composeHTML,
+ identity.composeHtml,
+ "Compose HTML should match the identity's setting."
+ );
+
+ await close_compose_window(cwc);
+ };
+
+ identityA0.composeHtml = formatA0;
+ identityB0.composeHtml = formatB0;
+ identityB1.composeHtml = formatB1;
+ await clickMailtoLink(inboxA, identityA0);
+ await clickMailtoLink(inboxB, identityB0);
+ await clickMailtoLink(inboxB, identityB1, 1);
+ };
+
+ await subTest(true, false, true);
+ await subTest(false, true, false);
+});
diff -Nru thunderbird-128.5.0esr/comm/mail/test/browser/folder-display/browser_columns.js thunderbird-128.6.0esr/comm/mail/test/browser/folder-display/browser_columns.js
--- thunderbird-128.5.0esr/comm/mail/test/browser/folder-display/browser_columns.js 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mail/test/browser/folder-display/browser_columns.js 2025-01-07 20:45:52.000000000 +0000
@@ -710,25 +710,24 @@
assert_visible_columns(INBOX_DEFAULTS);
const about3Pane = document.getElementById("tabmail").currentAbout3Pane;
- let factor = 1;
ThreadPaneColumns.addCustomColumn("testCol1", {
name: "Test1",
hidden: true,
sortCallback(header) {
- return header.subject.length * factor;
+ return header.subject.length;
},
textCallback(header) {
- return header.subject.length * factor;
+ return header.subject.length;
},
});
ThreadPaneColumns.addCustomColumn("testCol2", {
name: "Test2",
hidden: true,
sortCallback(header) {
- return header.subject.length * factor;
+ return header.subject.length * 2;
},
textCallback(header) {
- return header.subject.length * factor;
+ return header.subject.length * 2;
},
});
await new Promise(setTimeout);
@@ -749,34 +748,10 @@
10
);
Assert.greater(value1, 0, "Content of custom cell #1 should be non-zero");
- Assert.greater(value2, 0, "Content of custom cell #2 should be non-zero");
Assert.equal(
- value1,
value2,
- "Content of both custom cells should be identical"
- );
-
- factor = 2;
- ThreadPaneColumns.refreshCustomColumn("testCol1");
- await new Promise(setTimeout);
-
- const refreshedValue1 = parseInt(
- row.querySelector(".testcol1-column").textContent,
- 10
- );
- const refreshedValue2 = parseInt(
- row.querySelector(".testcol2-column").textContent,
- 10
- );
- Assert.equal(
- refreshedValue1,
- value1 * 2,
- "Content of custom cell #1 should have doubled"
- );
- Assert.equal(
- refreshedValue2,
- value2,
- "Content of custom cell #2 should have not changed"
+ 2 * value1,
+ "Content of custom cell #2 should be twice cell #1"
);
ThreadPaneColumns.removeCustomColumn("testCol1");
diff -Nru thunderbird-128.5.0esr/comm/mail/test/browser/folder-display/browser_deletionFromThreads.js thunderbird-128.6.0esr/comm/mail/test/browser/folder-display/browser_deletionFromThreads.js
--- thunderbird-128.5.0esr/comm/mail/test/browser/folder-display/browser_deletionFromThreads.js 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mail/test/browser/folder-display/browser_deletionFromThreads.js 2025-01-07 20:45:52.000000000 +0000
@@ -30,8 +30,6 @@
"resource://testing-common/mail/FolderDisplayHelpers.sys.mjs"
);
-const onHdrDeletedTimeout = 500;
-
var singleFolder, folderA, folderB, multiFolder;
var tab1, tab2;
var about3Pane;
@@ -58,16 +56,15 @@
const assertReplyCount = async replyCount => {
await switch_tab();
- // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
- await new Promise(resolve =>
- about3Pane.setTimeout(resolve, onHdrDeletedTimeout)
- );
- Assert.equal(
- about3Pane.threadTree.getElementsByClassName("thread-replies")[0]
- .textContent,
- `${replyCount} replies`,
+ await new Promise(resolve => about3Pane.requestAnimationFrame(resolve));
+
+ const replies = about3Pane.threadTree.querySelector(".thread-replies");
+ Assert.deepEqual(
+ about3Pane.document.l10n.getAttributes(replies),
+ { id: "threadpane-replies", args: { count: replyCount } },
"Thread header in background tab should show the correct message count."
);
+
await switch_tab();
};
@@ -141,16 +138,21 @@
const assertMessagesCount = async (unreadCount, messagesCount) => {
await switch_tab();
- // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
- await new Promise(resolve =>
- about3Pane.setTimeout(resolve, onHdrDeletedTimeout)
- );
- Assert.equal(
- about3Pane.threadTree.getElementsByClassName("sort-header-details")[0]
- .textContent,
- `${unreadCount} unread of ${messagesCount} messages`,
+ await new Promise(resolve => about3Pane.requestAnimationFrame(resolve));
+
+ const count = about3Pane.threadTree.querySelector(".sort-header-details");
+ Assert.deepEqual(
+ about3Pane.document.l10n.getAttributes(count),
+ {
+ id: "threadpane-sort-header-unread-count",
+ args: {
+ unread: unreadCount,
+ total: messagesCount,
+ },
+ },
"Group header in background tab should show the correct message count."
);
+
await switch_tab();
};
diff -Nru thunderbird-128.5.0esr/comm/mail/test/browser/folder-pane/browser_folderPaneHeader.js thunderbird-128.6.0esr/comm/mail/test/browser/folder-pane/browser_folderPaneHeader.js
--- thunderbird-128.5.0esr/comm/mail/test/browser/folder-pane/browser_folderPaneHeader.js 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mail/test/browser/folder-pane/browser_folderPaneHeader.js 2025-01-07 20:45:52.000000000 +0000
@@ -23,7 +23,9 @@
moreContext,
fetchContext,
folderModesContextMenu,
- folderModesContextMenuPopup;
+ folderModesContextMenuPopup,
+ rootFolder,
+ inbox;
add_setup(async function () {
tabmail = document.getElementById("tabmail");
@@ -42,6 +44,9 @@
folderModesContextMenuPopup = about3Pane.document.getElementById(
"folderModesContextMenuPopup"
);
+ rootFolder = MailServices.accounts.accounts[0].incomingServer.rootFolder;
+ inbox = rootFolder.getFolderWithFlags(Ci.nsMsgFolderFlags.Inbox);
+
registerCleanupFunction(() => {
Services.xulStore.removeDocument(
"chrome://messenger/content/messenger.xhtml"
@@ -49,6 +54,30 @@
});
});
+async function assertColumns(
+ row,
+ unreadCount,
+ totalCount = null,
+ folderSize = null
+) {
+ const checkLabel = (label, content) => {
+ Assert.equal(label.hidden, content == null, `${label} should be visible`);
+ if (!content) {
+ return;
+ }
+
+ Assert.equal(
+ label.textContent,
+ content,
+ "${label} should display the correct content"
+ );
+ };
+
+ checkLabel(row.unreadCountLabel, unreadCount);
+ checkLabel(row.totalCountLabel, totalCount);
+ checkLabel(row.folderSizeLabel, folderSize);
+}
+
async function assertAriaLabel(row, expectedLabel) {
await BrowserTestUtils.waitForCondition(
() => row.getAttribute("aria-label") === expectedLabel,
@@ -514,19 +543,18 @@
"The customization data was saved"
);
- const rootFolder =
- MailServices.accounts.accounts[0].incomingServer.rootFolder;
- const inbox = rootFolder.getFolderWithFlags(Ci.nsMsgFolderFlags.Inbox);
await add_message_sets_to_folders([inbox], [create_thread(10)]);
await be_in_folder(inbox);
about3Pane.folderTree.selectedIndex = 1;
const row = about3Pane.folderTree.getRowAtIndex(1);
await assertAriaLabel(row, "Inbox, 10 unread messages");
+ await assertColumns(row, 10);
about3Pane.threadTree.selectedIndex = 0;
about3Pane.threadTree.expandRowAtIndex(0);
await assertAriaLabel(row, "Inbox, 9 unread messages");
+ await assertColumns(row, 9);
});
add_task(async function testTotalCountVisible() {
@@ -565,6 +593,7 @@
const row = about3Pane.folderTree.getRowAtIndex(1);
await assertAriaLabel(row, "Inbox, 9 unread messages, 10 total messages");
+ await assertColumns(row, 9, 10);
});
add_task(async function testFolderSizeDefaultState() {
@@ -624,6 +653,7 @@
row,
`Inbox, 9 unread messages, 10 total messages, ${row.folderSize}`
);
+ await assertColumns(row, 9, 10, row.folderSize);
});
add_task(async function testFolderSizeHidden() {
@@ -702,6 +732,7 @@
const row = about3Pane.folderTree.getRowAtIndex(1);
await assertAriaLabel(row, "Inbox, 9 unread messages");
+ await assertColumns(row, 9);
});
add_task(async function testHideLocalFoldersXULStore() {
@@ -802,8 +833,6 @@
// Create a folder and add messages to that folder to ensure the badges are
// visible and they update properly.
- const rootFolder =
- MailServices.accounts.accounts[0].incomingServer.rootFolder;
rootFolder.createSubfolder("NewlyCreatedTestFolder", null);
const folder = rootFolder.getChildNamed("NewlyCreatedTestFolder");
await be_in_folder(folder);
@@ -851,6 +880,61 @@
);
});
+/**
+ * Tests that a folder that has just been set as a favorite is displayed
+ * with the correct columns under "Favorite Folders" right away.
+ */
+add_task(async function testAddFolderToFavorites() {
+ // Enable "Favorite Folders" mode.
+ const shownPromise = BrowserTestUtils.waitForEvent(moreContext, "popupshown");
+ EventUtils.synthesizeMouseAtCenter(moreButton, {}, about3Pane);
+ await shownPromise;
+ const shownFolderModesSubMenuPromise = BrowserTestUtils.waitForEvent(
+ folderModesContextMenuPopup,
+ "popupshown"
+ );
+ EventUtils.synthesizeMouseAtCenter(folderModesContextMenu, {}, about3Pane);
+ await shownFolderModesSubMenuPromise;
+ const mode = {
+ menuID: "#folderPaneMoreContextFavoriteFolders",
+ modeID: "favorite",
+ };
+ const checkedPromise = TestUtils.waitForCondition(
+ () => moreContext.querySelector(mode.menuID).hasAttribute("checked"),
+ `"${mode.modeID}" option has been checked`
+ );
+ moreContext.activateItem(moreContext.querySelector(mode.menuID));
+ await checkedPromise;
+ const folderViewHiddenPromise = BrowserTestUtils.waitForEvent(
+ folderModesContextMenuPopup,
+ "popuphidden"
+ );
+ EventUtils.synthesizeKey("KEY_Escape", {}, about3Pane);
+ await folderViewHiddenPromise;
+ const menuHiddenPromise = BrowserTestUtils.waitForEvent(
+ moreContext,
+ "popuphidden"
+ );
+ EventUtils.synthesizeKey("KEY_Escape", {}, about3Pane);
+ await menuHiddenPromise;
+
+ // Set inbox as favorite and let the folder tree update itself.
+ inbox.setFlag(Ci.nsMsgFolderFlags.Favorite);
+ await new Promise(resolve => setTimeout(resolve));
+
+ // Expand the server row that has just been added to favorites.
+ about3Pane.folderTree.selectedIndex = 4;
+ about3Pane.folderTree.expandRowAtIndex(4);
+
+ // Check the inbox row.
+ const row = about3Pane.folderTree.getRowAtIndex(5);
+ await assertAriaLabel(
+ row,
+ `Inbox, 9 unread messages, 10 total messages, ${row.folderSize}`
+ );
+ await assertColumns(row, 9, 10, row.folderSize);
+});
+
add_task(async function testActionButtonsState() {
// Delete all accounts to start clean.
for (const account of MailServices.accounts.accounts) {
diff -Nru thunderbird-128.5.0esr/comm/mail/test/browser/notification/browser.ini thunderbird-128.6.0esr/comm/mail/test/browser/notification/browser.ini
--- thunderbird-128.5.0esr/comm/mail/test/browser/notification/browser.ini 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mail/test/browser/notification/browser.ini 2025-01-07 20:45:52.000000000 +0000
@@ -8,4 +8,5 @@
datareporting.policy.dataSubmissionPolicyBypassNotification=true
subsuite = thunderbird
+[browser_filtered.js]
[browser_notification.js]
diff -Nru thunderbird-128.5.0esr/comm/mail/test/browser/notification/browser_filtered.js thunderbird-128.6.0esr/comm/mail/test/browser/notification/browser_filtered.js
--- thunderbird-128.5.0esr/comm/mail/test/browser/notification/browser_filtered.js 1970-01-01 00:00:00.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mail/test/browser/notification/browser_filtered.js 2025-01-07 20:45:52.000000000 +0000
@@ -0,0 +1,211 @@
+/* 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/. */
+
+/**
+ * Tests that duplicate notifications about the same message do not appear.
+ */
+
+const { MailServices } = ChromeUtils.importESModule(
+ "resource:///modules/MailServices.sys.mjs"
+);
+const { MessageGenerator } = ChromeUtils.importESModule(
+ "resource://testing-common/mailnews/MessageGenerator.sys.mjs"
+);
+const { ServerTestUtils } = ChromeUtils.importESModule(
+ "resource://testing-common/mailnews/ServerTestUtils.sys.mjs"
+);
+
+Services.scriptloader.loadSubScript(
+ "chrome://mochikit/content/tests/SimpleTest/MockObjects.js",
+ this
+);
+
+add_task(async function () {
+ const localAccount = MailServices.accounts.createLocalMailAccount();
+
+ const server = await ServerTestUtils.createServer(
+ ServerTestUtils.serverDefs.imap.plain
+ );
+ server.daemon.createMailbox("INBOX/greenFilter", { subscribed: true });
+ server.daemon.createMailbox("INBOX/blueFilter", { subscribed: true });
+ server.daemon.createMailbox("INBOX/redFilter", { subscribed: true });
+
+ const account = MailServices.accounts.createAccount();
+ account.addIdentity(MailServices.accounts.createIdentity());
+ account.incomingServer = MailServices.accounts.createIncomingServer(
+ "user",
+ "test.test",
+ "imap"
+ );
+ account.incomingServer.prettyName = "IMAP Account";
+ account.incomingServer.port = 143;
+ account.incomingServer.password = "password";
+ const rootFolder = account.incomingServer.rootFolder;
+ const inbox = rootFolder.getFolderWithFlags(Ci.nsMsgFolderFlags.Inbox);
+
+ document.getElementById("tabmail").currentAbout3Pane.displayFolder(inbox);
+ await TestUtils.waitForCondition(
+ () => inbox.numSubFolders == 3,
+ "waiting for all folders to appear"
+ );
+
+ function createFilter(sender, folder) {
+ const filter = filterList.createFilter(sender);
+ filter.enabled = true;
+
+ const searchTerm = filter.createTerm();
+ searchTerm.attrib = Ci.nsMsgSearchAttrib.Sender;
+ searchTerm.op = Ci.nsMsgSearchOp.Is;
+
+ searchTerm.value = {
+ QueryInterface: ChromeUtils.generateQI(["nsIMsgSearchValue"]),
+ attrib: Ci.nsMsgSearchAttrib.Sender,
+ str: sender,
+ };
+
+ const action = filter.createAction();
+ action.type = Ci.nsMsgFilterAction.MoveToFolder;
+ action.targetFolderUri = folder.URI;
+
+ filter.appendTerm(searchTerm);
+ filter.appendAction(action);
+ filterList.insertFilterAt(0, filter);
+ }
+
+ const filterList = account.incomingServer.getFilterList(null);
+ for (const colour of ["green", "blue", "red"]) {
+ const folder = inbox.getChildNamed(`${colour}Filter`);
+ Assert.ok(folder, `folder ${colour}Filter should exist`);
+ createFilter(`${colour}@test.invalid`, folder);
+ }
+
+ const trash = await TestUtils.waitForCondition(
+ () => rootFolder.getFolderWithFlags(Ci.nsMsgFolderFlags.Trash),
+ "waiting for trash folder to exist"
+ );
+ createFilter("spammer@test.invalid", trash);
+
+ const alertsService = new MockObjectRegisterer(
+ "@mozilla.org/system-alerts-service;1",
+ MockAlertsService
+ );
+ alertsService.register();
+
+ const generator = new MessageGenerator();
+
+ registerCleanupFunction(async function () {
+ await TestUtils.waitForCondition(
+ () => account.incomingServer.allConnectionsIdle,
+ "waiting for IMAP connection to become idle"
+ );
+
+ MailServices.accounts.removeAccount(localAccount, false);
+ MailServices.accounts.removeAccount(account, false);
+ alertsService.unregister();
+ });
+
+ await server.addMessages(
+ inbox,
+ generator.makeMessages({
+ count: 1,
+ from: ["spammer", "spammer@test.invalid"],
+ })
+ );
+ window.GetFolderMessages();
+ // There should be no notification here. Wait a bit to be sure.
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ await new Promise(resolve => setTimeout(resolve, 500));
+ Assert.equal(
+ trash.getNumNewMessages(false),
+ 1,
+ "trash should have one new message"
+ );
+ Assert.ok(!MockAlertsService._alert, "there should be no notification");
+
+ for (const colour of ["red", "green", "blue", "green", "red"]) {
+ await server.addMessages(
+ inbox,
+ generator.makeMessages({
+ count: 1,
+ from: [colour, `${colour}@test.invalid`],
+ }),
+ false
+ );
+ window.GetFolderMessages();
+
+ const alert = await TestUtils.waitForCondition(
+ () => MockAlertsService._alert,
+ `waiting for a notification about folder ${colour}Filter`
+ );
+ Assert.stringContains(
+ alert.text,
+ `from "${colour}"`,
+ `notification should be about a message from ${colour}@test.invalid`
+ );
+ Assert.stringContains(
+ alert.cookie,
+ `INBOX/${colour}Filter`,
+ `notification should be about folder ${colour}Filter`
+ );
+
+ MockAlertsService._listener.observe(null, "alertfinished", alert.cookie);
+ delete MockAlertsService._alert;
+ delete MockAlertsService._listener;
+ }
+
+ await server.addMessages(
+ inbox,
+ generator.makeMessages({
+ count: 1,
+ from: ["spammer", "spammer@test.invalid"],
+ })
+ );
+ window.GetFolderMessages();
+ // There should be no notification here. Wait a bit to be sure.
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ await new Promise(resolve => setTimeout(resolve, 500));
+ Assert.equal(
+ trash.getNumNewMessages(false),
+ 1,
+ "trash should have one new message"
+ );
+ Assert.equal(
+ trash.getNumUnread(false),
+ 2,
+ "trash should have two unread messages"
+ );
+ Assert.ok(!MockAlertsService._alert, "there should be no notification");
+});
+
+/** @implements {nsIAlertsService} */
+class MockAlertsService {
+ QueryInterface = ChromeUtils.generateQI(["nsIAlertsService"]);
+
+ static _alert;
+ static _listener;
+
+ showPersistentNotification(persistentData, alert) {
+ info(`showPersistentNotification: ${alert.text}`);
+ Assert.ok(false, "unexpected call to showPersistentNotification");
+ }
+
+ showAlert(alert, listener) {
+ info(`showAlert: ${alert.text}`);
+ Assert.ok(
+ !MockAlertsService._alert,
+ "showAlert should not be called while an alert is showing"
+ );
+ MockAlertsService._alert = alert;
+ MockAlertsService._listener = listener;
+ }
+
+ showAlertNotification(imageUrl, title, text) {
+ info(`showAlertNotification: ${text}`);
+ Assert.ok(false, "unexpected call to showAlertNotification");
+ }
+
+ closeAlert() {
+ Assert.ok(false, "unexpected call to closeAlert");
+ }
+}
diff -Nru thunderbird-128.5.0esr/comm/mail/test/browser/notification/browser_notification.js thunderbird-128.6.0esr/comm/mail/test/browser/notification/browser_notification.js
--- thunderbird-128.5.0esr/comm/mail/test/browser/notification/browser_notification.js 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mail/test/browser/notification/browser_notification.js 2025-01-07 20:45:52.000000000 +0000
@@ -41,7 +41,18 @@
QueryInterface: ChromeUtils.generateQI(["nsIAlertsService"]),
+ promiseShown() {
+ this._shownDeferred = Promise.withResolvers();
+ return this._shownDeferred.promise;
+ },
+
+ promiseClosed() {
+ this._closedDeferred = Promise.withResolvers();
+ return this._closedDeferred.promise;
+ },
+
showAlert(alertInfo, alertListener) {
+ info(`showAlert: ${alertInfo.name}`);
const { imageURL, title, text, textClickable, cookie, name } = alertInfo;
// Setting the _doFail flag allows us to revert to the newmailalert.xhtml
// notification
@@ -58,6 +69,9 @@
this._alertListener = alertListener;
this._name = name;
+ this._alertListener.observe(null, "alertshow", alert.cookie);
+ this._shownDeferred?.resolve();
+ this._shownDeferred = null;
if (this._doClick) {
// eslint-disable-next-line mozilla/no-arbitrary-setTimeout
setTimeout(
@@ -65,8 +79,15 @@
this._alertListener.observe(null, "alertclickcallback", this._cookie),
100
);
- } else {
+ }
+ },
+
+ closeAlert(name) {
+ info(`closeAlert: ${name}`);
+ if (name == this._name) {
this._alertListener.observe(null, "alertfinished", this._cookie);
+ this._closedDeferred?.resolve();
+ this._closedDeferred = null;
}
},
@@ -693,6 +714,27 @@
});
/**
+ * Test what happens when loading a message when there's a notification about
+ * it. The notification should be removed.
+ */
+add_task(async function test_load_message_closes_notification() {
+ gMockAlertsService._reset();
+
+ const shownPromise = gMockAlertsService.promiseShown();
+ await make_gradually_newer_sets_in_folder([gFolder], [{ count: 1 }]);
+ await shownPromise;
+
+ const closedPromise = gMockAlertsService.promiseClosed();
+
+ const tabmail = document.getElementById("tabmail");
+ const about3Pane = tabmail.currentAbout3Pane;
+ about3Pane.restoreState({ folderURI: gFolder.URI, messagePaneVisible: true });
+ about3Pane.threadTree.selectedIndex = 0;
+
+ await closedPromise;
+});
+
+/**
* Test that we revert to newmailalert.xhtml if there is no system notification
* service present.
*
diff -Nru thunderbird-128.5.0esr/comm/mail/themes/shared/mail/threadCard.css thunderbird-128.6.0esr/comm/mail/themes/shared/mail/threadCard.css
--- thunderbird-128.5.0esr/comm/mail/themes/shared/mail/threadCard.css 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mail/themes/shared/mail/threadCard.css 2025-01-07 20:45:52.000000000 +0000
@@ -354,7 +354,7 @@
gap: var(--thread-card-content-gap);
padding: 0;
margin: 0;
- line-height: 1.3;
+ line-height: 1.5;
position: relative;
isolation: isolate;
diff -Nru thunderbird-128.5.0esr/comm/mailnews/base/src/MailNotificationManager.sys.mjs thunderbird-128.6.0esr/comm/mailnews/base/src/MailNotificationManager.sys.mjs
--- thunderbird-128.5.0esr/comm/mailnews/base/src/MailNotificationManager.sys.mjs 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mailnews/base/src/MailNotificationManager.sys.mjs 2025-01-07 20:45:52.000000000 +0000
@@ -31,8 +31,9 @@
this._systemAlertAvailable = true;
this._unreadChatCount = 0;
this._unreadMailCount = 0;
- // @type {Map} - A map of folder and its last biff time.
- this._folderBiffTime = new Map();
+ // @type {Map} - A map of folder URIs and the date of the
+ // newest message a notification has been shown for.
+ this._folderNewestNotifiedTime = new Map();
// @type {Set} - A set of folders to show alert for.
this._pendingFolders = new Set();
@@ -207,6 +208,7 @@
return;
}
this._showAlert(firstNewMsgHdr, title, body);
+ this._saveNotificationTime(folder, newMsgKeys);
this._animateDockIcon();
}
@@ -232,7 +234,7 @@
continue;
}
- if (folder.getNumNewMessages(false) > 0) {
+ if (this._getNewMsgKeysNotNotified(folder).length > 0) {
return folder;
}
}
@@ -404,27 +406,49 @@
args
);
this._customizedAlertShown = true;
- this._folderBiffTime.set(folder, Date.now());
+ this._saveNotificationTime(folder, newMsgKeys);
}
/**
- * Get all NEW messages from a folder that we received after last biff time.
+ * Get all NEW messages from a folder that are newer than the newest message
+ * in the folder we had a notification about.
*
* @param {nsIMsgFolder} folder - The message folder to check.
- * @returns {number[]} An array of message keys.
+ * @returns {nsMsgKey[]} An array of message keys.
*/
_getNewMsgKeysNotNotified(folder) {
+ if (folder.getNumNewMessages(false) == 0) {
+ return [];
+ }
+
const msgDb = folder.msgDatabase;
- const lastBiffTime = this._folderBiffTime.get(folder) || 0;
+ const newestNotifiedTime =
+ this._folderNewestNotifiedTime.get(folder.URI) || 0;
return msgDb
.getNewList()
.slice(-folder.getNumNewMessages(false))
.filter(key => {
const msgHdr = msgDb.getMsgHdrForKey(key);
- return msgHdr.dateInSeconds * 1000 > lastBiffTime;
+ return msgHdr.dateInSeconds > newestNotifiedTime;
});
}
+ /**
+ * Record the time of the newest new message in the folder, so that we never
+ * notify about it again.
+ *
+ * @param {nsIMsgFolder} folder
+ * @param {nsMsgKey[]} newMsgKeys - As returned by _getNewMsgKeysNotNotified.
+ */
+ _saveNotificationTime(folder, newMsgKeys) {
+ let newestNotifiedTime = 0;
+ for (const msgKey of newMsgKeys) {
+ const msgHdr = folder.msgDatabase.getMsgHdrForKey(msgKey);
+ newestNotifiedTime = Math.max(newestNotifiedTime, msgHdr.dateInSeconds);
+ }
+ this._folderNewestNotifiedTime.set(folder.URI, newestNotifiedTime);
+ }
+
async _updateUnreadCount() {
if (this._updatingUnreadCount) {
// _updateUnreadCount can be triggered faster than we finish rendering the
diff -Nru thunderbird-128.5.0esr/comm/mailnews/base/src/nsMsgAccountManager.cpp thunderbird-128.6.0esr/comm/mailnews/base/src/nsMsgAccountManager.cpp
--- thunderbird-128.5.0esr/comm/mailnews/base/src/nsMsgAccountManager.cpp 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mailnews/base/src/nsMsgAccountManager.cpp 2025-01-07 20:45:52.000000000 +0000
@@ -2721,6 +2721,13 @@
nsCOMPtr file;
GetVirtualFoldersFile(file);
if (!file) return NS_ERROR_FAILURE;
+ bool exists;
+ nsresult rv = file->Exists(&exists);
+ NS_ENSURE_SUCCESS(rv, rv);
+ if (!exists) {
+ m_virtualFoldersLoaded = true;
+ return NS_OK;
+ }
if (m_virtualFoldersLoaded) return NS_OK;
@@ -2730,7 +2737,7 @@
// Some may not have been created yet, which would break virtual folders
// that depend on them.
nsTArray> allServers;
- nsresult rv = GetAllServers(allServers);
+ rv = GetAllServers(allServers);
NS_ENSURE_SUCCESS(rv, rv);
for (auto server : allServers) {
if (server) {
diff -Nru thunderbird-128.5.0esr/comm/mailnews/compose/public/nsIMsgComposeService.idl thunderbird-128.6.0esr/comm/mailnews/compose/public/nsIMsgComposeService.idl
--- thunderbird-128.5.0esr/comm/mailnews/compose/public/nsIMsgComposeService.idl 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mailnews/compose/public/nsIMsgComposeService.idl 2025-01-07 20:45:52.000000000 +0000
@@ -90,10 +90,15 @@
[noscript] boolean determineComposeHTML(in nsIMsgIdentity aIdentity, in MSG_ComposeFormat aFormat);
/**
- * given a mailto url, parse the attributes and turn them into a nsIMsgComposeParams object
- * @return nsIMsgComposeParams which corresponds to the passed in mailto url
+ * Given a mailto url and an optional identity, parse the attributes and turn
+ * them into a nsIMsgComposeParams object.
+ *
+ * @param aURI The mailto url to parse.
+ * @param aIdentity An optional identity to send the message from.
+
+ * @return nsIMsgComposeParams which corresponds to the passed in data.
*/
- nsIMsgComposeParams getParamsForMailto(in nsIURI aURI);
+ nsIMsgComposeParams getParamsForMailto(in nsIURI aURI, [optional] in nsIMsgIdentity aIdentity);
/**
* @{
diff -Nru thunderbird-128.5.0esr/comm/mailnews/compose/src/nsMsgComposeService.cpp thunderbird-128.6.0esr/comm/mailnews/compose/src/nsMsgComposeService.cpp
--- thunderbird-128.5.0esr/comm/mailnews/compose/src/nsMsgComposeService.cpp 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mailnews/compose/src/nsMsgComposeService.cpp 2025-01-07 20:45:52.000000000 +0000
@@ -399,7 +399,7 @@
}
NS_IMETHODIMP nsMsgComposeService::GetParamsForMailto(
- nsIURI* aURI, nsIMsgComposeParams** aParams) {
+ nsIURI* aURI, nsIMsgIdentity* aIdentity, nsIMsgComposeParams** aParams) {
nsresult rv = NS_OK;
if (aURI) {
nsCString spec;
@@ -428,7 +428,8 @@
nsAutoString sanitizedBody;
bool composeHTMLFormat;
- DetermineComposeHTML(NULL, requestedComposeFormat, &composeHTMLFormat);
+ DetermineComposeHTML(aIdentity, requestedComposeFormat,
+ &composeHTMLFormat);
// If there was an 'html-body' param, finding it will have requested
// HTML format in GetMessageContents, so we try to use it first. If it's
@@ -467,6 +468,9 @@
pMsgComposeParams->SetFormat(composeHTMLFormat
? nsIMsgCompFormat::HTML
: nsIMsgCompFormat::PlainText);
+ if (aIdentity) {
+ pMsgComposeParams->SetIdentity(aIdentity);
+ }
nsCOMPtr pMsgCompFields(do_CreateInstance(
"@mozilla.org/messengercompose/composefields;1", &rv));
@@ -496,12 +500,10 @@
NS_IMETHODIMP nsMsgComposeService::OpenComposeWindowWithURI(
const char* aMsgComposeWindowURL, nsIURI* aURI, nsIMsgIdentity* identity) {
nsCOMPtr pMsgComposeParams;
- nsresult rv = GetParamsForMailto(aURI, getter_AddRefs(pMsgComposeParams));
- if (NS_SUCCEEDED(rv)) {
- pMsgComposeParams->SetIdentity(identity);
- rv = OpenComposeWindowWithParams(aMsgComposeWindowURL, pMsgComposeParams);
- }
- return rv;
+ nsresult rv =
+ GetParamsForMailto(aURI, identity, getter_AddRefs(pMsgComposeParams));
+ NS_ENSURE_SUCCESS(rv, rv);
+ return OpenComposeWindowWithParams(aMsgComposeWindowURL, pMsgComposeParams);
}
NS_IMETHODIMP nsMsgComposeService::InitCompose(nsIMsgComposeParams* aParams,
diff -Nru thunderbird-128.5.0esr/comm/mailnews/db/msgdb/public/nsMsgDatabase.h thunderbird-128.6.0esr/comm/mailnews/db/msgdb/public/nsMsgDatabase.h
--- thunderbird-128.5.0esr/comm/mailnews/db/msgdb/public/nsMsgDatabase.h 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mailnews/db/msgdb/public/nsMsgDatabase.h 2025-01-07 20:45:52.000000000 +0000
@@ -20,6 +20,7 @@
#include "nsCOMArray.h"
#include "PLDHashTable.h"
#include "nsTArray.h"
+#include "nsTHashMap.h"
#include "nsTObserverArray.h"
#include "prtime.h"
@@ -287,6 +288,7 @@
nsIMdbStore* m_mdbStore;
nsIMdbTable* m_mdbAllMsgHeadersTable;
nsIMdbTable* m_mdbAllThreadsTable;
+ nsTHashMap> m_mdbSearchResultsTables;
// Used for asynchronous db opens. If non-null, we're still opening
// the underlying mork database. If null, the db has been completely opened.
diff -Nru thunderbird-128.5.0esr/comm/mailnews/db/msgdb/src/nsMsgDatabase.cpp thunderbird-128.6.0esr/comm/mailnews/db/msgdb/src/nsMsgDatabase.cpp
--- thunderbird-128.5.0esr/comm/mailnews/db/msgdb/src/nsMsgDatabase.cpp 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mailnews/db/msgdb/src/nsMsgDatabase.cpp 2025-01-07 20:45:52.000000000 +0000
@@ -1000,6 +1000,7 @@
InvalidateEnumerators();
delete m_cachedHeaders;
delete m_headersInUse;
+ m_mdbSearchResultsTables.Clear();
if (m_msgReferences) {
delete m_msgReferences;
@@ -5041,10 +5042,15 @@
nsMsgDatabase::HdrIsInCache(const nsACString& aSearchFolderUri,
nsIMsgDBHdr* aHdr, bool* aResult) {
NS_ENSURE_ARG_POINTER(aResult);
- nsCOMPtr table;
- nsresult err =
- GetSearchResultsTable(aSearchFolderUri, true, getter_AddRefs(table));
- NS_ENSURE_SUCCESS(err, err);
+ nsresult err;
+
+ RefPtr table;
+ if (!m_mdbSearchResultsTables.Get(aSearchFolderUri, &table)) {
+ err = GetSearchResultsTable(aSearchFolderUri, true, getter_AddRefs(table));
+ NS_ENSURE_SUCCESS(err, err);
+ m_mdbSearchResultsTables.InsertOrUpdate(aSearchFolderUri, table);
+ }
+
nsMsgKey key;
aHdr->GetMessageKey(&key);
mdbOid rowObjectId;
diff -Nru thunderbird-128.5.0esr/comm/mailnews/db/msgdb/src/nsMsgThread.cpp thunderbird-128.6.0esr/comm/mailnews/db/msgdb/src/nsMsgThread.cpp
--- thunderbird-128.5.0esr/comm/mailnews/db/msgdb/src/nsMsgThread.cpp 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mailnews/db/msgdb/src/nsMsgThread.cpp 2025-01-07 20:45:52.000000000 +0000
@@ -100,7 +100,6 @@
if (hasNew) {
nsTArray newKeys;
m_mdbDB->GetNewList(newKeys);
- newKeys.Sort();
for (uint32_t childIndex = 0; childIndex < m_numChildren; childIndex++) {
nsMsgKey key;
diff -Nru thunderbird-128.5.0esr/comm/mailnews/extensions/smime/nsMsgComposeSecure.cpp thunderbird-128.6.0esr/comm/mailnews/extensions/smime/nsMsgComposeSecure.cpp
--- thunderbird-128.5.0esr/comm/mailnews/extensions/smime/nsMsgComposeSecure.cpp 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mailnews/extensions/smime/nsMsgComposeSecure.cpp 2025-01-07 20:45:52.000000000 +0000
@@ -48,9 +48,9 @@
static void mime_crypto_write_base64(void* closure, const char* buf,
unsigned long size);
static nsresult mime_encoder_output_fn(const char* buf, int32_t size,
- void* closure);
+ MimeClosure closure);
static nsresult mime_nested_encoder_output_fn(const char* buf, int32_t size,
- void* closure);
+ MimeClosure closure);
static nsresult make_multipart_signed_header_string(bool outer_p,
char** header_return,
char** boundary_return,
@@ -548,8 +548,9 @@
}
// Initialize the base64 encoder
- mCryptoEncoder.reset(
- MimeEncoder::GetBase64Encoder(mime_encoder_output_fn, this));
+ mCryptoEncoder.reset(MimeEncoder::GetBase64Encoder(
+ mime_encoder_output_fn,
+ MimeClosure(MimeClosure::isMsgComposeSecure, this)));
/* Initialize the encrypter (and add the sender's cert.) */
PR_ASSERT(mSelfEncryptionCert);
@@ -682,7 +683,8 @@
// Initialize the base64 encoder for the signature data.
MOZ_ASSERT(!mSigEncoder, "Shouldn't already have a mSigEncoder");
mSigEncoder.reset(MimeEncoder::GetBase64Encoder(
- (aOuter ? mime_encoder_output_fn : mime_nested_encoder_output_fn), this));
+ (aOuter ? mime_encoder_output_fn : mime_nested_encoder_output_fn),
+ MimeClosure(MimeClosure::isMsgComposeSecure, this)));
/* Write out the signature.
*/
@@ -1087,8 +1089,13 @@
base64-encoded representation of the signature to the file.
*/
// TODO: size should probably be converted to uint32_t
-nsresult mime_encoder_output_fn(const char* buf, int32_t size, void* closure) {
- nsMsgComposeSecure* state = (nsMsgComposeSecure*)closure;
+nsresult mime_encoder_output_fn(const char* buf, int32_t size,
+ MimeClosure closure) {
+ nsMsgComposeSecure* state = closure.AsMsgComposeSecure();
+ if (!state) {
+ return NS_ERROR_UNEXPECTED;
+ }
+
nsCOMPtr stream;
state->GetOutputStream(getter_AddRefs(stream));
uint32_t n;
@@ -1105,8 +1112,11 @@
directly to the file.
*/
static nsresult mime_nested_encoder_output_fn(const char* buf, int32_t size,
- void* closure) {
- nsMsgComposeSecure* state = (nsMsgComposeSecure*)closure;
+ MimeClosure closure) {
+ nsMsgComposeSecure* state = closure.AsMsgComposeSecure();
+ if (!state) {
+ return NS_ERROR_FAILURE;
+ }
// Copy to new null-terminated string so JS glue doesn't crash when
// MimeCryptoWriteBlock() is implemented in JS.
diff -Nru thunderbird-128.5.0esr/comm/mailnews/local/src/Pop3Client.sys.mjs thunderbird-128.6.0esr/comm/mailnews/local/src/Pop3Client.sys.mjs
--- thunderbird-128.5.0esr/comm/mailnews/local/src/Pop3Client.sys.mjs 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mailnews/local/src/Pop3Client.sys.mjs 2025-01-07 20:45:52.000000000 +0000
@@ -842,6 +842,9 @@
if (this._nextAuthMethod) {
// Try the next auth method.
+ this._logger.debug(
+ `AUTH ${this._currentAuthMethod} failed. Trying AUTH ${this._nextAuthMethod} next`
+ );
this._actionAuth();
return;
}
@@ -909,36 +912,90 @@
};
/**
- * The second step of PLAIN auth, send the auth token to the server.
+ * This is the second step of PLAIN auth. Handle response to AUTH PLAIN
+ * command.
*/
_actionAuthPlain = async res => {
if (!res.success) {
- this._actionError("pop3UsernameFailure", [], res.statusText);
+ // Command "AUTH PLAIN" failed. If there is another auth mechanism, just
+ // log the failure and try the next mechanism.
+ if (this._nextAuthMethod) {
+ this._logger.debug(
+ `AUTH PLAIN failed. Trying AUTH ${this._nextAuthMethod} next`
+ );
+ this._actionAuth();
+ } else {
+ // There are no more auth mechanisms, produce a notification to the user
+ // that we are unable to authenticate (which also gets logged).
+ // FIXME: Need a new error string here indicating AUTH PLAIN command
+ // failed. Currently this says sending username failed but username was
+ // never sent.
+ this._actionError("pop3UsernameFailure", [], res.statusText);
+ }
return;
}
+ // AUTH PLAIN command succeeded. Obtain and send the plain auth token to the
+ // server.
this._nextAction = this._actionAuthResponse;
await this._send(await this._authenticator.getPlainToken(), true);
};
/**
- * The second step of LOGIN auth, send the username to the server.
+ * This is the second step of LOGIN auth. Handle response to AUTH LOGIN
+ * command.
*/
- _actionAuthLoginUser = async () => {
+ _actionAuthLoginUser = async res => {
+ if (!res.success) {
+ // Command "AUTH LOGIN" failed. If there is another auth mechanism, just
+ // log the failure and try the next mechanism.
+ if (this._nextAuthMethod) {
+ this._logger.debug(
+ `AUTH LOGIN failed, Trying AUTH ${this._nextAuthMethod} next`
+ );
+ this._actionAuth();
+ } else {
+ // There are no more auth mechanisms, produce a notification to the user
+ // that we are unable to authenticate (which also gets logged).
+ // FIXME: Need new error string here indicating AUTH LOGIN command
+ // failed. Currently this says sending username failed but username was
+ // never sent.
+ this._actionError("pop3UsernameFailure", [], res.statusText);
+ }
+ return;
+ }
+ // AUTH LOGIN command succeeded. Send the base64 username to the server.
+ // Note: The res.statusText here will be base64 "Username:" and is not
+ // verified.
this._nextAction = this._actionAuthLoginPass;
- this._logger.debug("AUTH LOGIN USER");
+ this._logger.debug("Sending username for AUTH LOGIN");
await this._send(btoa(this._authenticator.username), true);
};
/**
- * The third step of LOGIN auth, send the password to the server.
+ * This is the third step of LOGIN auth. Handle the response to send of
+ * username for LOGIN.
*/
_actionAuthLoginPass = async res => {
if (!res.success) {
- this._actionError("pop3UsernameFailure", [], res.statusText);
+ // AUTH LOGIN username failed. If there is another auth mechanism, just
+ // log the failure and try the next mechanism.
+ if (this._nextAuthMethod) {
+ this._logger.debug(
+ `AUTH LOGIN username failed. Trying AUTH ${this._nextAuthMethod} next`
+ );
+ this._actionAuth();
+ } else {
+ // There are no more auth mechanisms, produce a notification to the user
+ // that we are unable to authenticate (which also gets logged).
+ this._actionError("pop3UsernameFailure", [], res.statusText);
+ }
return;
}
+ // Send of username for AUTH LOGIN succeeded. Send the base64 password to
+ // the server. Note: The res.statusText here will be base64 "Password:"
+ // and is not verified.
this._nextAction = this._actionAuthResponse;
- this._logger.debug("AUTH LOGIN PASS");
+ this._logger.debug("Sending password for AUTH LOGIN");
let password = await this._authenticator.getPassword();
if (
!Services.prefs.getBoolPref(
@@ -947,9 +1004,9 @@
) ||
!/^[\x00-\xFF]+$/.test(password) // eslint-disable-line no-control-regex
) {
- // Unlike PLAIN auth, the payload of LOGIN auth is not standardized. When
- // `mail.smtp_login_pop3_user_pass_auth_is_latin1` is true, we apply
- // base64 encoding directly. Otherwise, we convert it to UTF-8
+ // Unlike PLAIN auth, the payload of LOGIN auth is not standardized.
+ // When `mail.smtp_login_pop3_user_pass_auth_is_latin1` is true, we
+ // apply base64 encoding directly. Otherwise, we convert it to UTF-8
// BinaryString first, to make it work with btoa().
password = MailStringUtils.stringToByteString(password);
}
diff -Nru thunderbird-128.5.0esr/comm/mailnews/local/src/nsLocalUndoTxn.cpp thunderbird-128.6.0esr/comm/mailnews/local/src/nsLocalUndoTxn.cpp
--- thunderbird-128.5.0esr/comm/mailnews/local/src/nsLocalUndoTxn.cpp 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mailnews/local/src/nsLocalUndoTxn.cpp 2025-01-07 20:45:52.000000000 +0000
@@ -20,8 +20,7 @@
NS_IMPL_ISUPPORTS_INHERITED(nsLocalMoveCopyMsgTxn, nsMsgTxn, nsIFolderListener)
-nsLocalMoveCopyMsgTxn::nsLocalMoveCopyMsgTxn()
- : m_srcIsImap4(false), m_canUndelete(false) {}
+nsLocalMoveCopyMsgTxn::nsLocalMoveCopyMsgTxn() : m_srcIsImap4(false) {}
nsLocalMoveCopyMsgTxn::~nsLocalMoveCopyMsgTxn() {}
@@ -185,43 +184,6 @@
CheckForToggleDelete(srcFolder, m_srcKeyArray[0],
&deleteFlag); // there could have been a toggle.
rv = UndoImapDeleteFlag(srcFolder, m_srcKeyArray, deleteFlag);
- } else if (m_canUndelete) {
- nsTArray> srcMessages(count);
- nsTArray> destMessages(count);
-
- for (i = 0; i < count; i++) {
- nsCOMPtr oldHdr;
- rv = dstDB->GetMsgHdrForKey(m_dstKeyArray[i], getter_AddRefs(oldHdr));
- NS_ASSERTION(oldHdr, "fatal ... cannot get old msg header");
- if (NS_SUCCEEDED(rv) && oldHdr) {
- nsCOMPtr newHdr;
- rv = srcDB->CopyHdrFromExistingHdr(m_srcKeyArray[i], oldHdr, true,
- getter_AddRefs(newHdr));
- NS_ASSERTION(newHdr, "fatal ... cannot create new msg header");
- if (NS_SUCCEEDED(rv) && newHdr) {
- srcDB->UndoDelete(newHdr);
- srcMessages.AppendElement(newHdr);
- // (we want to keep these two lists in sync)
- destMessages.AppendElement(oldHdr);
- }
- }
- }
-
- nsCOMPtr notifier(
- do_GetService("@mozilla.org/messenger/msgnotificationservice;1"));
- if (notifier) {
- // Remember that we're actually moving things back from the destination
- // to the source!
- notifier->NotifyMsgsMoveCopyCompleted(true, destMessages, srcFolder,
- srcMessages);
- }
-
- nsCOMPtr localFolder =
- do_QueryInterface(srcFolder);
- if (localFolder) {
- localFolder->MarkMsgsOnPop3Server(srcMessages,
- POP3_NONE /*deleteMsgs*/);
- }
} else // undoing a move means moving the messages back.
{
nsTArray> dstMessages(m_dstKeyArray.Length());
@@ -279,75 +241,24 @@
rv = dstFolder->GetMsgDatabase(getter_AddRefs(dstDB));
if (NS_FAILED(rv)) return rv;
- uint32_t count = m_srcKeyArray.Length();
- uint32_t i;
- nsCOMPtr oldHdr;
- nsCOMPtr newHdr;
-
nsTArray> srcMessages(m_srcKeyArray.Length());
- for (i = 0; i < count; i++) {
- rv = srcDB->GetMsgHdrForKey(m_srcKeyArray[i], getter_AddRefs(oldHdr));
- NS_ASSERTION(oldHdr, "fatal ... cannot get old msg header");
-
- if (NS_SUCCEEDED(rv) && oldHdr) {
- srcMessages.AppendElement(oldHdr);
-
- if (m_canUndelete) {
- rv = dstDB->CopyHdrFromExistingHdr(m_dstKeyArray[i], oldHdr, true,
- getter_AddRefs(newHdr));
- NS_ASSERTION(newHdr, "fatal ... cannot get new msg header");
- if (NS_SUCCEEDED(rv) && newHdr) {
- if (i < m_dstSizeArray.Length())
- rv = newHdr->SetMessageSize(m_dstSizeArray[i]);
- dstDB->UndoDelete(newHdr);
- }
- }
- }
- }
- dstDB->SetSummaryValid(true);
-
- if (m_isMove) {
- if (m_srcIsImap4) {
- // protect against a bogus undo txn without any source keys
- // see bug #179856 for details
- NS_ASSERTION(!m_srcKeyArray.IsEmpty(), "no source keys");
- if (m_srcKeyArray.IsEmpty()) return NS_ERROR_UNEXPECTED;
-
- bool deleteFlag = false; // message is un-deleted- we are trying to redo
- CheckForToggleDelete(srcFolder, m_srcKeyArray[0],
- &deleteFlag); // there could have been a toggle
- rv = UndoImapDeleteFlag(srcFolder, m_srcKeyArray, deleteFlag);
- } else if (m_canUndelete) {
- nsCOMPtr localFolder =
- do_QueryInterface(srcFolder);
- if (localFolder) {
- localFolder->MarkMsgsOnPop3Server(srcMessages,
- POP3_DELETE /*deleteMsgs*/);
- }
-
- rv = srcDB->DeleteMessages(m_srcKeyArray, nullptr);
- srcDB->SetSummaryValid(true);
- } else {
- nsCOMPtr srcHdr;
- m_numHdrsCopied = 0;
- m_dstKeyArray.Clear();
- for (i = 0; i < count; i++) {
- srcDB->GetMsgHdrForKey(m_srcKeyArray[i], getter_AddRefs(srcHdr));
- NS_ASSERTION(srcHdr, "fatal ... cannot get old msg header");
- if (srcHdr) {
- nsCString messageId;
- srcHdr->GetMessageId(messageId);
- m_copiedMsgIds.AppendElement(messageId);
- }
- }
- dstFolder->AddFolderListener(this);
- m_undoing = false;
- return dstFolder->CopyMessages(srcFolder, srcMessages, true, nullptr,
- nullptr, false, false);
+ nsCOMPtr srcHdr;
+ m_numHdrsCopied = 0;
+ m_dstKeyArray.Clear();
+ for (nsMsgKey srcKey : m_srcKeyArray) {
+ rv = srcDB->GetMsgHdrForKey(srcKey, getter_AddRefs(srcHdr));
+ NS_ASSERTION(srcHdr, "fatal ... cannot get old msg header");
+ if (NS_SUCCEEDED(rv) && srcHdr) {
+ srcMessages.AppendElement(srcHdr);
+ nsCString messageId;
+ srcHdr->GetMessageId(messageId);
+ m_copiedMsgIds.AppendElement(messageId);
}
}
-
- return rv;
+ dstFolder->AddFolderListener(this);
+ m_undoing = false;
+ return dstFolder->CopyMessages(srcFolder, srcMessages, m_isMove, nullptr,
+ nullptr, false, false);
}
NS_IMETHODIMP nsLocalMoveCopyMsgTxn::OnFolderAdded(nsIMsgFolder* parent,
diff -Nru thunderbird-128.5.0esr/comm/mailnews/local/src/nsLocalUndoTxn.h thunderbird-128.6.0esr/comm/mailnews/local/src/nsLocalUndoTxn.h
--- thunderbird-128.5.0esr/comm/mailnews/local/src/nsLocalUndoTxn.h 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mailnews/local/src/nsLocalUndoTxn.h 2025-01-07 20:45:52.000000000 +0000
@@ -36,12 +36,6 @@
nsresult UndoImapDeleteFlag(nsIMsgFolder* aFolder,
nsTArray& aKeyArray, bool deleteFlag);
nsresult UndoTransactionInternal();
- // If the store using this undo transaction can "undelete" a message,
- // it will call this function on the transaction; This makes undo/redo
- // easy because message keys don't change after undo/redo. Otherwise,
- // we need to adjust the src or dst keys after every undo/redo action
- // to note the new keys.
- void SetCanUndelete(bool canUndelete) { m_canUndelete = canUndelete; }
private:
virtual ~nsLocalMoveCopyMsgTxn();
@@ -51,7 +45,6 @@
nsTArray m_dstKeyArray;
bool m_isMove;
bool m_srcIsImap4;
- bool m_canUndelete;
nsTArray m_dstSizeArray;
bool m_undoing; // if false, re-doing
uint32_t m_numHdrsCopied;
diff -Nru thunderbird-128.5.0esr/comm/mailnews/mime/cthandlers/pgpmime/nsPgpMimeProxy.cpp thunderbird-128.6.0esr/comm/mailnews/mime/cthandlers/pgpmime/nsPgpMimeProxy.cpp
--- thunderbird-128.5.0esr/comm/mailnews/mime/cthandlers/pgpmime/nsPgpMimeProxy.cpp 2024-11-25 20:13:07.000000000 +0000
+++ thunderbird-128.6.0esr/comm/mailnews/mime/cthandlers/pgpmime/nsPgpMimeProxy.cpp 2025-01-07 20:45:52.000000000 +0000
@@ -19,6 +19,7 @@
#include "nsNetUtil.h"
#include "mimemoz2.h"
+#include "mime_closure.h"
#include "nspr.h"
#include "plstr.h"
#include "nsIPgpMimeProxy.h"
@@ -60,13 +61,14 @@
return objClass;
}
-static void* MimePgpe_init(MimeObject*,
- int (*output_fn)(const char*, int32_t, void*),
- void*);
-static int MimePgpe_write(const char*, int32_t, void*);
-static int MimePgpe_eof(void*, bool);
-static char* MimePgpe_generate(void*);
-static void MimePgpe_free(void*);
+static MimeClosure MimePgpe_init(MimeObject*,
+ int (*output_fn)(const char*, int32_t, int32_t,
+ void*),
+ MimeClosure);
+static int MimePgpe_write(const char*, int32_t, MimeClosure);
+static int MimePgpe_eof(MimeClosure, bool);
+static char* MimePgpe_generate(MimeClosure);
+static void MimePgpe_free(MimeClosure);
/* Returns a string describing the location of the part (like "2.5.3").
This is not a full URL, just a part-number.
@@ -114,13 +116,17 @@
public:
NS_DECL_ISUPPORTS
- int (*output_fn)(const char* buf, int32_t buf_size, void* output_closure);
- void* output_closure;
+ int (*output_fn)(const char* buf, int32_t buf_size,
+ int32_t output_closure_type, void* output_closure);
+ MimeClosure output_closure;
MimeObject* self;
nsCOMPtr mimeDecrypt;
- MimePgpeData() : output_fn(nullptr), output_closure(nullptr), self(nullptr) {}
+ MimePgpeData()
+ : output_fn(nullptr),
+ output_closure(MimeClosure::zero()),
+ self(nullptr) {}
private:
virtual ~MimePgpeData() {}
@@ -128,14 +134,16 @@
NS_IMPL_ISUPPORTS0(MimePgpeData)
-static void* MimePgpe_init(MimeObject* obj,
- int (*output_fn)(const char* buf, int32_t buf_size,
- void* output_closure),
- void* output_closure) {
- if (!(obj && obj->options && output_fn)) return nullptr;
+static MimeClosure MimePgpe_init(MimeObject* obj,
+ int (*output_fn)(const char* buf,
+ int32_t buf_size,
+ int32_t output_closure_type,
+ void* output_closure),
+ MimeClosure output_closure) {
+ if (!(obj && obj->options && output_fn)) return MimeClosure::zero();
MimePgpeData* data = new MimePgpeData();
- NS_ENSURE_TRUE(data, nullptr);
+ NS_ENSURE_TRUE(data, MimeClosure::zero());
data->self = obj;
data->output_fn = output_fn;
@@ -145,7 +153,7 @@
// Create proxy object.
nsresult rv;
data->mimeDecrypt = do_CreateInstance(NS_PGPMIMEPROXY_CONTRACTID, &rv);
- if (NS_FAILED(rv)) return data;
+ if (NS_FAILED(rv)) return MimeClosure(MimeClosure::isMimePgpeData, data);
char* ct = MimeHeaders_get(obj->headers, HEADER_CONTENT_TYPE, false, false);
@@ -154,12 +162,12 @@
PR_Free(ct);
- if (NS_FAILED(rv)) return nullptr;
+ if (NS_FAILED(rv)) return MimeClosure::zero();
nsCString mimePart = determineMimePart(obj);
rv = data->mimeDecrypt->SetMimePart(mimePart);
- if (NS_FAILED(rv)) return nullptr;
+ if (NS_FAILED(rv)) return MimeClosure::zero();
if (mimePart.EqualsLiteral("1.1") && obj->parent &&
obj->parent->content_type &&
@@ -176,14 +184,19 @@
data->mimeDecrypt->SetAllowNestedDecrypt(true);
}
- mime_stream_data* msd =
- (mime_stream_data*)(data->self->options->stream_closure);
- nsIChannel* channel = msd->channel;
nsCOMPtr uri;
nsCOMPtr mailChannel;
- if (channel) {
- channel->GetURI(getter_AddRefs(uri));
- mailChannel = do_QueryInterface(channel);
+
+ mime_stream_data* msd =
+ data->self->options->stream_closure.IsMimeDraftData()
+ ? nullptr
+ : data->self->options->stream_closure.AsMimeStreamData();
+ if (msd) {
+ nsIChannel* channel = msd->channel;
+ if (channel) {
+ channel->GetURI(getter_AddRefs(uri));
+ mailChannel = do_QueryInterface(channel);
+ }
}
if (!uri && obj && obj->options && obj->options->url) {
@@ -194,28 +207,43 @@
}
// Initialise proxy object with MIME's output function, object and URI.
- if (NS_FAILED(data->mimeDecrypt->SetMimeCallback(output_fn, output_closure,
- uri, mailChannel)))
- return nullptr;
+ if (NS_FAILED(data->mimeDecrypt->SetMimeCallback(
+ output_fn, output_closure.mType, output_closure.mClosure, uri,
+ mailChannel)))
+ return MimeClosure::zero();
- return data;
+ return MimeClosure(MimeClosure::isMimePgpeData, data);
}
static int MimePgpe_write(const char* buf, int32_t buf_size,
- void* output_closure) {
- MimePgpeData* data = (MimePgpeData*)output_closure;
+ MimeClosure output_closure) {
+ if (!output_closure) {
+ return -1;
+ }
+
+ MimePgpeData* data = output_closure.AsMimePgpeData();
+ if (!data) {
+ return -1;
+ }
- if (!data || !data->output_fn) return -1;
+ if (!data->output_fn) return -1;
if (!data->mimeDecrypt) return 0;
return (NS_SUCCEEDED(data->mimeDecrypt->Write(buf, buf_size)) ? 0 : -1);
}
-static int MimePgpe_eof(void* output_closure, bool abort_p) {
- MimePgpeData* data = (MimePgpeData*)output_closure;
+static int MimePgpe_eof(MimeClosure output_closure, bool abort_p) {
+ if (!output_closure) {
+ return -1;
+ }
+
+ MimePgpeData* data = output_closure.AsMimePgpeData();
+ if (!data) {
+ return -1;
+ }
- if (!data || !data->output_fn) return -1;
+ if (!data->output_fn) return -1;
if (NS_FAILED(data->mimeDecrypt->Finish())) return -1;
@@ -224,7 +252,7 @@
return 0;
}
-static char* MimePgpe_generate(void* output_closure) {
+static char* MimePgpe_generate(MimeClosure output_closure) {
const char htmlMsg[] = "GEN MSG";
char* msg = (char*)PR_MALLOC(strlen(htmlMsg) + 1);
if (msg) PL_strcpy(msg, htmlMsg);
@@ -232,8 +260,12 @@
return msg;
}
-static void MimePgpe_free(void* output_closure) {
- MimePgpeData* data = (MimePgpeData*)output_closure;
+static void MimePgpe_free(MimeClosure output_closure) {
+ MimePgpeData* data = output_closure.AsMimePgpeData();
+ if (!data) {
+ return;
+ }
+
if (data->mimeDecrypt) {
data->mimeDecrypt->RemoveMimeCallback();
data->mimeDecrypt = nullptr;
@@ -280,7 +312,7 @@
mOutputWasRemoved(false),
#endif
mOutputFun(nullptr),
- mOutputClosure(nullptr),
+ mOutputClosure(MimeClosure::zero()),
mLoadFlags(LOAD_NORMAL),
mCancelStatus(NS_OK),
mStreamOffset(0),
@@ -293,12 +325,13 @@
NS_IMETHODIMP
nsPgpMimeProxy::SetMimeCallback(MimeDecodeCallbackFun outputFun,
- void* outputClosure, nsIURI* myUri,
- nsIMailChannel* mailChannel) {
+ int32_t outputClosureType, void* outputClosure,
+ nsIURI* myUri, nsIMailChannel* mailChannel) {
if (!outputFun || !outputClosure) return NS_ERROR_NULL_POINTER;
mOutputFun = outputFun;
- mOutputClosure = outputClosure;
+ mOutputClosure =
+ MimeClosure((MimeClosure::ClosureType)outputClosureType, outputClosure);
mInitialized = true;
mMessageURI = myUri;
mMailChannel = mailChannel;
@@ -314,7 +347,7 @@
NS_IMETHODIMP
nsPgpMimeProxy::RemoveMimeCallback() {
mOutputFun = nullptr;
- mOutputClosure = nullptr;
+ mOutputClosure = MimeClosure::zero();
#ifdef DEBUG
mOutputWasRemoved = true;
#endif
@@ -373,7 +406,8 @@
"