Bug 1467350 - Make HTMLMediaElement::mPaused Watchable and update Wakelock status via a watcher. r=jya

We currently observe changes to HTMLMediaElement::mPaused via a hand-rolled
wrapper class. We can use use mozilla::Watchable<> and avoid rolling our
own equivalent here.

This also paves the way for using state watching on other observable state
in HTMLMediaElement.

MozReview-Commit-ID: 4lBlJiV15iG
This commit is contained in:
Chris Pearce
2018-05-21 14:19:47 +12:00
parent f9d2c3d5a2
commit 0041d0ec9d
2 changed files with 19 additions and 44 deletions

View File

@@ -3884,11 +3884,12 @@ NS_IMPL_ISUPPORTS(HTMLMediaElement::ShutdownObserver, nsIObserver)
HTMLMediaElement::HTMLMediaElement(
already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo)
: nsGenericHTMLElement(aNodeInfo)
, mWatchManager(this, OwnerDoc()->AbstractMainThreadFor(TaskCategory::Other))
, mMainThreadEventTarget(OwnerDoc()->EventTargetFor(TaskCategory::Other))
, mAbstractMainThread(OwnerDoc()->AbstractMainThreadFor(TaskCategory::Other))
, mShutdownObserver(new ShutdownObserver)
, mPlayed(new TimeRanges(ToSupports(OwnerDoc())))
, mPaused(true, *this)
, mPaused(true, "HTMLMediaElement::mPaused")
, mErrorSink(new ErrorSink(this))
, mAudioChannelWrapper(new AudioChannelAgentCallback(this))
{
@@ -3897,6 +3898,8 @@ HTMLMediaElement::HTMLMediaElement(
DecoderDoctorLogger::LogConstruction(this);
mWatchManager.Watch(mPaused, &HTMLMediaElement::UpdateWakeLock);
ErrorResult rv;
double defaultVolume = Preferences::GetFloat("media.default_volume", 1.0);
@@ -4180,31 +4183,20 @@ HTMLMediaElement::MaybeDoLoad()
}
}
HTMLMediaElement::WakeLockBoolWrapper&
HTMLMediaElement::WakeLockBoolWrapper::operator=(bool val)
{
if (mValue == val) {
return *this;
}
mValue = val;
UpdateWakeLock();
return *this;
}
void
HTMLMediaElement::WakeLockBoolWrapper::UpdateWakeLock()
HTMLMediaElement::UpdateWakeLock()
{
MOZ_ASSERT(NS_IsMainThread());
bool playing = !mValue;
// Ensure we have a wake lock if we're playing audibly. This ensures the
// device doesn't sleep while playing.
bool playing = !mPaused;
bool isAudible =
mOuter.Volume() > 0.0 && !mOuter.mMuted && mOuter.mIsAudioTrackAudible;
// when playing audible media.
Volume() > 0.0 && !mMuted && mIsAudioTrackAudible;
// WakeLock when playing audible media.
if (playing && isAudible) {
mOuter.WakeLockCreate();
WakeLockCreate();
} else {
mOuter.WakeLockRelease();
WakeLockRelease();
}
}
@@ -7549,7 +7541,7 @@ HTMLMediaElement::NotifyAudioPlaybackChanged(AudibleChangedReasons aReason)
mAudioChannelWrapper->NotifyAudioPlaybackChanged(aReason);
}
// only request wake lock for audible media.
mPaused.UpdateWakeLock();
UpdateWakeLock();
}
bool