From b87f1dc7fbc264296c91984bb13322a28a6473a9 Mon Sep 17 00:00:00 2001 From: austinpower1258 Date: Sun, 21 Jun 2026 20:42:40 -0700 Subject: [PATCH] Fix audio indicator audibility signal --- .../BrowserMediaPlaybackMessageHandler.swift | 5 +- .../Panels/BrowserMediaPlaybackReport.swift | 2 + .../Panels/BrowserPanel+MediaPlayback.swift | 111 ++++++++++++++---- Sources/Panels/BrowserPanel.swift | 28 ++--- cmux.xcodeproj/project.pbxproj | 4 + ...owserMediaPlaybackAudioActivityTests.swift | 37 ++++++ 6 files changed, 149 insertions(+), 38 deletions(-) create mode 100644 cmuxTests/BrowserMediaPlaybackAudioActivityTests.swift diff --git a/Sources/Panels/BrowserMediaPlaybackMessageHandler.swift b/Sources/Panels/BrowserMediaPlaybackMessageHandler.swift index e12a5480974d..a677694858bd 100644 --- a/Sources/Panels/BrowserMediaPlaybackMessageHandler.swift +++ b/Sources/Panels/BrowserMediaPlaybackMessageHandler.swift @@ -1,7 +1,7 @@ import Foundation import WebKit -/// Receives `{ frameID, playing }` from the injected media-playback hook and +/// Receives `{ frameID, playing, audible }` from the injected media-playback hook and /// forwards it to the owning ``BrowserPanel`` on the main actor. /// /// Mirrors ``ReactGrabMessageHandler``: a thin `NSObject` adapter so the panel @@ -20,7 +20,8 @@ final class BrowserMediaPlaybackMessageHandler: NSObject, WKScriptMessageHandler guard let body = message.body as? [String: Any], let frameID = body["frameID"] as? String, let playing = body["playing"] as? Bool else { return } - let report = BrowserMediaPlaybackReport(frameID: frameID, isPlaying: playing) + let audible = body["audible"] as? Bool ?? false + let report = BrowserMediaPlaybackReport(frameID: frameID, isPlaying: playing, isAudible: audible) // WebKit delivers script messages on the main thread. Apply the report // synchronously instead of hopping through a `Task` so it lands in // WebKit's delivery order relative to navigation callbacks: a report diff --git a/Sources/Panels/BrowserMediaPlaybackReport.swift b/Sources/Panels/BrowserMediaPlaybackReport.swift index 8ba7b5976030..69536ef14904 100644 --- a/Sources/Panels/BrowserMediaPlaybackReport.swift +++ b/Sources/Panels/BrowserMediaPlaybackReport.swift @@ -7,4 +7,6 @@ struct BrowserMediaPlaybackReport: Sendable { let frameID: String /// Whether that frame currently has any actively-playing media. let isPlaying: Bool + /// Whether that frame currently has an unmuted, non-zero-volume audio source. + let isAudible: Bool } diff --git a/Sources/Panels/BrowserPanel+MediaPlayback.swift b/Sources/Panels/BrowserPanel+MediaPlayback.swift index 94fcce4e0751..d7924065040a 100644 --- a/Sources/Panels/BrowserPanel+MediaPlayback.swift +++ b/Sources/Panels/BrowserPanel+MediaPlayback.swift @@ -16,7 +16,7 @@ extension BrowserPanel { static let mediaPlaybackContentWorld = WKContentWorld.world(name: mediaPlaybackMessageHandlerName) /// Injected document-start hook that reports whether the current frame has - /// any actively-playing `