From c5012b8f5b22edbe79d08b26e2b808538a663cf0 Mon Sep 17 00:00:00 2001 From: tamarafinogina Date: Wed, 11 Feb 2026 18:01:57 +0100 Subject: [PATCH 01/11] add logs to see why getBoundingClientRect fails --- modules/UI/videolayout/VideoContainer.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/UI/videolayout/VideoContainer.js b/modules/UI/videolayout/VideoContainer.js index d9f31bb5a24c..e3c13a17c58a 100644 --- a/modules/UI/videolayout/VideoContainer.js +++ b/modules/UI/videolayout/VideoContainer.js @@ -400,6 +400,8 @@ export class VideoContainer extends LargeContainer { * @returns {void} */ positionRemoteStatusMessages() { + console.log('TEST: this.remoteConnectionMessage:', this.remoteConnectionMessage); + console.log('TEST: this.remotePresenceMessage:', this.remotePresenceMessage); this._positionParticipantStatus(this.remoteConnectionMessage); this._positionParticipantStatus(this.remotePresenceMessage); } @@ -419,6 +421,7 @@ export class VideoContainer extends LargeContainer { element.style.top = avatarImage.top + avatarImage.height + 10; } } else { + console.log('TEST: _positionParticipantStatus:', element); const height = element.getBoundingClientRect().height; const parentHeight = element.parentElement.getBoundingClientRect()?.height; From 128aba38d095493c51dff9dad3a8a03b6f94e4c4 Mon Sep 17 00:00:00 2001 From: tamarafinogina Date: Wed, 11 Feb 2026 18:15:14 +0100 Subject: [PATCH 02/11] fix 2 error due to null --- modules/UI/videolayout/VideoContainer.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/modules/UI/videolayout/VideoContainer.js b/modules/UI/videolayout/VideoContainer.js index e3c13a17c58a..8a563b526cd9 100644 --- a/modules/UI/videolayout/VideoContainer.js +++ b/modules/UI/videolayout/VideoContainer.js @@ -400,11 +400,13 @@ export class VideoContainer extends LargeContainer { * @returns {void} */ positionRemoteStatusMessages() { - console.log('TEST: this.remoteConnectionMessage:', this.remoteConnectionMessage); - console.log('TEST: this.remotePresenceMessage:', this.remotePresenceMessage); + if (this.remoteConnectionMessage) { this._positionParticipantStatus(this.remoteConnectionMessage); + } + if (this.remotePresenceMessage) { this._positionParticipantStatus(this.remotePresenceMessage); } + } /** * Modifies the position of the passed in jQuery object so it displays @@ -421,7 +423,6 @@ export class VideoContainer extends LargeContainer { element.style.top = avatarImage.top + avatarImage.height + 10; } } else { - console.log('TEST: _positionParticipantStatus:', element); const height = element.getBoundingClientRect().height; const parentHeight = element.parentElement.getBoundingClientRect()?.height; @@ -618,6 +619,10 @@ export class VideoContainer extends LargeContainer { * @param {boolean} show */ showAvatar(show) { + if (!this.avatar) { + logger.warn('Avatar not found, cannot update visibility'); + return; + } this.avatar.style.visibility = show ? 'visible' : 'hidden'; this.avatarDisplayed = show; From 525347d7a27643dc3cac2c9cb6ab2a58e3190b0c Mon Sep 17 00:00:00 2001 From: tamarafinogina Date: Wed, 11 Feb 2026 18:26:44 +0100 Subject: [PATCH 03/11] adjust error messages --- lang/main-es.json | 4 ++-- lang/main.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lang/main-es.json b/lang/main-es.json index deaf52d65984..ab1424be594c 100644 --- a/lang/main-es.json +++ b/lang/main-es.json @@ -954,8 +954,8 @@ "videoUnmuteBlockedTitle": "¡Desactivar cámara y compartir pantalla bloqueados!", "viewLobby": "Ver lobby", "waitingParticipants": "{{waitingParticipants}} personas", - "encryptionKeySyncFailed": "La sincronización de la clave de cifrado ha fallado. Se recomienda salir de la reunión y vuelva a unirse para restaurar la comunicación segura.", - "encryptionKeySyncFailedTitle": "Error de Sincronización de Cifrado", + "encryptionKeySyncFailed": "El establecimiento de la sesión segura ha fallado. Asegúrese de que todos los participantes tengan una conexión a Internet confiable.", + "encryptionKeySyncFailedTitle": "Error de Establecimiento de la Sesión", "cryptoFailedTitle": "La operación criptográfica ha fallado", "cryptoFailed": "La operación criptográfica ha fallado. No puede acceder al video ni al audio de la reunión. Se recomienda reiniciar el navegador. Si eres el organizador de la reunión, vuelva a crearla.", "encryptionKeySyncRestored": "La sincronización de claves para el cifrado se ha restaurado con éxito. Su comunicación segura está ahora activa.", diff --git a/lang/main.json b/lang/main.json index 683af4d8bdce..6ef59a870b2c 100644 --- a/lang/main.json +++ b/lang/main.json @@ -1096,8 +1096,8 @@ "waitingVisitorsTitle": "The meeting is not live yet!", "whiteboardLimitDescription": "Please save your progress, as the user limit will soon be reached and the whiteboard will close.", "whiteboardLimitTitle": "Whiteboard usage", - "encryptionKeySyncFailed": "The encryption key synchronization has failed. It is recommended that you leave the meeting and rejoin to restore secure communication.", - "encryptionKeySyncFailedTitle": "Encryption Sync Failed", + "encryptionKeySyncFailed": "The secure session establishement has failed. Please ensure that all participants have a reliable internet connection.", + "encryptionKeySyncFailedTitle": "Session Establishment Failed", "cryptoFailedTitle": "Cryptographic operation failed", "cryptoFailed": "Cryptographic operation has failed. You cannot access video or audio of the meeting. It is recommended that you restart the browser. If you are the meeting organizer, recreate it.", "encryptionKeySyncRestored": "The encryption key synchronization has been successfully restored. Your secure communication is now active.", From f2f027a54e4473e2d5060caf6d6fe621c1de23f2 Mon Sep 17 00:00:00 2001 From: tamarafinogina Date: Wed, 11 Feb 2026 18:37:24 +0100 Subject: [PATCH 04/11] re-write function --- react/features/base/media/components/AbstractAudio.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/react/features/base/media/components/AbstractAudio.ts b/react/features/base/media/components/AbstractAudio.ts index ba849dbd4075..95b18ade91e3 100644 --- a/react/features/base/media/components/AbstractAudio.ts +++ b/react/features/base/media/components/AbstractAudio.ts @@ -108,10 +108,10 @@ export default class AbstractAudio extends Component { * @returns {void} */ setSinkId(sinkId: string) { - this._audioElementImpl - && typeof this._audioElementImpl.setSinkId === 'function' - && this._audioElementImpl.setSinkId(sinkId) + if (this._audioElementImpl && typeof this._audioElementImpl.setSinkId === 'function') { + this._audioElementImpl.setSinkId(sinkId) .catch(error => logger.error('Error setting sink', error)); + } } /** From 260b555732cf6179efe5ea0425def9e93ed75e6b Mon Sep 17 00:00:00 2001 From: tamarafinogina Date: Wed, 11 Feb 2026 18:40:22 +0100 Subject: [PATCH 05/11] add null check --- modules/UI/videolayout/VideoContainer.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/UI/videolayout/VideoContainer.js b/modules/UI/videolayout/VideoContainer.js index 8a563b526cd9..0991c212cd89 100644 --- a/modules/UI/videolayout/VideoContainer.js +++ b/modules/UI/videolayout/VideoContainer.js @@ -634,6 +634,12 @@ export class VideoContainer extends LargeContainer { */ show() { return new Promise(resolve => { + if (!this.wrapperParent) { + logger.warn('Wrapper parent not found, cannot show'); + resolve(); + return; + } + this.wrapperParent.style.visibility = 'visible'; this.wrapperParent.classList.remove('animatedFadeOut'); this.wrapperParent.classList.add('animatedFadeIn'); From 88d5143a5c5c27aed95a5cc2744e2876ddb42ea2 Mon Sep 17 00:00:00 2001 From: tamarafinogina Date: Wed, 11 Feb 2026 18:01:57 +0100 Subject: [PATCH 06/11] add logs to see why getBoundingClientRect fails --- modules/UI/videolayout/VideoContainer.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/UI/videolayout/VideoContainer.js b/modules/UI/videolayout/VideoContainer.js index d9f31bb5a24c..e3c13a17c58a 100644 --- a/modules/UI/videolayout/VideoContainer.js +++ b/modules/UI/videolayout/VideoContainer.js @@ -400,6 +400,8 @@ export class VideoContainer extends LargeContainer { * @returns {void} */ positionRemoteStatusMessages() { + console.log('TEST: this.remoteConnectionMessage:', this.remoteConnectionMessage); + console.log('TEST: this.remotePresenceMessage:', this.remotePresenceMessage); this._positionParticipantStatus(this.remoteConnectionMessage); this._positionParticipantStatus(this.remotePresenceMessage); } @@ -419,6 +421,7 @@ export class VideoContainer extends LargeContainer { element.style.top = avatarImage.top + avatarImage.height + 10; } } else { + console.log('TEST: _positionParticipantStatus:', element); const height = element.getBoundingClientRect().height; const parentHeight = element.parentElement.getBoundingClientRect()?.height; From c862f2e79eb94438ae527895f2017fc768379b3f Mon Sep 17 00:00:00 2001 From: tamarafinogina Date: Wed, 11 Feb 2026 18:15:14 +0100 Subject: [PATCH 07/11] fix 2 error due to null --- modules/UI/videolayout/VideoContainer.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/modules/UI/videolayout/VideoContainer.js b/modules/UI/videolayout/VideoContainer.js index e3c13a17c58a..8a563b526cd9 100644 --- a/modules/UI/videolayout/VideoContainer.js +++ b/modules/UI/videolayout/VideoContainer.js @@ -400,11 +400,13 @@ export class VideoContainer extends LargeContainer { * @returns {void} */ positionRemoteStatusMessages() { - console.log('TEST: this.remoteConnectionMessage:', this.remoteConnectionMessage); - console.log('TEST: this.remotePresenceMessage:', this.remotePresenceMessage); + if (this.remoteConnectionMessage) { this._positionParticipantStatus(this.remoteConnectionMessage); + } + if (this.remotePresenceMessage) { this._positionParticipantStatus(this.remotePresenceMessage); } + } /** * Modifies the position of the passed in jQuery object so it displays @@ -421,7 +423,6 @@ export class VideoContainer extends LargeContainer { element.style.top = avatarImage.top + avatarImage.height + 10; } } else { - console.log('TEST: _positionParticipantStatus:', element); const height = element.getBoundingClientRect().height; const parentHeight = element.parentElement.getBoundingClientRect()?.height; @@ -618,6 +619,10 @@ export class VideoContainer extends LargeContainer { * @param {boolean} show */ showAvatar(show) { + if (!this.avatar) { + logger.warn('Avatar not found, cannot update visibility'); + return; + } this.avatar.style.visibility = show ? 'visible' : 'hidden'; this.avatarDisplayed = show; From f4a4692ce373cca0d9dbb7124e5acfa5810fba2c Mon Sep 17 00:00:00 2001 From: tamarafinogina Date: Wed, 11 Feb 2026 18:26:44 +0100 Subject: [PATCH 08/11] adjust error messages --- lang/main-es.json | 4 ++-- lang/main.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lang/main-es.json b/lang/main-es.json index deaf52d65984..ab1424be594c 100644 --- a/lang/main-es.json +++ b/lang/main-es.json @@ -954,8 +954,8 @@ "videoUnmuteBlockedTitle": "¡Desactivar cámara y compartir pantalla bloqueados!", "viewLobby": "Ver lobby", "waitingParticipants": "{{waitingParticipants}} personas", - "encryptionKeySyncFailed": "La sincronización de la clave de cifrado ha fallado. Se recomienda salir de la reunión y vuelva a unirse para restaurar la comunicación segura.", - "encryptionKeySyncFailedTitle": "Error de Sincronización de Cifrado", + "encryptionKeySyncFailed": "El establecimiento de la sesión segura ha fallado. Asegúrese de que todos los participantes tengan una conexión a Internet confiable.", + "encryptionKeySyncFailedTitle": "Error de Establecimiento de la Sesión", "cryptoFailedTitle": "La operación criptográfica ha fallado", "cryptoFailed": "La operación criptográfica ha fallado. No puede acceder al video ni al audio de la reunión. Se recomienda reiniciar el navegador. Si eres el organizador de la reunión, vuelva a crearla.", "encryptionKeySyncRestored": "La sincronización de claves para el cifrado se ha restaurado con éxito. Su comunicación segura está ahora activa.", diff --git a/lang/main.json b/lang/main.json index db2e40dde604..daf7fe47b042 100644 --- a/lang/main.json +++ b/lang/main.json @@ -1100,8 +1100,8 @@ "waitingVisitorsTitle": "The meeting is not live yet!", "whiteboardLimitDescription": "Please save your progress, as the user limit will soon be reached and the whiteboard will close.", "whiteboardLimitTitle": "Whiteboard usage", - "encryptionKeySyncFailed": "The encryption key synchronization has failed. It is recommended that you leave the meeting and rejoin to restore secure communication.", - "encryptionKeySyncFailedTitle": "Encryption Sync Failed", + "encryptionKeySyncFailed": "The secure session establishement has failed. Please ensure that all participants have a reliable internet connection.", + "encryptionKeySyncFailedTitle": "Session Establishment Failed", "cryptoFailedTitle": "Cryptographic operation failed", "cryptoFailed": "Cryptographic operation has failed. You cannot access video or audio of the meeting. It is recommended that you restart the browser. If you are the meeting organizer, recreate it.", "encryptionKeySyncRestored": "The encryption key synchronization has been successfully restored. Your secure communication is now active.", From a9fc42e9093bd7ed09e86b289f2193ad05d865ff Mon Sep 17 00:00:00 2001 From: tamarafinogina Date: Wed, 11 Feb 2026 18:37:24 +0100 Subject: [PATCH 09/11] re-write function --- react/features/base/media/components/AbstractAudio.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/react/features/base/media/components/AbstractAudio.ts b/react/features/base/media/components/AbstractAudio.ts index ba849dbd4075..95b18ade91e3 100644 --- a/react/features/base/media/components/AbstractAudio.ts +++ b/react/features/base/media/components/AbstractAudio.ts @@ -108,10 +108,10 @@ export default class AbstractAudio extends Component { * @returns {void} */ setSinkId(sinkId: string) { - this._audioElementImpl - && typeof this._audioElementImpl.setSinkId === 'function' - && this._audioElementImpl.setSinkId(sinkId) + if (this._audioElementImpl && typeof this._audioElementImpl.setSinkId === 'function') { + this._audioElementImpl.setSinkId(sinkId) .catch(error => logger.error('Error setting sink', error)); + } } /** From ca98e6dfdeece3ee0b3a5f609fef8f3dc0a1ec1c Mon Sep 17 00:00:00 2001 From: tamarafinogina Date: Wed, 11 Feb 2026 18:40:22 +0100 Subject: [PATCH 10/11] add null check --- modules/UI/videolayout/VideoContainer.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/UI/videolayout/VideoContainer.js b/modules/UI/videolayout/VideoContainer.js index 8a563b526cd9..0991c212cd89 100644 --- a/modules/UI/videolayout/VideoContainer.js +++ b/modules/UI/videolayout/VideoContainer.js @@ -634,6 +634,12 @@ export class VideoContainer extends LargeContainer { */ show() { return new Promise(resolve => { + if (!this.wrapperParent) { + logger.warn('Wrapper parent not found, cannot show'); + resolve(); + return; + } + this.wrapperParent.style.visibility = 'visible'; this.wrapperParent.classList.remove('animatedFadeOut'); this.wrapperParent.classList.add('animatedFadeIn'); From 1dbbc45a449d3a05983f0d32ed52ea230f509c02 Mon Sep 17 00:00:00 2001 From: tamarafinogina Date: Wed, 11 Feb 2026 18:56:51 +0100 Subject: [PATCH 11/11] add null check in hide --- modules/UI/videolayout/VideoContainer.js | 5 +++++ react/features/base/media/components/AbstractAudio.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/UI/videolayout/VideoContainer.js b/modules/UI/videolayout/VideoContainer.js index 0991c212cd89..ad251b044939 100644 --- a/modules/UI/videolayout/VideoContainer.js +++ b/modules/UI/videolayout/VideoContainer.js @@ -660,6 +660,11 @@ export class VideoContainer extends LargeContainer { this.showAvatar(false); return new Promise(resolve => { + if (!this.wrapperParent) { + logger.warn('Wrapper parent not found, cannot hide'); + resolve(); + return; + } this.wrapperParent.classList.remove('animatedFadeIn'); this.wrapperParent.classList.add('animatedFadeOut'); setTimeout(() => { diff --git a/react/features/base/media/components/AbstractAudio.ts b/react/features/base/media/components/AbstractAudio.ts index 95b18ade91e3..0f794cca0129 100644 --- a/react/features/base/media/components/AbstractAudio.ts +++ b/react/features/base/media/components/AbstractAudio.ts @@ -110,7 +110,7 @@ export default class AbstractAudio extends Component { setSinkId(sinkId: string) { if (this._audioElementImpl && typeof this._audioElementImpl.setSinkId === 'function') { this._audioElementImpl.setSinkId(sinkId) - .catch(error => logger.error('Error setting sink', error)); + .catch(error => logger.error(`Error setting sink ID ${sinkId}: ${error}`)); } }