1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/content/media/TextTrackCue.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,168 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "mozilla/dom/HTMLTrackElement.h" 1.10 +#include "mozilla/dom/TextTrackCue.h" 1.11 +#include "mozilla/dom/TextTrackRegion.h" 1.12 +#include "nsComponentManagerUtils.h" 1.13 +#include "mozilla/ClearOnShutdown.h" 1.14 + 1.15 +namespace mozilla { 1.16 +namespace dom { 1.17 + 1.18 +NS_IMPL_CYCLE_COLLECTION_INHERITED(TextTrackCue, 1.19 + DOMEventTargetHelper, 1.20 + mDocument, 1.21 + mTrack, 1.22 + mTrackElement, 1.23 + mDisplayState, 1.24 + mRegion) 1.25 + 1.26 +NS_IMPL_ADDREF_INHERITED(TextTrackCue, DOMEventTargetHelper) 1.27 +NS_IMPL_RELEASE_INHERITED(TextTrackCue, DOMEventTargetHelper) 1.28 +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(TextTrackCue) 1.29 +NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper) 1.30 + 1.31 +StaticRefPtr<nsIWebVTTParserWrapper> TextTrackCue::sParserWrapper; 1.32 + 1.33 +// Set cue setting defaults based on step 19 & seq. 1.34 +// in http://dev.w3.org/html5/webvtt/#parsing 1.35 +void 1.36 +TextTrackCue::SetDefaultCueSettings() 1.37 +{ 1.38 + mPosition = 50; 1.39 + mPositionAlign = AlignSetting::Middle; 1.40 + mSize = 100; 1.41 + mPauseOnExit = false; 1.42 + mSnapToLines = true; 1.43 + mLineIsAutoKeyword = true; 1.44 + mAlign = AlignSetting::Middle; 1.45 + mLineAlign = AlignSetting::Start; 1.46 + mVertical = DirectionSetting::_empty; 1.47 +} 1.48 + 1.49 +TextTrackCue::TextTrackCue(nsPIDOMWindow* aOwnerWindow, 1.50 + double aStartTime, 1.51 + double aEndTime, 1.52 + const nsAString& aText, 1.53 + ErrorResult& aRv) 1.54 + : DOMEventTargetHelper(aOwnerWindow) 1.55 + , mText(aText) 1.56 + , mStartTime(aStartTime) 1.57 + , mEndTime(aEndTime) 1.58 + , mReset(false) 1.59 +{ 1.60 + SetDefaultCueSettings(); 1.61 + MOZ_ASSERT(aOwnerWindow); 1.62 + if (NS_FAILED(StashDocument())) { 1.63 + aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); 1.64 + } 1.65 +} 1.66 + 1.67 +TextTrackCue::TextTrackCue(nsPIDOMWindow* aOwnerWindow, 1.68 + double aStartTime, 1.69 + double aEndTime, 1.70 + const nsAString& aText, 1.71 + HTMLTrackElement* aTrackElement, 1.72 + ErrorResult& aRv) 1.73 + : DOMEventTargetHelper(aOwnerWindow) 1.74 + , mText(aText) 1.75 + , mStartTime(aStartTime) 1.76 + , mEndTime(aEndTime) 1.77 + , mTrackElement(aTrackElement) 1.78 + , mReset(false) 1.79 +{ 1.80 + SetDefaultCueSettings(); 1.81 + MOZ_ASSERT(aOwnerWindow); 1.82 + if (NS_FAILED(StashDocument())) { 1.83 + aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); 1.84 + } 1.85 +} 1.86 + 1.87 +/** Save a reference to our creating document so we don't have to 1.88 + * keep getting it from our window. 1.89 + */ 1.90 +nsresult 1.91 +TextTrackCue::StashDocument() 1.92 +{ 1.93 + nsPIDOMWindow* window = GetOwner(); 1.94 + if (!window) { 1.95 + return NS_ERROR_NO_INTERFACE; 1.96 + } 1.97 + mDocument = window->GetDoc(); 1.98 + if (!mDocument) { 1.99 + return NS_ERROR_NOT_AVAILABLE; 1.100 + } 1.101 + return NS_OK; 1.102 +} 1.103 + 1.104 +already_AddRefed<DocumentFragment> 1.105 +TextTrackCue::GetCueAsHTML() 1.106 +{ 1.107 + // mDocument may be null during cycle collector shutdown. 1.108 + // See bug 941701. 1.109 + if (!mDocument) { 1.110 + return nullptr; 1.111 + } 1.112 + 1.113 + if (!sParserWrapper) { 1.114 + nsresult rv; 1.115 + nsCOMPtr<nsIWebVTTParserWrapper> parserWrapper = 1.116 + do_CreateInstance(NS_WEBVTTPARSERWRAPPER_CONTRACTID, &rv); 1.117 + if (NS_FAILED(rv)) { 1.118 + return mDocument->CreateDocumentFragment(); 1.119 + } 1.120 + sParserWrapper = parserWrapper; 1.121 + ClearOnShutdown(&sParserWrapper); 1.122 + } 1.123 + 1.124 + nsPIDOMWindow* window = mDocument->GetWindow(); 1.125 + if (!window) { 1.126 + return mDocument->CreateDocumentFragment(); 1.127 + } 1.128 + 1.129 + nsCOMPtr<nsIDOMHTMLElement> div; 1.130 + sParserWrapper->ConvertCueToDOMTree(window, this, 1.131 + getter_AddRefs(div)); 1.132 + if (!div) { 1.133 + return mDocument->CreateDocumentFragment(); 1.134 + } 1.135 + nsRefPtr<DocumentFragment> docFrag = mDocument->CreateDocumentFragment(); 1.136 + nsCOMPtr<nsIDOMNode> throwAway; 1.137 + docFrag->AppendChild(div, getter_AddRefs(throwAway)); 1.138 + 1.139 + return docFrag.forget(); 1.140 +} 1.141 + 1.142 +void 1.143 +TextTrackCue::SetTrackElement(HTMLTrackElement* aTrackElement) 1.144 +{ 1.145 + mTrackElement = aTrackElement; 1.146 +} 1.147 + 1.148 +JSObject* 1.149 +TextTrackCue::WrapObject(JSContext* aCx) 1.150 +{ 1.151 + return VTTCueBinding::Wrap(aCx, this); 1.152 +} 1.153 + 1.154 +TextTrackRegion* 1.155 +TextTrackCue::GetRegion() 1.156 +{ 1.157 + return mRegion; 1.158 +} 1.159 + 1.160 +void 1.161 +TextTrackCue::SetRegion(TextTrackRegion* aRegion) 1.162 +{ 1.163 + if (mRegion == aRegion) { 1.164 + return; 1.165 + } 1.166 + mRegion = aRegion; 1.167 + mReset = true; 1.168 +} 1.169 + 1.170 +} // namespace dom 1.171 +} // namespace mozilla