From e355a8b526596294648767fbe36cd08b23a404d9 Mon Sep 17 00:00:00 2001 From: bechen Date: Wed, 1 Jun 2016 15:13:43 +0800 Subject: [PATCH] Bug 882718 - 1. Fix testcase crash/failed . 2. The cuechange event should be fired in TimeMarchesOn. r=rillian MozReview-Commit-ID: EYi9iZ1mfjg --HG-- extra : rebase_source : 2f652a3d4f072c87ba44de3650ff1358694444c1 --- dom/html/HTMLMediaElement.cpp | 6 +++--- dom/html/TextTrackManager.cpp | 19 ++++++++++++------- dom/media/TextTrack.cpp | 24 +++++------------------- dom/media/TextTrackCueList.cpp | 6 ++++++ dom/media/TextTrackCueList.h | 1 + dom/media/test/test_texttrackcue.html | 4 ++++ 6 files changed, 31 insertions(+), 29 deletions(-) diff --git a/dom/html/HTMLMediaElement.cpp b/dom/html/HTMLMediaElement.cpp index 9fb9893d5035..af29b9b528f7 100644 --- a/dom/html/HTMLMediaElement.cpp +++ b/dom/html/HTMLMediaElement.cpp @@ -3742,13 +3742,13 @@ void HTMLMediaElement::SeekCompleted() { mPlayingBeforeSeek = false; SetPlayedOrSeeked(true); + if (mTextTrackManager) { + mTextTrackManager->DidSeek(); + } FireTimeUpdate(false); DispatchAsyncEvent(NS_LITERAL_STRING("seeked")); // We changed whether we're seeking so we need to AddRemoveSelfReference AddRemoveSelfReference(); - if (mTextTrackManager) { - mTextTrackManager->DidSeek(); - } if (mCurrentPlayRangeStart == -1.0) { mCurrentPlayRangeStart = CurrentTime(); } diff --git a/dom/html/TextTrackManager.cpp b/dom/html/TextTrackManager.cpp index 44ea8e6a36d6..773dbc5236ca 100644 --- a/dom/html/TextTrackManager.cpp +++ b/dom/html/TextTrackManager.cpp @@ -193,8 +193,7 @@ TextTrackManager::RemoveTextTrack(TextTrack* aTextTrack, bool aPendingListOnly) TextTrackCueList* removeCueList = aTextTrack->GetCues(); if (removeCueList) { for (uint32_t i = 0; i < removeCueList->Length(); ++i) { - ErrorResult dummyRv; - mNewCues->RemoveCue(*((*removeCueList)[i]), dummyRv); + mNewCues->RemoveCue(*((*removeCueList)[i])); } DispatchTimeMarchesOn(); } @@ -206,6 +205,9 @@ TextTrackManager::DidSeek() if (mTextTracks) { mTextTracks->DidSeek(); } + if (mMediaElement) { + mLastTimeMarchesOnCalled = mMediaElement->CurrentTime(); + } mHasSeeked = true; } @@ -264,8 +266,7 @@ void TextTrackManager::NotifyCueRemoved(TextTrackCue& aCue) { if (mNewCues) { - ErrorResult dummyRv; - mNewCues->RemoveCue(aCue, dummyRv); + mNewCues->RemoveCue(aCue); } DispatchTimeMarchesOn(); } @@ -532,7 +533,8 @@ TextTrackManager::TimeMarchesOn() } nsCOMPtr window = do_QueryInterface(parentObject); - if (mMediaElement && !(mMediaElement->GetPlayedOrSeeked())) { + if (mMediaElement && + (!(mMediaElement->GetPlayedOrSeeked())|| mMediaElement->Seeking())) { return; } @@ -570,8 +572,7 @@ TextTrackManager::TimeMarchesOn() } for (uint32_t i = 0; i < currentCues->Length(); ++i) { TextTrackCue* cue = (*currentCues)[i]; - ErrorResult dummy; - otherCues->RemoveCue(*cue, dummy); + otherCues->RemoveCue(*cue); } // Step 4. @@ -696,6 +697,10 @@ TextTrackManager::TimeMarchesOn() TextTrack* ttrack = affectedTracks[i]; if (ttrack) { ttrack->DispatchTrustedEvent(NS_LITERAL_STRING("cuechange")); + HTMLTrackElement* trackElement = ttrack->GetTrackElement(); + if (trackElement) { + trackElement->DispatchTrackRunnable(NS_LITERAL_STRING("cuechange")); + } } } diff --git a/dom/media/TextTrack.cpp b/dom/media/TextTrack.cpp index 26834089113c..86142f82c85e 100644 --- a/dom/media/TextTrack.cpp +++ b/dom/media/TextTrack.cpp @@ -129,13 +129,14 @@ TextTrack::AddCue(TextTrackCue& aCue) void TextTrack::RemoveCue(TextTrackCue& aCue, ErrorResult& aRv) { - //TODO: Apply the rules for text track cue rendering Bug 865407 aCue.SetActive(false); mCueList->RemoveCue(aCue, aRv); - HTMLMediaElement* mediaElement = mTextTrackList->GetMediaElement(); - if (mediaElement) { - mediaElement->NotifyCueRemoved(aCue); + if (mTextTrackList) { + HTMLMediaElement* mediaElement = mTextTrackList->GetMediaElement(); + if (mediaElement) { + mediaElement->NotifyCueRemoved(aCue); + } } SetDirty(); } @@ -160,10 +161,6 @@ TextTrack::UpdateActiveCueList() return; } - // Flag that indicates whether or not this call of UpdateActiveCueList has - // changed the activeCueList. - bool hasChanged = false; - // If we are dirty, i.e. an event happened that may cause the sorted mCueList // to have changed like a seek or an insert for a cue, than we need to rebuild // the active cue list from scratch. @@ -179,7 +176,6 @@ TextTrack::UpdateActiveCueList() for (uint32_t i = mActiveCueList->Length(); i > 0; i--) { if ((*mActiveCueList)[i - 1]->EndTime() < playbackTime) { mActiveCueList->RemoveCueAt(i - 1); - hasChanged = true; } } // Add all the cues, starting from the position of the last cue that was @@ -190,16 +186,6 @@ TextTrack::UpdateActiveCueList() (*mCueList)[mCuePos]->StartTime() <= playbackTime; mCuePos++) { if ((*mCueList)[mCuePos]->EndTime() >= playbackTime) { mActiveCueList->AddCue(*(*mCueList)[mCuePos]); - hasChanged = true; - } - } - - if (hasChanged) { - RefPtr asyncDispatcher = - new AsyncEventDispatcher(this, NS_LITERAL_STRING("cuechange"), false); - asyncDispatcher->PostDOMEvent(); - if (mTrackElement) { - mTrackElement->DispatchTrackRunnable(NS_LITERAL_STRING("cuechange")); } } } diff --git a/dom/media/TextTrackCueList.cpp b/dom/media/TextTrackCueList.cpp index e3f98d38d7c1..f3fe66662adb 100644 --- a/dom/media/TextTrackCueList.cpp +++ b/dom/media/TextTrackCueList.cpp @@ -103,6 +103,12 @@ TextTrackCueList::RemoveCue(TextTrackCue& aCue, ErrorResult& aRv) mList.RemoveElement(&aCue); } +void +TextTrackCueList::RemoveCue(TextTrackCue& aCue) +{ + mList.RemoveElement(&aCue); +} + void TextTrackCueList::RemoveCueAt(uint32_t aIndex) { diff --git a/dom/media/TextTrackCueList.h b/dom/media/TextTrackCueList.h index aa88f3c062cb..8a77045f76e6 100644 --- a/dom/media/TextTrackCueList.h +++ b/dom/media/TextTrackCueList.h @@ -50,6 +50,7 @@ public: // from the end of the current array should be more efficient than a general // sort step after all cues are loaded. void AddCue(TextTrackCue& aCue); + void RemoveCue(TextTrackCue& aCue); void RemoveCue(TextTrackCue& aCue, ErrorResult& aRv); void RemoveCueAt(uint32_t aIndex); void RemoveAll(); diff --git a/dom/media/test/test_texttrackcue.html b/dom/media/test/test_texttrackcue.html index 29fc9b3cf869..08a2016ec540 100644 --- a/dom/media/test/test_texttrackcue.html +++ b/dom/media/test/test_texttrackcue.html @@ -83,6 +83,10 @@ SpecialPowers.pushPrefEnv({"set": [["media.webvtt.regions.enabled", true]]}, is(cue.endTime, 0.71, "Cue's end time should be 0.71."); cue.pauseOnExit = true; is(cue.pauseOnExit, true, "Cue's pause on exit flag should be true."); + video.addEventListener("pause", function pauseOnExit() { + video.removeEventListener("pause", pauseOnExit, false); + video.play(); + }); var exceptionHappened; function checkPercentageValue(prop) {