From 76dc50b05289301c643d742e83abe04a43dba200 Mon Sep 17 00:00:00 2001 From: Slowlife01 Date: Mon, 14 Apr 2025 00:24:24 +0700 Subject: [PATCH] fix(MediaController): more accurate sharing state --- src/browser/actors/WebRTCParent-sys-mjs.patch | 12 ++++ .../zen-components/ZenMediaController.mjs | 62 +++++++------------ 2 files changed, 33 insertions(+), 41 deletions(-) create mode 100644 src/browser/actors/WebRTCParent-sys-mjs.patch diff --git a/src/browser/actors/WebRTCParent-sys-mjs.patch b/src/browser/actors/WebRTCParent-sys-mjs.patch new file mode 100644 index 000000000..57c3a0c1f --- /dev/null +++ b/src/browser/actors/WebRTCParent-sys-mjs.patch @@ -0,0 +1,12 @@ +diff --git a/browser/actors/WebRTCParent.sys.mjs b/browser/actors/WebRTCParent.sys.mjs +index be66de4a1ef044341c2e1d6953806550897df45a..ff6ef3511076b25e00ca4d0189f666ec7aa94fe8 100644 +--- a/browser/actors/WebRTCParent.sys.mjs ++++ b/browser/actors/WebRTCParent.sys.mjs +@@ -152,6 +152,7 @@ export class WebRTCParent extends JSWindowActorParent { + + let tabbrowser = browser.ownerGlobal.gBrowser; + if (tabbrowser) { ++ browser.ownerGlobal.gZenMediaController.updateMediaSharing(state); + tabbrowser.updateBrowserSharing(browser, { + webRTC: state, + }); diff --git a/src/browser/base/zen-components/ZenMediaController.mjs b/src/browser/base/zen-components/ZenMediaController.mjs index 83f9d703b..119bdb5f8 100644 --- a/src/browser/base/zen-components/ZenMediaController.mjs +++ b/src/browser/base/zen-components/ZenMediaController.mjs @@ -118,7 +118,9 @@ }); const onTabDiscardedOrClosed = this.onTabDiscardedOrClosed.bind(this); + window.addEventListener('TabClose', onTabDiscardedOrClosed); + window.addEventListener('TabBrowserDiscarded', onTabDiscardedOrClosed); window.addEventListener('DOMAudioPlaybackStarted', (event) => { setTimeout(() => { @@ -138,24 +140,19 @@ }); window.addEventListener('DOMAudioPlaybackStopped', () => this.updateMuteState()); - window.webrtcUI.on('peer-request-allowed', this._onMediaShareStart.bind(this)); } onTabDiscardedOrClosed(event) { const { linkedBrowser } = event.target; + const isCurrentBrowser = linkedBrowser?.browserId === this._currentBrowser?.browserId; - if (linkedBrowser?.browserId === this._currentBrowser?.browserId) { - this.deinitMediaSharingControls(linkedBrowser); + if (isCurrentBrowser) { + this.isSharing = false; this.hideMediaControls(); } if (linkedBrowser?.browsingContext.mediaController) { - this.deinitMediaController( - linkedBrowser.browsingContext.mediaController, - true, - linkedBrowser.browserId === this._currentBrowser?.browserId, - true - ); + this.deinitMediaController(linkedBrowser.browsingContext.mediaController, true, isCurrentBrowser, true); } } @@ -191,7 +188,7 @@ } set isSharing(value) { - if (this._currentBrowser && !value) { + if (this._currentBrowser?.browsingContext && !value) { const webRTC = this._currentBrowser.browsingContext.currentWindowGlobal.getActor('WebRTC'); webRTC.sendAsyncMessage('webrtc:UnmuteMicrophone'); webRTC.sendAsyncMessage('webrtc:UnmuteCamera'); @@ -353,52 +350,35 @@ this.mediaArtist.textContent = ''; this.showMediaControls(); - tab.addEventListener('TabAttrModified', this._onTabAttrModified.bind(this)); } } - deinitMediaSharingControls(browser) { - const tab = window.gBrowser.getTabForBrowser(browser); - if (tab) tab.removeEventListener('TabAttrModified', this._onTabAttrModified.bind(this)); - - this.isSharing = false; - this._currentBrowser = null; - } - - _onTabAttrModified(event) { - const { changed } = event.detail; - const { linkedBrowser } = event.target; - - if (changed.includes('sharing') && !linkedBrowser.browsingContext.currentWindowGlobal.hasActivePeerConnections()) { - if (this._currentBrowser?.browserId === linkedBrowser.browserId) { - event.target.removeEventListener('TabAttrModified', this._onTabAttrModified.bind(this)); - this.deinitMediaSharingControls(linkedBrowser); - - this.hideMediaControls(); - this.switchController(true); - } - } - } - - _onMediaShareStart(event) { - const { innerWindowID } = event; + updateMediaSharing(data) { + const { windowId, showCameraIndicator, showMicrophoneIndicator } = data; for (const browser of window.gBrowser.browsers) { - if (browser.innerWindowID === innerWindowID) { + const isMatch = browser.innerWindowID === windowId; + + if (!isMatch) continue; + if (showCameraIndicator || showMicrophoneIndicator) { const webRTC = browser.browsingContext.currentWindowGlobal.getActor('WebRTC'); webRTC.sendAsyncMessage('webrtc:UnmuteMicrophone'); webRTC.sendAsyncMessage('webrtc:UnmuteCamera'); - if (this._currentBrowser) this.deinitMediaSharingControls(this._currentBrowser); + if (this._currentBrowser) this.isSharing = false; if (this._currentMediaController) { this._currentMediaController.pause(); this.deinitMediaController(this._currentMediaController, true, true).then(() => this.activateMediaDeviceControls(browser) ); } else this.activateMediaDeviceControls(browser); - - break; + } else if (this.isSharing && !(showCameraIndicator || showMicrophoneIndicator)) { + this.isSharing = false; + this._currentBrowser = null; + this.hideMediaControls(); } + + break; } } @@ -625,7 +605,7 @@ if (this._currentMediaController) { this._currentMediaController.pause(); this.deinitMediaController(this._currentMediaController); - } else if (this.isSharing) this.deinitMediaSharingControls(this._currentBrowser); + } else if (this.isSharing) this.isSharing = false; this.hideMediaControls(); this.switchController(true);