michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "mozilla/dom/HTMLTrackElement.h" michael@0: #include "mozilla/dom/TextTrackCue.h" michael@0: #include "mozilla/dom/TextTrackRegion.h" michael@0: #include "nsComponentManagerUtils.h" michael@0: #include "mozilla/ClearOnShutdown.h" michael@0: michael@0: namespace mozilla { michael@0: namespace dom { michael@0: michael@0: NS_IMPL_CYCLE_COLLECTION_INHERITED(TextTrackCue, michael@0: DOMEventTargetHelper, michael@0: mDocument, michael@0: mTrack, michael@0: mTrackElement, michael@0: mDisplayState, michael@0: mRegion) michael@0: michael@0: NS_IMPL_ADDREF_INHERITED(TextTrackCue, DOMEventTargetHelper) michael@0: NS_IMPL_RELEASE_INHERITED(TextTrackCue, DOMEventTargetHelper) michael@0: NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(TextTrackCue) michael@0: NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper) michael@0: michael@0: StaticRefPtr TextTrackCue::sParserWrapper; michael@0: michael@0: // Set cue setting defaults based on step 19 & seq. michael@0: // in http://dev.w3.org/html5/webvtt/#parsing michael@0: void michael@0: TextTrackCue::SetDefaultCueSettings() michael@0: { michael@0: mPosition = 50; michael@0: mPositionAlign = AlignSetting::Middle; michael@0: mSize = 100; michael@0: mPauseOnExit = false; michael@0: mSnapToLines = true; michael@0: mLineIsAutoKeyword = true; michael@0: mAlign = AlignSetting::Middle; michael@0: mLineAlign = AlignSetting::Start; michael@0: mVertical = DirectionSetting::_empty; michael@0: } michael@0: michael@0: TextTrackCue::TextTrackCue(nsPIDOMWindow* aOwnerWindow, michael@0: double aStartTime, michael@0: double aEndTime, michael@0: const nsAString& aText, michael@0: ErrorResult& aRv) michael@0: : DOMEventTargetHelper(aOwnerWindow) michael@0: , mText(aText) michael@0: , mStartTime(aStartTime) michael@0: , mEndTime(aEndTime) michael@0: , mReset(false) michael@0: { michael@0: SetDefaultCueSettings(); michael@0: MOZ_ASSERT(aOwnerWindow); michael@0: if (NS_FAILED(StashDocument())) { michael@0: aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); michael@0: } michael@0: } michael@0: michael@0: TextTrackCue::TextTrackCue(nsPIDOMWindow* aOwnerWindow, michael@0: double aStartTime, michael@0: double aEndTime, michael@0: const nsAString& aText, michael@0: HTMLTrackElement* aTrackElement, michael@0: ErrorResult& aRv) michael@0: : DOMEventTargetHelper(aOwnerWindow) michael@0: , mText(aText) michael@0: , mStartTime(aStartTime) michael@0: , mEndTime(aEndTime) michael@0: , mTrackElement(aTrackElement) michael@0: , mReset(false) michael@0: { michael@0: SetDefaultCueSettings(); michael@0: MOZ_ASSERT(aOwnerWindow); michael@0: if (NS_FAILED(StashDocument())) { michael@0: aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); michael@0: } michael@0: } michael@0: michael@0: /** Save a reference to our creating document so we don't have to michael@0: * keep getting it from our window. michael@0: */ michael@0: nsresult michael@0: TextTrackCue::StashDocument() michael@0: { michael@0: nsPIDOMWindow* window = GetOwner(); michael@0: if (!window) { michael@0: return NS_ERROR_NO_INTERFACE; michael@0: } michael@0: mDocument = window->GetDoc(); michael@0: if (!mDocument) { michael@0: return NS_ERROR_NOT_AVAILABLE; michael@0: } michael@0: return NS_OK; michael@0: } michael@0: michael@0: already_AddRefed michael@0: TextTrackCue::GetCueAsHTML() michael@0: { michael@0: // mDocument may be null during cycle collector shutdown. michael@0: // See bug 941701. michael@0: if (!mDocument) { michael@0: return nullptr; michael@0: } michael@0: michael@0: if (!sParserWrapper) { michael@0: nsresult rv; michael@0: nsCOMPtr parserWrapper = michael@0: do_CreateInstance(NS_WEBVTTPARSERWRAPPER_CONTRACTID, &rv); michael@0: if (NS_FAILED(rv)) { michael@0: return mDocument->CreateDocumentFragment(); michael@0: } michael@0: sParserWrapper = parserWrapper; michael@0: ClearOnShutdown(&sParserWrapper); michael@0: } michael@0: michael@0: nsPIDOMWindow* window = mDocument->GetWindow(); michael@0: if (!window) { michael@0: return mDocument->CreateDocumentFragment(); michael@0: } michael@0: michael@0: nsCOMPtr div; michael@0: sParserWrapper->ConvertCueToDOMTree(window, this, michael@0: getter_AddRefs(div)); michael@0: if (!div) { michael@0: return mDocument->CreateDocumentFragment(); michael@0: } michael@0: nsRefPtr docFrag = mDocument->CreateDocumentFragment(); michael@0: nsCOMPtr throwAway; michael@0: docFrag->AppendChild(div, getter_AddRefs(throwAway)); michael@0: michael@0: return docFrag.forget(); michael@0: } michael@0: michael@0: void michael@0: TextTrackCue::SetTrackElement(HTMLTrackElement* aTrackElement) michael@0: { michael@0: mTrackElement = aTrackElement; michael@0: } michael@0: michael@0: JSObject* michael@0: TextTrackCue::WrapObject(JSContext* aCx) michael@0: { michael@0: return VTTCueBinding::Wrap(aCx, this); michael@0: } michael@0: michael@0: TextTrackRegion* michael@0: TextTrackCue::GetRegion() michael@0: { michael@0: return mRegion; michael@0: } michael@0: michael@0: void michael@0: TextTrackCue::SetRegion(TextTrackRegion* aRegion) michael@0: { michael@0: if (mRegion == aRegion) { michael@0: return; michael@0: } michael@0: mRegion = aRegion; michael@0: mReset = true; michael@0: } michael@0: michael@0: } // namespace dom michael@0: } // namespace mozilla