Bug 1526591 - Remove devtools.inspector.shapesHighlighter.enabled pref. r=rcaliman
[gecko.git] / dom / media / TextTrackCue.cpp
blob5553d7082ea71ae70e67f5b2476cea1bdf770ff4
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"
13 namespace mozilla {
14 namespace dom {
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;
32 mSize = 100.0;
33 mPauseOnExit = false;
34 mSnapToLines = true;
35 mLineIsAutoKeyword = true;
36 mAlign = AlignSetting::Center;
37 mLineAlign = LineAlignSetting::Start;
38 mVertical = DirectionSetting::_empty;
39 mActive = false;
42 TextTrackCue::TextTrackCue(nsPIDOMWindowInner* aOwnerWindow, double aStartTime,
43 double aEndTime, const nsAString& aText,
44 ErrorResult& aRv)
45 : DOMEventTargetHelper(aOwnerWindow),
46 mText(aText),
47 mStartTime(aStartTime),
48 mEndTime(aEndTime),
49 mPosition(0.0),
50 mLine(0.0),
51 mReset(false, "TextTrackCue::mReset"),
52 mHaveStartedWatcher(false),
53 mWatchManager(
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),
66 mText(aText),
67 mStartTime(aStartTime),
68 mEndTime(aEndTime),
69 mTrackElement(aTrackElement),
70 mPosition(0.0),
71 mLine(0.0),
72 mReset(false, "TextTrackCue::mReset"),
73 mHaveStartedWatcher(false),
74 mWatchManager(
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();
90 if (!window) {
91 return NS_ERROR_NO_INTERFACE;
93 mDocument = window->GetDoc();
94 if (!mDocument) {
95 return NS_ERROR_NOT_AVAILABLE;
97 return NS_OK;
100 already_AddRefed<DocumentFragment> TextTrackCue::GetCueAsHTML() {
101 // mDocument may be null during cycle collector shutdown.
102 // See bug 941701.
103 if (!mDocument) {
104 return nullptr;
107 if (!sParserWrapper) {
108 nsresult rv;
109 nsCOMPtr<nsIWebVTTParserWrapper> parserWrapper =
110 do_CreateInstance(NS_WEBVTTPARSERWRAPPER_CONTRACTID, &rv);
111 if (NS_FAILED(rv)) {
112 return mDocument->CreateDocumentFragment();
114 sParserWrapper = parserWrapper;
115 ClearOnShutdown(&sParserWrapper);
118 nsPIDOMWindowInner* window = mDocument->GetInnerWindow();
119 if (!window) {
120 return mDocument->CreateDocumentFragment();
123 RefPtr<DocumentFragment> frag;
124 sParserWrapper->ConvertCueToDOMTree(window, this, getter_AddRefs(frag));
125 if (!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) {
144 return;
146 mRegion = aRegion;
147 mReset = true;
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)) {
153 return 100.0;
154 } else if (!mLineIsAutoKeyword) {
155 return mLine;
156 } else if (mLineIsAutoKeyword && !mSnapToLines) {
157 return 100.0;
158 } else if (!mTrack || !mTrack->GetTextTrackList() ||
159 !mTrack->GetTextTrackList()->GetMediaElement()) {
160 return -1.0;
163 RefPtr<TextTrackList> trackList = mTrack->GetTextTrackList();
164 bool dummy;
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) {
169 showingTracksNum++;
172 if (mTrack == track) {
173 break;
177 return (-1.0) * showingTracksNum;
180 double TextTrackCue::ComputedPosition() {
181 // See spec https://w3c.github.io/webvtt/#cue-computed-position
182 if (!mPositionIsAutoKeyword) {
183 return mPosition;
184 } else if (mAlign == AlignSetting::Left) {
185 return 0.0;
186 } else if (mAlign == AlignSetting::Right) {
187 return 100.0;
189 return 50.0;
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() {
205 if (!mReset) {
206 return;
209 if (!mTrack || !mTrack->GetTextTrackList() ||
210 !mTrack->GetTextTrackList()->GetMediaElement()) {
211 return;
214 mTrack->GetTextTrackList()
215 ->GetMediaElement()
216 ->NotifyCueDisplayStatesChanged();
219 } // namespace dom
220 } // namespace mozilla