Index: Source/core/html/HTMLMediaElement.cpp |
diff --git a/Source/core/html/HTMLMediaElement.cpp b/Source/core/html/HTMLMediaElement.cpp |
index 4796a31008eb9eb052d6aaf81dd79771334945fc..9fd48d80ee74d34fde13dedf9f7a6c621897640c 100644 |
--- a/Source/core/html/HTMLMediaElement.cpp |
+++ b/Source/core/html/HTMLMediaElement.cpp |
@@ -936,7 +936,7 @@ static bool eventTimeCueCompare(const std::pair<double, TextTrackCue*>& a, |
void HTMLMediaElement::updateActiveTextTrackCues(double movieTime) |
{ |
- LOG(Media, "HTMLMediaElement::updateActiveTextTracks"); |
+ LOG(Media, "HTMLMediaElement::updateActiveTextTrackCues"); |
// 4.8.10.8 Playing the media resource |
@@ -1152,7 +1152,7 @@ void HTMLMediaElement::updateActiveTextTrackCues(double movieTime) |
HTMLTrackElement* trackElement = static_cast<LoadableTextTrack*>(affectedTracks[i])->trackElement(); |
ASSERT(trackElement); |
event->setTarget(trackElement); |
- |
+ |
m_asyncEventQueue->enqueueEvent(event.release()); |
} |
} |
@@ -1232,13 +1232,14 @@ void HTMLMediaElement::textTrackModeChanged(TextTrack* track) |
} |
break; |
} |
- } |
+ } else if (track->trackType() == TextTrack::AddTrack && track->mode() != TextTrack::disabledKeyword()) |
+ textTrackAddCues(track, track->cues()); |
#if USE(PLATFORM_TEXT_TRACK_MENU) |
if (platformTextTrackMenu()) |
platformTextTrackMenu()->trackWasSelected(track->platformTextTrack()); |
#endif |
- |
+ |
configureTextTrackDisplay(); |
updateActiveTextTrackCues(currentTime()); |
} |
@@ -1264,6 +1265,8 @@ void HTMLMediaElement::endIgnoringTrackDisplayUpdateRequests() |
void HTMLMediaElement::textTrackAddCues(TextTrack*, const TextTrackCueList* cues) |
{ |
+ LOG(Media, "HTMLMediaElement::textTrackAddCues"); |
+ |
TrackDisplayUpdateScope scope(this); |
for (size_t i = 0; i < cues->length(); ++i) |
textTrackAddCue(cues->item(i)->track(), cues->item(i)); |
@@ -1271,6 +1274,8 @@ void HTMLMediaElement::textTrackAddCues(TextTrack*, const TextTrackCueList* cues |
void HTMLMediaElement::textTrackRemoveCues(TextTrack*, const TextTrackCueList* cues) |
{ |
+ LOG(Media, "HTMLMediaElement::textTrackRemoveCues"); |
+ |
TrackDisplayUpdateScope scope(this); |
for (size_t i = 0; i < cues->length(); ++i) |
textTrackRemoveCue(cues->item(i)->track(), cues->item(i)); |
@@ -1298,8 +1303,10 @@ void HTMLMediaElement::textTrackRemoveCue(TextTrack*, PassRefPtr<TextTrackCue> c |
m_cueTree.remove(interval); |
size_t index = m_currentlyActiveCues.find(interval); |
- if (index != notFound) |
+ if (index != notFound) { |
m_currentlyActiveCues.remove(index); |
+ cue->setIsActive(false); |
+ } |
cue->removeDisplayTree(); |
updateActiveTextTrackCues(currentTime()); |
@@ -2859,6 +2866,8 @@ void HTMLMediaElement::configureTextTrackGroup(const TrackGroup& group) |
{ |
ASSERT(group.tracks.size()); |
+ LOG(Media, "HTMLMediaElement::configureTextTrackGroup(%d)", group.kind); |
+ |
Page* page = document()->page(); |
CaptionUserPreferences* captionPreferences = page? page->group().captionPreferences() : 0; |
@@ -2907,6 +2916,9 @@ void HTMLMediaElement::configureTextTrackGroup(const TrackGroup& group) |
// If no track matches the user's preferred language and non was marked 'default', enable the first track |
// because the user has explicitly stated a preference for this kind of track. |
+ if (!fallbackTrack && m_closedCaptionsVisible && group.kind == TrackGroup::CaptionsAndSubtitles) |
+ fallbackTrack = group.tracks[0]; |
+ |
if (!trackToEnable && fallbackTrack) |
trackToEnable = fallbackTrack; |
@@ -2920,8 +2932,6 @@ void HTMLMediaElement::configureTextTrackGroup(const TrackGroup& group) |
if (trackToEnable) |
trackToEnable->setMode(TextTrack::showingKeyword()); |
- |
- m_processingPreferenceChange = false; |
} |
void HTMLMediaElement::setSelectedTextTrack(TextTrack* trackToSelect) |
@@ -3882,9 +3892,11 @@ bool HTMLMediaElement::closedCaptionsVisible() const |
void HTMLMediaElement::updateTextTrackDisplay() |
{ |
+ LOG(Media, "HTMLMediaElement::updateTextTrackDisplay"); |
+ |
if (!hasMediaControls() && !createMediaControls()) |
return; |
- |
+ |
mediaControls()->updateTextTrackDisplay(); |
} |
@@ -3901,6 +3913,8 @@ void HTMLMediaElement::setClosedCaptionsVisible(bool closedCaptionVisible) |
if (RuntimeEnabledFeatures::webkitVideoTrackEnabled()) { |
m_processingPreferenceChange = true; |
markCaptionAndSubtitleTracksAsUnconfigured(); |
+ m_processingPreferenceChange = false; |
+ |
updateTextTrackDisplay(); |
} |
} |
@@ -4039,6 +4053,7 @@ void HTMLMediaElement::configureMediaControls() |
void HTMLMediaElement::configureTextTrackDisplay() |
{ |
ASSERT(m_textTracks); |
+ LOG(Media, "HTMLMediaElement::configureTextTrackDisplay"); |
if (m_processingPreferenceChange) |
return; |
@@ -4062,7 +4077,7 @@ void HTMLMediaElement::configureTextTrackDisplay() |
return; |
mediaControls()->changedClosedCaptionsVisibility(); |
- |
+ |
if (RuntimeEnabledFeatures::webkitVideoTrackEnabled()) |
updateTextTrackDisplay(); |
} |
@@ -4089,7 +4104,6 @@ void HTMLMediaElement::markCaptionAndSubtitleTracksAsUnconfigured() |
// captions and non-default tracks should be displayed based on language |
// preferences if the user has turned captions on). |
for (unsigned i = 0; i < m_textTracks->length(); ++i) { |
- |
RefPtr<TextTrack> textTrack = m_textTracks->item(i); |
String kind = textTrack->kind(); |