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
This commit is contained in:
bechen 2016-06-01 15:13:43 +08:00
Родитель 30214bd891
Коммит e355a8b526
6 изменённых файлов: 31 добавлений и 29 удалений

Просмотреть файл

@ -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();
}

Просмотреть файл

@ -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<nsPIDOMWindowInner> 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"));
}
}
}

Просмотреть файл

@ -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<AsyncEventDispatcher> asyncDispatcher =
new AsyncEventDispatcher(this, NS_LITERAL_STRING("cuechange"), false);
asyncDispatcher->PostDOMEvent();
if (mTrackElement) {
mTrackElement->DispatchTrackRunnable(NS_LITERAL_STRING("cuechange"));
}
}
}

Просмотреть файл

@ -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)
{

Просмотреть файл

@ -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();

Просмотреть файл

@ -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) {