LoadableTextTrack.cpp [plain text]
#include "config.h"
#include "LoadableTextTrack.h"
#if ENABLE(VIDEO_TRACK)
#include "HTMLTrackElement.h"
#include "TextTrackCueList.h"
#include "VTTRegionList.h"
namespace WebCore {
LoadableTextTrack::LoadableTextTrack(HTMLTrackElement& track, const String& kind, const String& label, const String& language)
: TextTrack(&track.document(), &track, kind, emptyString(), label, language, TrackElement)
, m_trackElement(&track)
, m_loadTimer(*this, &LoadableTextTrack::loadTimerFired)
, m_isDefault(false)
{
}
void LoadableTextTrack::scheduleLoad(const URL& url)
{
if (url == m_url)
return;
m_url = url;
if (!m_loadTimer.isActive())
m_loadTimer.startOneShot(0_s);
}
Element* LoadableTextTrack::element()
{
return m_trackElement;
}
void LoadableTextTrack::loadTimerFired()
{
if (m_loader)
m_loader->cancelLoad();
if (!m_trackElement)
return;
m_loader = std::make_unique<TextTrackLoader>(static_cast<TextTrackLoaderClient&>(*this), static_cast<ScriptExecutionContext*>(&m_trackElement->document()));
if (!m_loader->load(m_url, m_trackElement->mediaElementCrossOriginAttribute(), m_trackElement->isInUserAgentShadowTree()))
m_trackElement->didCompleteLoad(HTMLTrackElement::Failure);
}
void LoadableTextTrack::newCuesAvailable(TextTrackLoader* loader)
{
ASSERT_UNUSED(loader, m_loader.get() == loader);
Vector<RefPtr<TextTrackCue>> newCues;
m_loader->getNewCues(newCues);
if (!m_cues)
m_cues = TextTrackCueList::create();
for (auto& newCue : newCues) {
newCue->setTrack(this);
m_cues->add(newCue.releaseNonNull());
}
if (client())
client()->textTrackAddCues(*this, *m_cues);
}
void LoadableTextTrack::cueLoadingCompleted(TextTrackLoader* loader, bool loadingFailed)
{
ASSERT_UNUSED(loader, m_loader.get() == loader);
if (!m_trackElement)
return;
m_trackElement->didCompleteLoad(loadingFailed ? HTMLTrackElement::Failure : HTMLTrackElement::Success);
}
void LoadableTextTrack::newRegionsAvailable(TextTrackLoader* loader)
{
ASSERT_UNUSED(loader, m_loader.get() == loader);
Vector<RefPtr<VTTRegion>> newRegions;
m_loader->getNewRegions(newRegions);
for (auto& newRegion : newRegions) {
newRegion->setTrack(this);
regions()->add(newRegion.releaseNonNull());
}
}
AtomicString LoadableTextTrack::id() const
{
if (!m_trackElement)
return emptyAtom();
return m_trackElement->attributeWithoutSynchronization(idAttr);
}
size_t LoadableTextTrack::trackElementIndex()
{
ASSERT(m_trackElement);
ASSERT(m_trackElement->parentNode());
size_t index = 0;
for (Node* node = m_trackElement->parentNode()->firstChild(); node; node = node->nextSibling()) {
if (!node->hasTagName(trackTag) || !node->parentNode())
continue;
if (node == m_trackElement)
return index;
++index;
}
ASSERT_NOT_REACHED();
return 0;
}
}
#endif