Bug 1120222 - Set AudioSink name to title of MediaElement's parent r=padenot

Differential Revision: https://phabricator.services.mozilla.com/D93462
This commit is contained in:
Brendan Early
2021-04-19 15:17:26 +00:00
parent 07b83bde28
commit 5725b6792c
16 changed files with 153 additions and 0 deletions

View File

@@ -4119,6 +4119,49 @@ class HTMLMediaElement::ShutdownObserver : public nsIObserver {
NS_IMPL_ISUPPORTS(HTMLMediaElement::ShutdownObserver, nsIObserver)
class HTMLMediaElement::TitleChangeObserver final : public nsIObserver {
public:
NS_DECL_ISUPPORTS
explicit TitleChangeObserver(HTMLMediaElement* aElement)
: mElement(aElement) {
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aElement);
}
NS_IMETHOD Observe(nsISupports*, const char* aTopic,
const char16_t*) override {
if (mElement) {
mElement->UpdateStreamName();
}
return NS_OK;
}
void Subscribe() {
nsCOMPtr<nsIObserverService> observerService =
mozilla::services::GetObserverService();
if (observerService) {
observerService->AddObserver(this, "document-title-changed", false);
}
}
void Unsubscribe() {
nsCOMPtr<nsIObserverService> observerService =
mozilla::services::GetObserverService();
if (observerService) {
observerService->RemoveObserver(this, "document-title-changed");
}
}
private:
~TitleChangeObserver() = default;
WeakPtr<HTMLMediaElement> mElement;
};
NS_IMPL_ISUPPORTS(HTMLMediaElement::TitleChangeObserver, nsIObserver)
HTMLMediaElement::HTMLMediaElement(
already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo)
: nsGenericHTMLElement(std::move(aNodeInfo)),
@@ -4128,6 +4171,7 @@ HTMLMediaElement::HTMLMediaElement(
mAbstractMainThread(
OwnerDoc()->AbstractMainThreadFor(TaskCategory::Other)),
mShutdownObserver(new ShutdownObserver),
mTitleChangeObserver(new TitleChangeObserver(this)),
mEventBlocker(new EventBlocker(this)),
mPlayed(new TimeRanges(ToSupports(OwnerDoc()))),
mTracksCaptured(nullptr, "HTMLMediaElement::mTracksCaptured"),
@@ -4209,6 +4253,8 @@ HTMLMediaElement::~HTMLMediaElement() {
mShutdownObserver->Unsubscribe();
mTitleChangeObserver->Unsubscribe();
if (mVideoFrameContainer) {
mVideoFrameContainer->ForgetElement();
}
@@ -7134,6 +7180,13 @@ void HTMLMediaElement::SetMediaInfo(const MediaInfo& aInfo) {
if ((aInfo.HasAudio() != oldHasAudio) && mResumeDelayedPlaybackAgent) {
mResumeDelayedPlaybackAgent->UpdateAudibleState(this, IsAudible());
}
nsILoadContext* loadContext = OwnerDoc()->GetLoadContext();
if (HasAudio() && loadContext && !loadContext->UsePrivateBrowsing()) {
mTitleChangeObserver->Subscribe();
UpdateStreamName();
} else {
mTitleChangeObserver->Unsubscribe();
}
if (mAudioChannelWrapper) {
mAudioChannelWrapper->AudioCaptureTrackChangeIfNeeded();
}
@@ -7622,6 +7675,17 @@ void HTMLMediaElement::StartMediaControlKeyListenerIfNeeded() {
mMediaControlKeyListener->Start();
}
void HTMLMediaElement::UpdateStreamName() {
MOZ_ASSERT(NS_IsMainThread());
nsAutoString aTitle;
OwnerDoc()->GetTitle(aTitle);
if (mDecoder) {
mDecoder->SetStreamName(aTitle);
}
}
void HTMLMediaElement::SetSecondaryMediaStreamRenderer(
VideoFrameContainer* aContainer,
FirstFrameVideoOutput* aFirstFrameOutput /* = nullptr */) {