bool TextTrack::hasCue(VTTCue* cue, VTTCue::CueMatchRules match) { if (cue->startTime() < 0 || cue->endTime() < 0) 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->startTime() == m_cues->item(searchStart - 2)->startTime()) --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 (!cue->isRenderable()) continue; if (!existingCue || cue->startTime() > existingCue->startTime()) return false; if (!toVTTCue(existingCue)->isEqual(*cue, match)) continue; return true; } } size_t index = (searchStart + searchEnd) / 2; existingCue = m_cues->item(index); if (cue->startTime() < existingCue->startTime() || (match != VTTCue::IgnoreDuration && cue->startTime() == existingCue->startTime() && cue->endTime() > existingCue->endTime())) searchEnd = index; else searchStart = index + 1; } ASSERT_NOT_REACHED(); return false; }
void TextTrack::setMode(const AtomicString& mode) { ASSERT(mode == disabledKeyword() || mode == hiddenKeyword() || mode == showingKeyword()); // On setting, if the new value isn't equal to what the attribute would currently // return, the new value must be processed as follows ... if (m_mode == mode) return; // If mode changes to disabled, remove this track's cues from the client // because they will no longer be accessible from the cues() function. if (mode == disabledKeyword() && m_client && m_cues) m_client->textTrackRemoveCues(this, m_cues.get()); if (mode != showingKeyword() && m_cues) { for (size_t i = 0; i < m_cues->length(); ++i) { TextTrackCue* cue = m_cues->item(i); if (cue->isRenderable()) toVTTCue(cue)->removeDisplayTree(); } } m_mode = mode; if (m_client) m_client->textTrackModeChanged(this); }
void RenderVTTCue::layout() { StackStats::LayoutCheckPoint layoutCheckPoint; RenderBlockFlow::layout(); #if ENABLE(WEBVTT_REGIONS) // If WebVTT Regions are used, the regular WebVTT layout algorithm is no // longer necessary, since cues having the region parameter set do not have // any positioning parameters. Also, in this case, the regions themselves // have positioning information. if (!m_cue->regionId().isEmpty()) return; #endif LayoutStateMaintainer statePusher(view(), *this, locationOffset(), hasTransform() || hasReflection() || style().isFlippedBlocksWritingMode()); if (m_cue->cueType()== TextTrackCue::WebVTT) { if (toVTTCue(m_cue)->snapToLines()) repositionCueSnapToLinesSet(); else repositionCueSnapToLinesNotSet(); } else repositionGenericCue(); statePusher.pop(); }
bool TextTrackCueGeneric::isOrderedBefore(const TextTrackCue* that) const { if (that->cueType() == Generic && startTime() == that->startTime() && endTime() == that->endTime()) { // Further order generic cues by their calculated line value. std::pair<double, double> thisPosition = getPositionCoordinates(); std::pair<double, double> thatPosition = toVTTCue(that)->getPositionCoordinates(); return thisPosition.second > thatPosition.second || (thisPosition.second == thatPosition.second && thisPosition.first < thatPosition.first); } if (that->cueType() == Generic) return startTime() > that->startTime(); return VTTCue::isOrderedBefore(that); }
bool VTTCue::cueContentsMatch(const TextTrackCue& cue) const { const VTTCue* vttCue = toVTTCue(&cue); if (text() != vttCue->text()) return false; if (cueSettings() != vttCue->cueSettings()) return false; if (position() != vttCue->position()) return false; if (line() != vttCue->line()) return false; if (size() != vttCue->size()) return false; if (align() != vttCue->align()) return false; return true; }
VTTCue* toVTTCue(TextTrackCue* cue) { return const_cast<VTTCue*>(toVTTCue(const_cast<const TextTrackCue*>(cue))); }
v8::Handle<v8::Value> toV8(TextTrackCue* impl, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate) { return toV8(toVTTCue(impl), creationContext, isolate); }