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/. */
6 #include "mozilla/dom/HTMLTrackElement.h"
7 #include "mozilla/dom/TextTrackCue.h"
8 #include "mozilla/dom/TextTrackList.h"
9 #include "mozilla/dom/TextTrackRegion.h"
10 #include "nsComponentManagerUtils.h"
11 #include "mozilla/ClearOnShutdown.h"
16 NS_IMPL_CYCLE_COLLECTION_INHERITED(TextTrackCue
, DOMEventTargetHelper
,
17 mDocument
, mTrack
, mTrackElement
,
18 mDisplayState
, mRegion
)
20 NS_IMPL_ADDREF_INHERITED(TextTrackCue
, DOMEventTargetHelper
)
21 NS_IMPL_RELEASE_INHERITED(TextTrackCue
, DOMEventTargetHelper
)
22 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(TextTrackCue
)
23 NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper
)
25 StaticRefPtr
<nsIWebVTTParserWrapper
> TextTrackCue::sParserWrapper
;
27 // Set cue setting defaults based on step 19 & seq.
28 // in http://dev.w3.org/html5/webvtt/#parsing
29 void TextTrackCue::SetDefaultCueSettings() {
30 mPositionIsAutoKeyword
= true;
31 mPositionAlign
= PositionAlignSetting::Center
;
35 mLineIsAutoKeyword
= true;
36 mAlign
= AlignSetting::Center
;
37 mLineAlign
= LineAlignSetting::Start
;
38 mVertical
= DirectionSetting::_empty
;
42 TextTrackCue::TextTrackCue(nsPIDOMWindowInner
* aOwnerWindow
, double aStartTime
,
43 double aEndTime
, const nsAString
& aText
,
45 : DOMEventTargetHelper(aOwnerWindow
),
47 mStartTime(aStartTime
),
51 mReset(false, "TextTrackCue::mReset"),
52 mHaveStartedWatcher(false),
54 this, GetOwnerGlobal()->AbstractMainThreadFor(TaskCategory::Other
)) {
55 SetDefaultCueSettings();
56 MOZ_ASSERT(aOwnerWindow
);
57 if (NS_FAILED(StashDocument())) {
58 aRv
.Throw(NS_ERROR_DOM_INVALID_STATE_ERR
);
62 TextTrackCue::TextTrackCue(nsPIDOMWindowInner
* aOwnerWindow
, double aStartTime
,
63 double aEndTime
, const nsAString
& aText
,
64 HTMLTrackElement
* aTrackElement
, ErrorResult
& aRv
)
65 : DOMEventTargetHelper(aOwnerWindow
),
67 mStartTime(aStartTime
),
69 mTrackElement(aTrackElement
),
72 mReset(false, "TextTrackCue::mReset"),
73 mHaveStartedWatcher(false),
75 this, GetOwnerGlobal()->AbstractMainThreadFor(TaskCategory::Other
)) {
76 SetDefaultCueSettings();
77 MOZ_ASSERT(aOwnerWindow
);
78 if (NS_FAILED(StashDocument())) {
79 aRv
.Throw(NS_ERROR_DOM_INVALID_STATE_ERR
);
83 TextTrackCue::~TextTrackCue() {}
85 /** Save a reference to our creating document so we don't have to
86 * keep getting it from our window.
88 nsresult
TextTrackCue::StashDocument() {
89 nsPIDOMWindowInner
* window
= GetOwner();
91 return NS_ERROR_NO_INTERFACE
;
93 mDocument
= window
->GetDoc();
95 return NS_ERROR_NOT_AVAILABLE
;
100 already_AddRefed
<DocumentFragment
> TextTrackCue::GetCueAsHTML() {
101 // mDocument may be null during cycle collector shutdown.
107 if (!sParserWrapper
) {
109 nsCOMPtr
<nsIWebVTTParserWrapper
> parserWrapper
=
110 do_CreateInstance(NS_WEBVTTPARSERWRAPPER_CONTRACTID
, &rv
);
112 return mDocument
->CreateDocumentFragment();
114 sParserWrapper
= parserWrapper
;
115 ClearOnShutdown(&sParserWrapper
);
118 nsPIDOMWindowInner
* window
= mDocument
->GetInnerWindow();
120 return mDocument
->CreateDocumentFragment();
123 RefPtr
<DocumentFragment
> frag
;
124 sParserWrapper
->ConvertCueToDOMTree(window
, this, getter_AddRefs(frag
));
126 return mDocument
->CreateDocumentFragment();
128 return frag
.forget();
131 void TextTrackCue::SetTrackElement(HTMLTrackElement
* aTrackElement
) {
132 mTrackElement
= aTrackElement
;
135 JSObject
* TextTrackCue::WrapObject(JSContext
* aCx
,
136 JS::Handle
<JSObject
*> aGivenProto
) {
137 return VTTCue_Binding::Wrap(aCx
, this, aGivenProto
);
140 TextTrackRegion
* TextTrackCue::GetRegion() { return mRegion
; }
142 void TextTrackCue::SetRegion(TextTrackRegion
* aRegion
) {
143 if (mRegion
== aRegion
) {
150 double TextTrackCue::ComputedLine() {
151 // See spec https://w3c.github.io/webvtt/#cue-computed-line
152 if (!mLineIsAutoKeyword
&& !mSnapToLines
&& (mLine
< 0.0 || mLine
> 100.0)) {
154 } else if (!mLineIsAutoKeyword
) {
156 } else if (mLineIsAutoKeyword
&& !mSnapToLines
) {
158 } else if (!mTrack
|| !mTrack
->GetTextTrackList() ||
159 !mTrack
->GetTextTrackList()->GetMediaElement()) {
163 RefPtr
<TextTrackList
> trackList
= mTrack
->GetTextTrackList();
165 uint32_t showingTracksNum
= 0;
166 for (uint32_t idx
= 0; idx
< trackList
->Length(); idx
++) {
167 RefPtr
<TextTrack
> track
= trackList
->IndexedGetter(idx
, dummy
);
168 if (track
->Mode() == TextTrackMode::Showing
) {
172 if (mTrack
== track
) {
177 return (-1.0) * showingTracksNum
;
180 double TextTrackCue::ComputedPosition() {
181 // See spec https://w3c.github.io/webvtt/#cue-computed-position
182 if (!mPositionIsAutoKeyword
) {
184 } else if (mAlign
== AlignSetting::Left
) {
186 } else if (mAlign
== AlignSetting::Right
) {
192 PositionAlignSetting
TextTrackCue::ComputedPositionAlign() {
193 // See spec https://w3c.github.io/webvtt/#cue-computed-position-alignment
194 if (mPositionAlign
!= PositionAlignSetting::Auto
) {
195 return mPositionAlign
;
196 } else if (mAlign
== AlignSetting::Left
) {
197 return PositionAlignSetting::Line_left
;
198 } else if (mAlign
== AlignSetting::Right
) {
199 return PositionAlignSetting::Line_right
;
201 return PositionAlignSetting::Center
;
204 void TextTrackCue::NotifyDisplayStatesChanged() {
209 if (!mTrack
|| !mTrack
->GetTextTrackList() ||
210 !mTrack
->GetTextTrackList()->GetMediaElement()) {
214 mTrack
->GetTextTrackList()
216 ->NotifyCueDisplayStatesChanged();
220 } // namespace mozilla