gecko/content/media/TextTrackCueList.cpp
Rick Eyre 5939f3d97a Bug 883173 - Part 3: Implement TextTrack::ActiveCues. r=cpearce, r=rillian
- Active cues now returns the subset of cues in mCueList that are valid
for the current playback time.
- Introduces new code in media element, when seeking, and in TextTrack, when
adding and removing cues, to mark the active cue list as dirty so that we know
when we might need to rebuild the list completely.
2013-06-14 16:10:36 -04:00

121 lines
2.8 KiB
C++

/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "mozilla/dom/TextTrackCueList.h"
#include "mozilla/dom/TextTrackCueListBinding.h"
#include "mozilla/dom/TextTrackCue.h"
namespace mozilla {
namespace dom {
class CompareCuesByTime
{
public:
bool Equals(TextTrackCue* aOne, TextTrackCue* aTwo) const {
return aOne->StartTime() == aTwo->StartTime() &&
aOne->EndTime() == aTwo->EndTime();
}
bool LessThan(TextTrackCue* aOne, TextTrackCue* aTwo) const {
return aOne->StartTime() < aTwo->StartTime() ||
(aOne->StartTime() == aTwo->StartTime() &&
aOne->EndTime() < aTwo->EndTime());
}
};
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_2(TextTrackCueList, mParent, mList)
NS_IMPL_CYCLE_COLLECTING_ADDREF(TextTrackCueList)
NS_IMPL_CYCLE_COLLECTING_RELEASE(TextTrackCueList)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(TextTrackCueList)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
TextTrackCueList::TextTrackCueList(nsISupports* aParent) : mParent(aParent)
{
SetIsDOMBinding();
}
void
TextTrackCueList::Update(double aTime)
{
const uint32_t length = mList.Length();
for (uint32_t i = 0; i < length; i++) {
if (aTime > mList[i]->StartTime() && aTime < mList[i]->EndTime()) {
mList[i]->RenderCue();
}
}
}
JSObject*
TextTrackCueList::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope)
{
return TextTrackCueListBinding::Wrap(aCx, aScope, this);
}
TextTrackCue*
TextTrackCueList::IndexedGetter(uint32_t aIndex, bool& aFound)
{
aFound = aIndex < mList.Length();
return aFound ? mList[aIndex] : nullptr;
}
TextTrackCue*
TextTrackCueList::operator[](uint32_t aIndex)
{
return mList.SafeElementAt(aIndex, nullptr);
}
TextTrackCue*
TextTrackCueList::GetCueById(const nsAString& aId)
{
if (aId.IsEmpty()) {
return nullptr;
}
for (uint32_t i = 0; i < mList.Length(); i++) {
if (aId.Equals(mList[i]->Id())) {
return mList[i];
}
}
return nullptr;
}
void
TextTrackCueList::AddCue(TextTrackCue& aCue)
{
if (mList.Contains(&aCue)) {
return;
}
mList.InsertElementSorted(&aCue, CompareCuesByTime());
}
void
TextTrackCueList::RemoveCue(TextTrackCue& aCue, ErrorResult& aRv)
{
if (!mList.Contains(&aCue)) {
aRv.Throw(NS_ERROR_DOM_NOT_FOUND_ERR);
return;
}
mList.RemoveElement(&aCue);
}
void
TextTrackCueList::RemoveCueAt(uint32_t aIndex)
{
if (aIndex < mList.Length()) {
mList.RemoveElementAt(aIndex);
}
}
void
TextTrackCueList::RemoveAll()
{
mList.Clear();
}
} // namespace dom
} // namespace mozilla