void TextTrackList::remove(TextTrack* track) { HeapVector<Member<TextTrack>>* tracks = nullptr; if (track->trackType() == TextTrack::TrackElement) { tracks = &m_elementTracks; } else if (track->trackType() == TextTrack::AddTrack) { tracks = &m_addTrackTracks; } else if (track->trackType() == TextTrack::InBand) { tracks = &m_inbandTracks; } else { ASSERT_NOT_REACHED(); } size_t index = tracks->find(track); if (index == kNotFound) return; invalidateTrackIndexesAfterTrack(track); ASSERT(track->trackList() == this); track->setTrackList(0); tracks->remove(index); scheduleRemoveTrackEvent(track); }
Element* SlotScopedTraversal::next(const Element& current) { // current.assignedSlot returns a slot only when current is assigned explicitly // If current is assigned to a slot, return a descendant of current, which is in the assigned scope of the same slot as current. HTMLSlotElement* slot = current.assignedSlot(); Element* nearestAncestorAssignedToSlot = SlotScopedTraversal::nearestAncestorAssignedToSlot(current); if (slot) { if (Element* next = ElementTraversal::next(current, ¤t)) return next; } else { // If current is in assigned scope, find an assigned ancestor. ASSERT(nearestAncestorAssignedToSlot); if (Element* next = ElementTraversal::next(current, nearestAncestorAssignedToSlot)) return next; slot = nearestAncestorAssignedToSlot->assignedSlot(); ASSERT(slot); } HeapVector<Member<Node>> assignedNodes = slot->getAssignedNodes(); size_t currentIndex = assignedNodes.find(*nearestAncestorAssignedToSlot); ASSERT(currentIndex != kNotFound); for (++currentIndex; currentIndex < assignedNodes.size(); ++currentIndex) { if (assignedNodes[currentIndex]->isElementNode()) return toElement(assignedNodes[currentIndex]); } return nullptr; }
void TextTrackList::invalidateTrackIndexesAfterTrack(TextTrack* track) { HeapVector<Member<TextTrack>>* tracks = nullptr; if (track->trackType() == TextTrack::TrackElement) { tracks = &m_elementTracks; for (size_t i = 0; i < m_addTrackTracks.size(); ++i) m_addTrackTracks[i]->invalidateTrackIndex(); for (size_t i = 0; i < m_inbandTracks.size(); ++i) m_inbandTracks[i]->invalidateTrackIndex(); } else if (track->trackType() == TextTrack::AddTrack) { tracks = &m_addTrackTracks; for (size_t i = 0; i < m_inbandTracks.size(); ++i) m_inbandTracks[i]->invalidateTrackIndex(); } else if (track->trackType() == TextTrack::InBand) { tracks = &m_inbandTracks; } else { ASSERT_NOT_REACHED(); } size_t index = tracks->find(track); if (index == kNotFound) return; for (size_t i = index; i < tracks->size(); ++i) tracks->at(index)->invalidateTrackIndex(); }