mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
7141a09f73
- 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.
121 lines
2.8 KiB
C++
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
|