content/media/TextTrackCue.cpp

branch
TOR_BUG_9701
changeset 8
97036ab72558
equal deleted inserted replaced
-1:000000000000 0:ab39e980fdfe
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/HTMLTrackElement.h"
7 #include "mozilla/dom/TextTrackCue.h"
8 #include "mozilla/dom/TextTrackRegion.h"
9 #include "nsComponentManagerUtils.h"
10 #include "mozilla/ClearOnShutdown.h"
11
12 namespace mozilla {
13 namespace dom {
14
15 NS_IMPL_CYCLE_COLLECTION_INHERITED(TextTrackCue,
16 DOMEventTargetHelper,
17 mDocument,
18 mTrack,
19 mTrackElement,
20 mDisplayState,
21 mRegion)
22
23 NS_IMPL_ADDREF_INHERITED(TextTrackCue, DOMEventTargetHelper)
24 NS_IMPL_RELEASE_INHERITED(TextTrackCue, DOMEventTargetHelper)
25 NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(TextTrackCue)
26 NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
27
28 StaticRefPtr<nsIWebVTTParserWrapper> TextTrackCue::sParserWrapper;
29
30 // Set cue setting defaults based on step 19 & seq.
31 // in http://dev.w3.org/html5/webvtt/#parsing
32 void
33 TextTrackCue::SetDefaultCueSettings()
34 {
35 mPosition = 50;
36 mPositionAlign = AlignSetting::Middle;
37 mSize = 100;
38 mPauseOnExit = false;
39 mSnapToLines = true;
40 mLineIsAutoKeyword = true;
41 mAlign = AlignSetting::Middle;
42 mLineAlign = AlignSetting::Start;
43 mVertical = DirectionSetting::_empty;
44 }
45
46 TextTrackCue::TextTrackCue(nsPIDOMWindow* aOwnerWindow,
47 double aStartTime,
48 double aEndTime,
49 const nsAString& aText,
50 ErrorResult& aRv)
51 : DOMEventTargetHelper(aOwnerWindow)
52 , mText(aText)
53 , mStartTime(aStartTime)
54 , mEndTime(aEndTime)
55 , mReset(false)
56 {
57 SetDefaultCueSettings();
58 MOZ_ASSERT(aOwnerWindow);
59 if (NS_FAILED(StashDocument())) {
60 aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
61 }
62 }
63
64 TextTrackCue::TextTrackCue(nsPIDOMWindow* aOwnerWindow,
65 double aStartTime,
66 double aEndTime,
67 const nsAString& aText,
68 HTMLTrackElement* aTrackElement,
69 ErrorResult& aRv)
70 : DOMEventTargetHelper(aOwnerWindow)
71 , mText(aText)
72 , mStartTime(aStartTime)
73 , mEndTime(aEndTime)
74 , mTrackElement(aTrackElement)
75 , mReset(false)
76 {
77 SetDefaultCueSettings();
78 MOZ_ASSERT(aOwnerWindow);
79 if (NS_FAILED(StashDocument())) {
80 aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR);
81 }
82 }
83
84 /** Save a reference to our creating document so we don't have to
85 * keep getting it from our window.
86 */
87 nsresult
88 TextTrackCue::StashDocument()
89 {
90 nsPIDOMWindow* window = GetOwner();
91 if (!window) {
92 return NS_ERROR_NO_INTERFACE;
93 }
94 mDocument = window->GetDoc();
95 if (!mDocument) {
96 return NS_ERROR_NOT_AVAILABLE;
97 }
98 return NS_OK;
99 }
100
101 already_AddRefed<DocumentFragment>
102 TextTrackCue::GetCueAsHTML()
103 {
104 // mDocument may be null during cycle collector shutdown.
105 // See bug 941701.
106 if (!mDocument) {
107 return nullptr;
108 }
109
110 if (!sParserWrapper) {
111 nsresult rv;
112 nsCOMPtr<nsIWebVTTParserWrapper> parserWrapper =
113 do_CreateInstance(NS_WEBVTTPARSERWRAPPER_CONTRACTID, &rv);
114 if (NS_FAILED(rv)) {
115 return mDocument->CreateDocumentFragment();
116 }
117 sParserWrapper = parserWrapper;
118 ClearOnShutdown(&sParserWrapper);
119 }
120
121 nsPIDOMWindow* window = mDocument->GetWindow();
122 if (!window) {
123 return mDocument->CreateDocumentFragment();
124 }
125
126 nsCOMPtr<nsIDOMHTMLElement> div;
127 sParserWrapper->ConvertCueToDOMTree(window, this,
128 getter_AddRefs(div));
129 if (!div) {
130 return mDocument->CreateDocumentFragment();
131 }
132 nsRefPtr<DocumentFragment> docFrag = mDocument->CreateDocumentFragment();
133 nsCOMPtr<nsIDOMNode> throwAway;
134 docFrag->AppendChild(div, getter_AddRefs(throwAway));
135
136 return docFrag.forget();
137 }
138
139 void
140 TextTrackCue::SetTrackElement(HTMLTrackElement* aTrackElement)
141 {
142 mTrackElement = aTrackElement;
143 }
144
145 JSObject*
146 TextTrackCue::WrapObject(JSContext* aCx)
147 {
148 return VTTCueBinding::Wrap(aCx, this);
149 }
150
151 TextTrackRegion*
152 TextTrackCue::GetRegion()
153 {
154 return mRegion;
155 }
156
157 void
158 TextTrackCue::SetRegion(TextTrackRegion* aRegion)
159 {
160 if (mRegion == aRegion) {
161 return;
162 }
163 mRegion = aRegion;
164 mReset = true;
165 }
166
167 } // namespace dom
168 } // namespace mozilla

mercurial