Backed out 35 changesets (bug 941158, bug 972518, bug 959520, bug 986063, bug 948895...
[gecko.git] / content / media / TextTrack.cpp
blob49dc9ca5481d40a5d1004baf8278fb1ea1131dc9
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:set ts=2 sw=2 et tw=78: */
3 /* This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #include "mozilla/dom/TextTrack.h"
8 #include "mozilla/dom/TextTrackBinding.h"
9 #include "mozilla/dom/TextTrackCue.h"
10 #include "mozilla/dom/TextTrackCueList.h"
11 #include "mozilla/dom/TextTrackRegion.h"
12 #include "mozilla/dom/TextTrackRegionList.h"
13 #include "mozilla/dom/HTMLMediaElement.h"
14 #include "mozilla/dom/HTMLTrackElement.h"
16 namespace mozilla {
17 namespace dom {
19 NS_IMPL_CYCLE_COLLECTION_INHERITED_5(TextTrack,
20 nsDOMEventTargetHelper,
21 mParent,
22 mMediaElement,
23 mCueList,
24 mActiveCueList,
25 mRegionList)
27 NS_IMPL_ADDREF_INHERITED(TextTrack, nsDOMEventTargetHelper)
28 NS_IMPL_RELEASE_INHERITED(TextTrack, nsDOMEventTargetHelper)
29 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(TextTrack)
30 NS_INTERFACE_MAP_END_INHERITING(nsDOMEventTargetHelper)
32 TextTrack::TextTrack(nsISupports* aParent)
33 : mParent(aParent)
35 SetDefaultSettings();
36 SetIsDOMBinding();
39 TextTrack::TextTrack(nsISupports* aParent, HTMLMediaElement* aMediaElement)
40 : mParent(aParent)
41 , mMediaElement(aMediaElement)
43 SetDefaultSettings();
44 SetIsDOMBinding();
47 TextTrack::TextTrack(nsISupports* aParent,
48 HTMLMediaElement* aMediaElement,
49 TextTrackKind aKind,
50 const nsAString& aLabel,
51 const nsAString& aLanguage)
52 : mParent(aParent)
53 , mMediaElement(aMediaElement)
55 SetDefaultSettings();
56 mKind = aKind;
57 mLabel = aLabel;
58 mLanguage = aLanguage;
59 SetIsDOMBinding();
62 void
63 TextTrack::SetDefaultSettings()
65 mKind = TextTrackKind::Subtitles;
66 mMode = TextTrackMode::Hidden;
67 mCueList = new TextTrackCueList(mParent);
68 mActiveCueList = new TextTrackCueList(mParent);
69 mRegionList = new TextTrackRegionList(mParent);
70 mCuePos = 0;
71 mDirty = false;
72 mReadyState = HTMLTrackElement::NONE;
75 void
76 TextTrack::Update(double aTime)
78 if (mCueList) {
79 mCueList->Update(aTime);
83 JSObject*
84 TextTrack::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aScope)
86 return TextTrackBinding::Wrap(aCx, aScope, this);
89 void
90 TextTrack::SetMode(TextTrackMode aValue)
92 mMode = aValue;
95 void
96 TextTrack::AddCue(TextTrackCue& aCue)
98 mCueList->AddCue(aCue);
99 SetDirty();
102 void
103 TextTrack::RemoveCue(TextTrackCue& aCue, ErrorResult& aRv)
105 mCueList->RemoveCue(aCue, aRv);
106 SetDirty();
109 void
110 TextTrack::CueChanged(TextTrackCue& aCue)
112 //XXX: Implement Cue changed. Bug 867823.
115 void
116 TextTrack::AddRegion(TextTrackRegion& aRegion)
118 TextTrackRegion* region = mRegionList->GetRegionById(aRegion.Id());
119 if (!region) {
120 aRegion.SetTextTrack(this);
121 mRegionList->AddTextTrackRegion(&aRegion);
122 return;
125 region->CopyValues(aRegion);
128 void
129 TextTrack::RemoveRegion(const TextTrackRegion& aRegion, ErrorResult& aRv)
131 if (!mRegionList->GetRegionById(aRegion.Id())) {
132 aRv.Throw(NS_ERROR_DOM_NOT_FOUND_ERR);
133 return;
136 mRegionList->RemoveTextTrackRegion(aRegion);
139 TextTrackCueList*
140 TextTrack::GetActiveCues()
142 if (mMode == TextTrackMode::Disabled || !mMediaElement) {
143 return nullptr;
146 // If we are dirty, i.e. an event happened that may cause the sorted mCueList
147 // to have changed like a seek or an insert for a cue, than we need to rebuild
148 // the active cue list from scratch.
149 if (mDirty) {
150 mCuePos = 0;
151 mDirty = true;
152 mActiveCueList->RemoveAll();
155 double playbackTime = mMediaElement->CurrentTime();
156 // Remove all the cues from the active cue list whose end times now occur
157 // earlier then the current playback time. When we reach a cue whose end time
158 // is valid we can safely stop iterating as the list is sorted.
159 for (uint32_t i = 0; i < mActiveCueList->Length() &&
160 (*mActiveCueList)[i]->EndTime() < playbackTime; i++) {
161 mActiveCueList->RemoveCueAt(i);
163 // Add all the cues, starting from the position of the last cue that was
164 // added, that have valid start and end times for the current playback time.
165 // We can stop iterating safely once we encounter a cue that does not have
166 // valid times for the current playback time as the cue list is sorted.
167 for (; mCuePos < mCueList->Length(); mCuePos++) {
168 TextTrackCue* cue = (*mCueList)[mCuePos];
169 if (cue->StartTime() > playbackTime || cue->EndTime() < playbackTime) {
170 break;
172 mActiveCueList->AddCue(*cue);
174 return mActiveCueList;
177 uint16_t
178 TextTrack::ReadyState() const
180 return mReadyState;
183 void
184 TextTrack::SetReadyState(uint16_t aState)
186 mReadyState = aState;
187 if (mMediaElement && (mReadyState == HTMLTrackElement::LOADED ||
188 mReadyState == HTMLTrackElement::ERROR)) {
189 mMediaElement->RemoveTextTrack(this, true);
193 } // namespace dom
194 } // namespace mozilla