TextTrackCueList.cpp (3238B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #include "mozilla/dom/TextTrackCueList.h" 7 8 #include "mozilla/dom/TextTrackCue.h" 9 #include "mozilla/dom/TextTrackCueListBinding.h" 10 11 namespace mozilla::dom { 12 13 class CompareCuesByTime { 14 public: 15 bool Equals(TextTrackCue* aOne, TextTrackCue* aTwo) const { return false; } 16 bool LessThan(TextTrackCue* aOne, TextTrackCue* aTwo) const { 17 return aOne->StartTime() < aTwo->StartTime() || 18 (aOne->StartTime() == aTwo->StartTime() && 19 aOne->EndTime() >= aTwo->EndTime()); 20 } 21 }; 22 23 NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(TextTrackCueList, mParent, mList) 24 25 NS_IMPL_CYCLE_COLLECTING_ADDREF(TextTrackCueList) 26 NS_IMPL_CYCLE_COLLECTING_RELEASE(TextTrackCueList) 27 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(TextTrackCueList) 28 NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY 29 NS_INTERFACE_MAP_ENTRY(nsISupports) 30 NS_INTERFACE_MAP_END 31 32 TextTrackCueList::TextTrackCueList(nsISupports* aParent) : mParent(aParent) {} 33 34 TextTrackCueList::~TextTrackCueList() = default; 35 36 JSObject* TextTrackCueList::WrapObject(JSContext* aCx, 37 JS::Handle<JSObject*> aGivenProto) { 38 return TextTrackCueList_Binding::Wrap(aCx, this, aGivenProto); 39 } 40 41 TextTrackCue* TextTrackCueList::IndexedGetter(uint32_t aIndex, bool& aFound) { 42 aFound = aIndex < mList.Length(); 43 if (!aFound) { 44 return nullptr; 45 } 46 return mList[aIndex]; 47 } 48 49 TextTrackCue* TextTrackCueList::operator[](uint32_t aIndex) { 50 return mList.SafeElementAt(aIndex, nullptr); 51 } 52 53 TextTrackCueList& TextTrackCueList::operator=(const TextTrackCueList& aOther) { 54 mList = aOther.mList.Clone(); 55 return *this; 56 } 57 58 TextTrackCue* TextTrackCueList::GetCueById(const nsAString& aId) { 59 if (aId.IsEmpty()) { 60 return nullptr; 61 } 62 63 for (uint32_t i = 0; i < mList.Length(); i++) { 64 if (aId.Equals(mList[i]->Id())) { 65 return mList[i]; 66 } 67 } 68 return nullptr; 69 } 70 71 void TextTrackCueList::AddCue(TextTrackCue& aCue) { 72 if (mCueSet.Contains(&aCue)) { 73 return; 74 } 75 mList.InsertElementSorted(&aCue, CompareCuesByTime()); 76 mCueSet.Insert(&aCue); 77 } 78 79 void TextTrackCueList::RemoveCue(TextTrackCue& aCue, ErrorResult& aRv) { 80 if (!mCueSet.Contains(&aCue)) { 81 aRv.Throw(NS_ERROR_DOM_NOT_FOUND_ERR); 82 return; 83 } 84 RemoveCue(aCue); 85 } 86 87 void TextTrackCueList::RemoveCue(TextTrackCue& aCue) { 88 mList.RemoveElement(&aCue); 89 mCueSet.Remove(&aCue); 90 } 91 92 void TextTrackCueList::GetArray(nsTArray<RefPtr<TextTrackCue>>& aCues) { 93 aCues = mList.Clone(); 94 } 95 96 void TextTrackCueList::SetCuesInactive() { 97 for (uint32_t i = 0; i < mList.Length(); ++i) { 98 mList[i]->SetActive(false); 99 } 100 } 101 102 void TextTrackCueList::NotifyCueUpdated(TextTrackCue* aCue) { 103 if (aCue) { 104 mList.RemoveElement(aCue); 105 mList.InsertElementSorted(aCue, CompareCuesByTime()); 106 } 107 } 108 109 bool TextTrackCueList::IsCueExist(TextTrackCue* aCue) const { 110 return aCue && mCueSet.Contains(aCue); 111 } 112 113 nsTArray<RefPtr<TextTrackCue>>& TextTrackCueList::GetCuesArray() { 114 return mList; 115 } 116 117 } // namespace mozilla::dom