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
--- 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: