bool TextTrackCue::isEqual(const TextTrackCue& cue, TextTrackCue::CueMatchRules match) const { if (cueType() != cue.cueType()) return false; if (match != IgnoreDuration && endMediaTime() != cue.endMediaTime()) return false; if (!hasEquivalentStartTime(cue)) return false; if (!cueContentsMatch(cue)) return false; return true; }
bool TextTrack::hasCue(TextTrackCue* cue, TextTrackCue::CueMatchRules match) { if (cue->startMediaTime() < MediaTime::zeroTime() || cue->endMediaTime() < MediaTime::zeroTime()) return false; if (!m_cues || !m_cues->length()) return false; size_t searchStart = 0; size_t searchEnd = m_cues->length(); while (1) { ASSERT(searchStart <= m_cues->length()); ASSERT(searchEnd <= m_cues->length()); TextTrackCue* existingCue; // Cues in the TextTrackCueList are maintained in start time order. if (searchStart == searchEnd) { if (!searchStart) return false; // If there is more than one cue with the same start time, back up to first one so we // consider all of them. while (searchStart >= 2 && cue->hasEquivalentStartTime(*m_cues->item(searchStart - 2))) --searchStart; bool firstCompare = true; while (1) { if (!firstCompare) ++searchStart; firstCompare = false; if (searchStart > m_cues->length()) return false; existingCue = m_cues->item(searchStart - 1); if (!existingCue) return false; if (cue->startMediaTime() > (existingCue->startMediaTime() + startTimeVariance())) return false; if (existingCue->isEqual(*cue, match)) return true; } } size_t index = (searchStart + searchEnd) / 2; existingCue = m_cues->item(index); if ((cue->startMediaTime() + startTimeVariance()) < existingCue->startMediaTime() || (match != TextTrackCue::IgnoreDuration && cue->hasEquivalentStartTime(*existingCue) && cue->endMediaTime() > existingCue->endMediaTime())) searchEnd = index; else searchStart = index + 1; } ASSERT_NOT_REACHED(); return false; }