From a216703cec2237ddb1ef1f994163395f27bd2486 Mon Sep 17 00:00:00 2001
From: Anton Georgiev <anto.georgiev@gmail.com>
Date: Wed, 21 Nov 2018 13:46:13 +0000
Subject: [PATCH] avoid race condition when detecting user join from outside
 iframe

---
 bbb-api-demo/src/main/webapp/demo_iframe.jsp         | 12 ++++++++++--
 .../ui/components/audio/audio-controls/container.jsx |  9 +++++----
 2 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/bbb-api-demo/src/main/webapp/demo_iframe.jsp b/bbb-api-demo/src/main/webapp/demo_iframe.jsp
index 3cd02f6fda..e8aafb61d2 100644
--- a/bbb-api-demo/src/main/webapp/demo_iframe.jsp
+++ b/bbb-api-demo/src/main/webapp/demo_iframe.jsp
@@ -133,10 +133,11 @@ muteButton.id = 'muteButton';
 
 function getInitialState() {
   document.getElementById('client-content').contentWindow.postMessage('c_recording_status', '*');
-  document.getElementById('client-content').contentWindow.postMessage('c_mute_status', '*');
+  document.getElementById('client-content').contentWindow.postMessage('get_audio_joined_status', '*');
 }
 
 function handleMessage(e) {
+  let neverJoinedAudio = true;
   switch (e) {
     case 'readyToConnect': {
       // get initial state
@@ -160,11 +161,18 @@ function handleMessage(e) {
     case 'notInAudio': {
       muteButton.innerHTML = 'Not in audio';
       document.getElementById('muteButton').disabled = true;
+      if (neverJoinedAudio) {
+        // poll every 1 sec to check if we joined audio
+        setTimeout(function(){
+          document.getElementById('client-content').contentWindow.postMessage('get_audio_joined_status', '*');
+        }, 1000);}
       break;
     }
     case 'joinedAudio': {
+      neverJoinedAudio = false;
       muteButton.innerHTML = '';
-      document.getElementById('muteButton').disabled = false; getInitialState();
+      document.getElementById('muteButton').disabled = false;
+      document.getElementById('client-content').contentWindow.postMessage('c_mute_status', '*');
       break;
     }
     default: console.log('neither', { e });
diff --git a/bigbluebutton-html5/imports/ui/components/audio/audio-controls/container.jsx b/bigbluebutton-html5/imports/ui/components/audio/audio-controls/container.jsx
index b2334ede83..6e7124fad1 100644
--- a/bigbluebutton-html5/imports/ui/components/audio/audio-controls/container.jsx
+++ b/bigbluebutton-html5/imports/ui/components/audio/audio-controls/container.jsx
@@ -15,11 +15,12 @@ const processToggleMuteFromOutside = (e) => {
       makeCall('toggleSelfVoice');
       break;
     }
+    case 'get_audio_joined_status': {
+      const audioJoinedState = AudioManager.isConnected ? 'joinedAudio' : 'notInAudio';
+      this.window.parent.postMessage({ response: audioJoinedState }, '*');
+      break;
+    }
     case 'c_mute_status': {
-      if (!AudioManager.isUsingAudio()) {
-        this.window.parent.postMessage({ response: 'notInAudio' }, '*');
-        return;
-      }
       const muteState = AudioManager.isMuted ? 'selfMuted' : 'selfUnmuted';
       this.window.parent.postMessage({ response: muteState }, '*');
       break;
-- 
GitLab