Bug 1385092 - Null check for the sParserWrapper. r=alwu draft
authorbechen@mozilla.com <bechen@mozilla.com>
Wed, 09 Aug 2017 17:30:52 +0800
changeset 643113 4f9982a3e44e6f1a4db48739af92dc04cb0112d6
parent 618288 a6c502679d442596b8b4410d6413cd310ac46408
child 725212 9b8be094db3fa55dfe0eac1ba35fe7062899ade7
push id72998
push userbmo:bechen@mozilla.com
push dateWed, 09 Aug 2017 09:34:53 +0000
reviewersalwu
bugs1385092
milestone56.0a1
Bug 1385092 - Null check for the sParserWrapper. r=alwu From the crash report and code logic, it is possible that the KillClearOnShutdown comes and the NS_XPCOM_SHUTDOWN_OBSERVER_ID never comes when getting obsercerService fail. So add null check for the sParserWrapper and combine mShutdown to a new function. MozReview-Commit-ID: Cj5ph2JrO7v
dom/html/TextTrackManager.cpp
dom/html/TextTrackManager.h
--- a/dom/html/TextTrackManager.cpp
+++ b/dom/html/TextTrackManager.cpp
@@ -125,16 +125,17 @@ TextTrackManager::TextTrackManager(HTMLM
   mNewCues = new TextTrackCueList(window);
   mLastActiveCues = new TextTrackCueList(window);
   mTextTracks = new TextTrackList(window, this);
   mPendingTextTracks = new TextTrackList(window, this);
 
   if (!sParserWrapper) {
     nsCOMPtr<nsIWebVTTParserWrapper> parserWrapper =
       do_CreateInstance(NS_WEBVTTPARSERWRAPPER_CONTRACTID);
+    MOZ_ASSERT(parserWrapper, "Can't create nsIWebVTTParserWrapper");
     sParserWrapper = parserWrapper;
     ClearOnShutdown(&sParserWrapper);
   }
   mShutdownProxy = new ShutdownObserverProxy(this);
 }
 
 TextTrackManager::~TextTrackManager()
 {
@@ -258,17 +259,17 @@ TextTrackManager::DidSeek()
 }
 
 void
 TextTrackManager::UpdateCueDisplay()
 {
   WEBVTT_LOG("UpdateCueDisplay");
   mUpdateCueDisplayDispatched = false;
 
-  if (!mMediaElement || !mTextTracks) {
+  if (!mMediaElement || !mTextTracks || IsShutdown()) {
     return;
   }
 
   nsIFrame* frame = mMediaElement->GetPrimaryFrame();
   nsVideoFrame* videoFrame = do_QueryFrame(frame);
   if (!videoFrame) {
     return;
   }
@@ -619,17 +620,17 @@ public:
   }
 private:
   nsTArray<RefPtr<TextTrack>> mTextTracks;
 };
 
 void
 TextTrackManager::DispatchUpdateCueDisplay()
 {
-  if (!mUpdateCueDisplayDispatched && !mShutdown &&
+  if (!mUpdateCueDisplayDispatched && !IsShutdown() &&
       (mMediaElement->GetHasUserInteraction() || mMediaElement->IsCurrentlyPlaying())) {
     WEBVTT_LOG("DispatchUpdateCueDisplay");
     nsPIDOMWindowInner* win = mMediaElement->OwnerDoc()->GetInnerWindow();
     if (win) {
       nsGlobalWindow::Cast(win)->Dispatch(
         TaskCategory::Other,
         NewRunnableMethod("dom::TextTrackManager::UpdateCueDisplay",
                           this,
@@ -641,17 +642,17 @@ TextTrackManager::DispatchUpdateCueDispl
 
 void
 TextTrackManager::DispatchTimeMarchesOn()
 {
   // Run the algorithm if no previous instance is still running, otherwise
   // enqueue the current playback position and whether only that changed
   // through its usual monotonic increase during normal playback; current
   // executing call upon completion will check queue for further 'work'.
-  if (!mTimeMarchesOnDispatched && !mShutdown &&
+  if (!mTimeMarchesOnDispatched && !IsShutdown() &&
       (mMediaElement->GetHasUserInteraction() || mMediaElement->IsCurrentlyPlaying())) {
     WEBVTT_LOG("DispatchTimeMarchesOn");
     nsPIDOMWindowInner* win = mMediaElement->OwnerDoc()->GetInnerWindow();
     if (win) {
       nsGlobalWindow::Cast(win)->Dispatch(
         TaskCategory::Other,
         NewRunnableMethod("dom::TextTrackManager::TimeMarchesOn",
                           this,
@@ -665,17 +666,17 @@ TextTrackManager::DispatchTimeMarchesOn(
 void
 TextTrackManager::TimeMarchesOn()
 {
   NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
   WEBVTT_LOG("TimeMarchesOn");
   mTimeMarchesOnDispatched = false;
 
   // Early return if we don't have any TextTracks or shutting down.
-  if (!mTextTracks || mTextTracks->Length() == 0 || mShutdown) {
+  if (!mTextTracks || mTextTracks->Length() == 0 || IsShutdown()) {
     return;
   }
 
   nsISupports* parentObject =
     mMediaElement->OwnerDoc()->GetParentObject();
   if (NS_WARN_IF(!parentObject)) {
     return;
   }
@@ -914,11 +915,16 @@ TextTrackManager::ReportTelemetryForCue(
 }
 
 bool
 TextTrackManager::IsLoaded()
 {
   return mTextTracks ? mTextTracks->AreTextTracksLoaded() : true;
 }
 
+bool
+TextTrackManager::IsShutdown() const
+{
+  return (mShutdown || !sParserWrapper);
+}
 
 } // namespace dom
 } // namespace mozilla
--- a/dom/html/TextTrackManager.h
+++ b/dom/html/TextTrackManager.h
@@ -148,16 +148,18 @@ private:
                             nsTArray<TextTrack*>& aTextTracks);
   void GetTextTracksOfKind(TextTrackKind aTextTrackKind,
                            nsTArray<TextTrack*>& aTextTracks);
   bool TrackIsDefault(TextTrack* aTextTrack);
 
   void ReportTelemetryForTrack(TextTrack* aTextTrack) const;
   void ReportTelemetryForCue();
 
+  bool IsShutdown() const;
+
   // If there is at least one cue has been added to the cue list once, we would
   // report the usage of cue to Telemetry.
   bool mCueTelemetryReported;
 
   class ShutdownObserverProxy final : public nsIObserver
   {
     NS_DECL_ISUPPORTS