|
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 |