Bug 1293922 - Use AutoCancelingTimerHandleWithFunction in htmlmediaelement - r?froydnj draft
authorGerald Squelart <gsquelart@mozilla.com>
Fri, 12 Aug 2016 16:53:41 +0800
changeset 429181 89fd20af72cba033677e61100bef417672319a78
parent 429180 59fbbfb2cfa266361ccc8ef583b65e1447b01714
child 534913 e9d03a1e7a39bf9cd7b0a7109d969233004045c1
push id33501
push usergsquelart@mozilla.com
push dateTue, 25 Oct 2016 11:42:25 +0000
reviewersfroydnj
bugs1293922
milestone52.0a1
Bug 1293922 - Use AutoCancelingTimerHandleWithFunction in htmlmediaelement - r?froydnj MozReview-Commit-ID: 8MfpcdkQeYM
dom/html/HTMLMediaElement.cpp
dom/html/HTMLMediaElement.h
--- 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.