Bug 1653390 - part4 : always hold a MediaControlKeyListener until media dies. r=bryce

It seems no much benefit to create `MediaControlKeyListener` lazily, we should create it in the start and destroy it in the end so that we don't need to check if `mMediaControlKeyListener` exists or not when we want to check if the listener starts.

Differential Revision: https://phabricator.services.mozilla.com/D84116
This commit is contained in:
alwu
2020-07-23 21:33:23 +00:00
parent 974b4c3cfd
commit 022d0f80fd

View File

@@ -2007,7 +2007,6 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(HTMLMediaElement,
NS_IMPL_CYCLE_COLLECTION_UNLINK(mSetMediaKeysDOMPromise)
if (tmp->mMediaControlKeyListener) {
tmp->StopListeningMediaControlKeyIfNeeded();
tmp->mMediaControlKeyListener = nullptr;
}
NS_IMPL_CYCLE_COLLECTION_UNLINK_WEAK_PTR
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
@@ -4155,7 +4154,8 @@ HTMLMediaElement::HTMLMediaElement(
mErrorSink(new ErrorSink(this)),
mAudioChannelWrapper(new AudioChannelAgentCallback(this)),
mSink(std::pair(nsString(), RefPtr<AudioDeviceInfo>())),
mShowPoster(IsVideo()) {
mShowPoster(IsVideo()),
mMediaControlKeyListener(new MediaControlKeyListener(this)) {
MOZ_ASSERT(mMainThreadEventTarget);
MOZ_ASSERT(mAbstractMainThread);
// Please don't add anything to this constructor or the initialization
@@ -4756,10 +4756,7 @@ nsresult HTMLMediaElement::BindToTree(BindContext& aContext, nsINode& aParent) {
}
NotifyDecoderActivityChanges();
if (mMediaControlKeyListener) {
mMediaControlKeyListener->UpdateOwnerBrowsingContextIfNeeded();
}
mMediaControlKeyListener->UpdateOwnerBrowsingContextIfNeeded();
return rv;
}
@@ -7400,9 +7397,7 @@ void HTMLMediaElement::NotifyAudioPlaybackChanged(
if (mAudioChannelWrapper) {
mAudioChannelWrapper->NotifyAudioPlaybackChanged(aReason);
}
if (mMediaControlKeyListener) {
mMediaControlKeyListener->UpdateMediaAudibleState(IsAudible());
}
mMediaControlKeyListener->UpdateMediaAudibleState(IsAudible());
// only request wake lock for audible media.
UpdateWakeLock();
}
@@ -7853,7 +7848,7 @@ void HTMLMediaElement::ClearResumeDelayedMediaPlaybackAgentIfNeeded() {
}
void HTMLMediaElement::NotifyMediaControlPlaybackStateChanged() {
if (!mMediaControlKeyListener || !mMediaControlKeyListener->IsStarted()) {
if (!mMediaControlKeyListener->IsStarted()) {
return;
}
if (mPaused) {
@@ -7874,10 +7869,6 @@ void HTMLMediaElement::StartListeningMediaControlKeyIfNeeded() {
return;
}
if (!mMediaControlKeyListener) {
mMediaControlKeyListener = new MediaControlKeyListener(this);
}
if (mMediaControlKeyListener->IsStarted() ||
!mMediaControlKeyListener->Start()) {
return;
@@ -7885,14 +7876,14 @@ void HTMLMediaElement::StartListeningMediaControlKeyIfNeeded() {
}
void HTMLMediaElement::StopListeningMediaControlKeyIfNeeded() {
if (mMediaControlKeyListener && mMediaControlKeyListener->IsStarted()) {
if (mMediaControlKeyListener->IsStarted()) {
mMediaControlKeyListener->Stop();
}
}
void HTMLMediaElement::UpdateMediaControlAfterPictureInPictureModeChanged() {
// Hasn't started to connect with media control, no need to update anything.
if (!mMediaControlKeyListener || !mMediaControlKeyListener->IsStarted()) {
if (!mMediaControlKeyListener->IsStarted()) {
return;
}
if (IsBeingUsedInPictureInPictureMode()) {