Bug 1293922 - Use AutoCancelingTimerHandleWithFunction in htmlmediaelement - r?froydnj
MozReview-Commit-ID: 8MfpcdkQeYM
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -2936,20 +2936,17 @@ HTMLMediaElement::~HTMLMediaElement()
}
UnregisterActivityObserver();
if (mDecoder) {
ShutdownDecoder();
}
if (mProgressTimer) {
StopProgress();
}
- if (mVideoDecodeSuspendTimer) {
- mVideoDecodeSuspendTimer->Cancel();
- mVideoDecodeSuspendTimer = nullptr;
- }
+ mVideoDecodeSuspendTimer.CancelAndRelease();
if (mSrcStream) {
EndSrcMediaStreamPlayback();
}
if (mCaptureStreamPort) {
mCaptureStreamPort->Destroy();
mCaptureStreamPort = nullptr;
}
@@ -3412,50 +3409,39 @@ nsresult HTMLMediaElement::BindToTree(ns
// When the MediaElement is binding to tree, the dormant status is
// aligned to document's hidden status.
mDecoder->NotifyOwnerActivityChanged(!IsHidden());
}
return rv;
}
-/* static */
-void HTMLMediaElement::VideoDecodeSuspendTimerCallback(nsITimer* aTimer, void* aClosure)
-{
- MOZ_ASSERT(NS_IsMainThread());
- auto element = static_cast<HTMLMediaElement*>(aClosure);
- element->mVideoDecodeSuspendTime.Start();
- element->mVideoDecodeSuspendTimer = nullptr;
-}
-
void HTMLMediaElement::HiddenVideoStart()
{
MOZ_ASSERT(NS_IsMainThread());
mHiddenPlayTime.Start();
- if (mVideoDecodeSuspendTimer) {
- // Already started, just keep it running.
- return;
- }
- mVideoDecodeSuspendTimer = do_CreateInstance("@mozilla.org/timer;1");
- mVideoDecodeSuspendTimer->InitWithNamedFuncCallback(
- VideoDecodeSuspendTimerCallback, this,
- MediaPrefs::MDSMSuspendBackgroundVideoDelay(), nsITimer::TYPE_ONE_SHOT,
- "HTMLMediaElement::VideoDecodeSuspendTimerCallback");
+ if (!mVideoDecodeSuspendTimer) {
+ // Not already started, start it now. (Otherwise keep it running.)
+ mVideoDecodeSuspendTimer.Init(
+ MediaPrefs::MDSMSuspendBackgroundVideoDelay(),
+ nsITimer::TYPE_ONE_SHOT,
+ [this](){
+ MOZ_ASSERT(NS_IsMainThread());
+ mVideoDecodeSuspendTime.Start();
+ mVideoDecodeSuspendTimer.Release();
+ });
+ }
}
void HTMLMediaElement::HiddenVideoStop()
{
MOZ_ASSERT(NS_IsMainThread());
mHiddenPlayTime.Pause();
mVideoDecodeSuspendTime.Pause();
- if (!mVideoDecodeSuspendTimer) {
- return;
- }
- mVideoDecodeSuspendTimer->Cancel();
- mVideoDecodeSuspendTimer = nullptr;
+ mVideoDecodeSuspendTimer.CancelAndRelease();
}
void
HTMLMediaElement::ReportEMETelemetry()
{
// Report telemetry for EME videos when a page is unloaded.
NS_ASSERTION(NS_IsMainThread(), "Should be on main thread.");
if (mIsEncrypted && Preferences::GetBool("media.eme.enabled")) {
--- a/dom/html/HTMLMediaElement.h
+++ b/dom/html/HTMLMediaElement.h
@@ -13,16 +13,17 @@
#include "nsCycleCollectionParticipant.h"
#include "nsIObserver.h"
#include "mozilla/CORSMode.h"
#include "DecoderTraits.h"
#include "nsIAudioChannelAgent.h"
#include "mozilla/Attributes.h"
#include "mozilla/dom/Promise.h"
#include "mozilla/dom/TextTrackManager.h"
+#include "mozilla/TimerUtils.h"
#include "mozilla/WeakPtr.h"
#include "MediaDecoder.h"
#include "mozilla/dom/MediaKeys.h"
#include "mozilla/StateWatching.h"
#include "nsGkAtoms.h"
#include "PrincipalChangeObserver.h"
// X.h on Linux #defines CurrentTime as 0L, so we have to #undef it here.
@@ -1167,22 +1168,16 @@ protected:
virtual bool GetPaused() final override
{
bool isPaused = false;
GetPaused(&isPaused);
return isPaused;
}
/**
- * Video has been playing while hidden and, if feature was enabled, would
- * trigger suspending decoder.
- * Used to track hidden-video-decode-suspend telemetry.
- */
- static void VideoDecodeSuspendTimerCallback(nsITimer* aTimer, void* aClosure);
- /**
* Video is now both: playing and hidden.
* Used to track hidden-video telemetry.
*/
void HiddenVideoStart();
/**
* Video is not playing anymore and/or has become visible.
* Used to track hidden-video telemetry.
*/
@@ -1440,17 +1435,17 @@ protected:
// Range of time played.
RefPtr<TimeRanges> mPlayed;
// Timer used for updating progress events.
nsCOMPtr<nsITimer> mProgressTimer;
// Timer used to simulate video-suspend.
- nsCOMPtr<nsITimer> mVideoDecodeSuspendTimer;
+ AutoCancelingTimerHandleWithFunction mVideoDecodeSuspendTimer;
// Encrypted Media Extension media keys.
RefPtr<MediaKeys> mMediaKeys;
// Stores the time at the start of the current 'played' range.
double mCurrentPlayRangeStart;
// If true then we have begun downloading the media content.