Bug 1368489 - Fixing TimeMarchesOn step 13, sort the tasks by "text track cue order". r=rillian. draft
authorbechen <bechen@mozilla.com>
Tue, 13 Jun 2017 09:52:27 +0800
changeset 592971 2998c48982e40604b068ffca525691c5b69ae2cf
parent 592970 c4ca3dee366d66fab101231a93a86056d16f6a68
child 593220 0902b19c2aeeace475f21f7fcbed16e0ef44fe29
push id63559
push userbechen@mozilla.com
push dateTue, 13 Jun 2017 02:01:28 +0000
reviewersrillian
bugs1368489
milestone55.0a1
Bug 1368489 - Fixing TimeMarchesOn step 13, sort the tasks by "text track cue order". r=rillian. 1. Sort by TextTrack. 2. Sort by time. 3. Sort by the order of added to TextTrack. MozReview-Commit-ID: 4nwx6U5dMpy
dom/html/TextTrackManager.cpp
dom/media/TextTrackCueList.cpp
dom/media/TextTrackCueList.h
dom/media/TextTrackList.cpp
dom/media/TextTrackList.h
--- a/dom/html/TextTrackManager.cpp
+++ b/dom/html/TextTrackManager.cpp
@@ -526,30 +526,70 @@ public:
 
   bool Equals(SimpleTextTrackEvent* aOne, SimpleTextTrackEvent* aTwo) const
   {
     return false;
   }
 
   bool LessThan(SimpleTextTrackEvent* aOne, SimpleTextTrackEvent* aTwo) const
   {
+    // TimeMarchesOn step 13.1.
     if (aOne->mTime < aTwo->mTime) {
       return true;
     } else if (aOne->mTime > aTwo->mTime) {
       return false;
     }
 
-    int32_t positionOne = TrackChildPosition(aOne);
-    int32_t positionTwo = TrackChildPosition(aTwo);
-    if (positionOne < positionTwo) {
-      return true;
-    } else if (positionOne > positionTwo) {
-      return false;
+    // TimeMarchesOn step 13.2 text track cue order.
+    // TextTrack position in TextTrackList
+    TextTrack* t1 = aOne->mTrack;
+    TextTrack* t2 = aTwo->mTrack;
+    MOZ_ASSERT(t1, "CompareSimpleTextTrackEvents t1 is null");
+    MOZ_ASSERT(t2, "CompareSimpleTextTrackEvents t2 is null");
+    if (t1 != t2) {
+      TextTrackList* tList= t1->GetTextTrackList();
+      MOZ_ASSERT(tList, "CompareSimpleTextTrackEvents tList is null");
+      nsTArray<RefPtr<TextTrack>>& textTracks = tList->GetTextTrackArray();
+      auto index1 = textTracks.IndexOf(t1);
+      auto index2 = textTracks.IndexOf(t2);
+      if (index1 < index2) {
+        return true;
+      } else if (index1 > index2) {
+        return false;
+      }
     }
 
+    MOZ_ASSERT(t1 == t2, "CompareSimpleTextTrackEvents t1 != t2");
+    // c1 and c2 are both belongs to t1.
+    TextTrackCue* c1 = aOne->mCue;
+    TextTrackCue* c2 = aTwo->mCue;
+    if (c1 != c2) {
+      if (c1->StartTime() < c2->StartTime()) {
+        return true;
+      } else if (c1->StartTime() > c2->StartTime()) {
+        return false;
+      }
+      if (c1->EndTime() < c2->EndTime()) {
+        return true;
+      } else if (c1->EndTime() > c2->EndTime()) {
+        return false;
+      }
+
+      TextTrackCueList* cueList = t1->GetCues();
+      nsTArray<RefPtr<TextTrackCue>>& cues = cueList->GetCuesArray();
+      auto index1 = cues.IndexOf(c1);
+      auto index2 = cues.IndexOf(c2);
+      if (index1 < index2) {
+        return true;
+      } else if (index1 > index2) {
+        return false;
+      }
+    }
+
+    // TimeMarchesOn step 13.3.
     if (aOne->mName.EqualsLiteral("enter") ||
         aTwo->mName.EqualsLiteral("exit")) {
       return true;
     }
     return false;
   }
 };
 
--- a/dom/media/TextTrackCueList.cpp
+++ b/dom/media/TextTrackCueList.cpp
@@ -164,10 +164,16 @@ bool
 TextTrackCueList::IsCueExist(TextTrackCue *aCue)
 {
   if (aCue && mList.Contains(aCue)) {
     return true;
   }
   return false;
 }
 
+nsTArray<RefPtr<TextTrackCue>>&
+TextTrackCueList::GetCuesArray()
+{
+  return mList;
+}
+
 } // namespace dom
 } // namespace mozilla
--- a/dom/media/TextTrackCueList.h
+++ b/dom/media/TextTrackCueList.h
@@ -62,16 +62,17 @@ public:
   void GetArray(nsTArray<RefPtr<TextTrackCue> >& aCues);
 
   void SetCuesInactive();
 
   already_AddRefed<TextTrackCueList>
   GetCueListByTimeInterval(media::Interval<double>& aInterval);
   void NotifyCueUpdated(TextTrackCue *aCue);
   bool IsCueExist(TextTrackCue *aCue);
+  nsTArray<RefPtr<TextTrackCue>>& GetCuesArray();
 
 private:
   ~TextTrackCueList();
 
   nsCOMPtr<nsISupports> mParent;
 
   // A sorted list of TextTrackCues sorted by earliest start time. If the start
   // times are equal then it will be sorted by end time, earliest first.
--- a/dom/media/TextTrackList.cpp
+++ b/dom/media/TextTrackList.cpp
@@ -250,10 +250,16 @@ bool TextTrackList::AreTextTracksLoaded(
   for (uint32_t i = 0; i < Length(); i++) {
     if (!mTextTracks[i]->IsLoaded()) {
       return false;
     }
   }
   return true;
 }
 
+nsTArray<RefPtr<TextTrack>>&
+TextTrackList::GetTextTrackArray()
+{
+  return mTextTracks;
+}
+
 } // namespace dom
 } // namespace mozilla
--- a/dom/media/TextTrackList.h
+++ b/dom/media/TextTrackList.h
@@ -59,16 +59,17 @@ public:
   HTMLMediaElement* GetMediaElement();
   void SetTextTrackManager(TextTrackManager* aTextTrackManager);
 
   nsresult DispatchTrackEvent(nsIDOMEvent* aEvent);
   void CreateAndDispatchChangeEvent();
   void SetCuesInactive();
 
   bool AreTextTracksLoaded();
+  nsTArray<RefPtr<TextTrack>>& GetTextTrackArray();
 
   IMPL_EVENT_HANDLER(change)
   IMPL_EVENT_HANDLER(addtrack)
   IMPL_EVENT_HANDLER(removetrack)
 
   bool mPendingTextTrackChange = false;
 
 private: