Index: Source/core/html/track/TextTrackCueList.cpp |
diff --git a/Source/core/html/track/TextTrackCueList.cpp b/Source/core/html/track/TextTrackCueList.cpp |
index b5e48a809315b720760ae7c81ee63d5ef6ca618d..a4de4260b277f38ce8d971d3428e61cfcd37a30f 100644 |
--- a/Source/core/html/track/TextTrackCueList.cpp |
+++ b/Source/core/html/track/TextTrackCueList.cpp |
@@ -31,6 +31,7 @@ |
namespace blink { |
TextTrackCueList::TextTrackCueList() |
+ : m_firstInvalidIndex(0) |
{ |
} |
@@ -41,11 +42,6 @@ unsigned long TextTrackCueList::length() const |
return m_list.size(); |
} |
-unsigned long TextTrackCueList::getCueIndex(TextTrackCue* cue) const |
-{ |
- return m_list.find(cue); |
-} |
- |
TextTrackCue* TextTrackCueList::item(unsigned index) const |
{ |
if (index < m_list.size()) |
@@ -85,7 +81,7 @@ bool TextTrackCueList::add(PassRefPtrWillBeRawPtr<TextTrackCue> cue) |
return false; |
m_list.insert(index, cue); |
- invalidateCueIndexes(index); |
+ invalidateCueIndex(index); |
return true; |
} |
@@ -112,9 +108,8 @@ bool TextTrackCueList::remove(TextTrackCue* cue) |
return false; |
m_list.remove(index); |
- // FIXME: While removing a cue does not invalidate the cue order, it does |
- // make it more difficult to maintain the invariant, so should probably |
- // just invalidate here as well. |
+ invalidateCueIndex(index); |
+ cue->invalidateCueIndex(); |
return true; |
} |
@@ -122,11 +117,6 @@ void TextTrackCueList::updateCueIndex(TextTrackCue* cue) |
{ |
if (!remove(cue)) |
return; |
- |
- // FIXME: If moving the cue such that its index in list increases, then |
- // what happens with the cached index on cues in the range [oldIndex, |
- // newIndex)? (Some of the indices will be "safe", but there'll be a risk |
- // that the lazy update via cueIndex() yields duplicates/incorrect order.) |
add(cue); |
} |
@@ -135,11 +125,25 @@ void TextTrackCueList::clear() |
m_list.clear(); |
} |
-void TextTrackCueList::invalidateCueIndexes(size_t start) |
+void TextTrackCueList::invalidateCueIndex(size_t index) |
+{ |
+ // Store the smallest (first) index that we know has a cue that does not |
+ // meet the criteria: |
+ // cueIndex(list[index-1]) + 1 == cueIndex(list[index]) [index > 0] |
+ // This is a stronger requirement than we need, but it's easier to maintain. |
+ // We can then check if a cue's index is valid by comparing it with |
+ // |m_firstInvalidIndex| - if it's strictly less it is valid. |
+ m_firstInvalidIndex = std::min(m_firstInvalidIndex, index); |
+} |
+ |
+void TextTrackCueList::validateCueIndexes() |
{ |
- // FIXME: When iterating cues we could as well update their cached indices too. |
- for (size_t i = start; i < m_list.size(); ++i) |
- m_list[i]->invalidateCueIndex(); |
+ // Compute new index values for the cues starting at |
+ // |m_firstInvalidIndex|. If said index is beyond the end of the list, no |
+ // cues will need to be updated. |
+ for (size_t i = m_firstInvalidIndex; i < m_list.size(); ++i) |
+ m_list[i]->updateCueIndex(safeCast<unsigned>(i)); |
+ m_firstInvalidIndex = m_list.size(); |
} |
DEFINE_TRACE(TextTrackCueList) |