michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* vim:set ts=2 sw=2 et tw=78: */ 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: #ifndef mozilla_dom_TextTrackCue_h michael@0: #define mozilla_dom_TextTrackCue_h michael@0: michael@0: #include "mozilla/DOMEventTargetHelper.h" michael@0: #include "mozilla/dom/DocumentFragment.h" michael@0: #include "mozilla/dom/VTTCueBinding.h" michael@0: #include "nsCycleCollectionParticipant.h" michael@0: #include "nsIWebVTTParserWrapper.h" michael@0: #include "mozilla/StaticPtr.h" michael@0: #include "nsIDocument.h" michael@0: #include "mozilla/dom/HTMLDivElement.h" michael@0: #include "mozilla/dom/UnionTypes.h" michael@0: #include "mozilla/dom/TextTrack.h" michael@0: michael@0: namespace mozilla { michael@0: namespace dom { michael@0: michael@0: class HTMLTrackElement; michael@0: class TextTrackRegion; michael@0: michael@0: class TextTrackCue MOZ_FINAL : public DOMEventTargetHelper michael@0: { michael@0: public: michael@0: NS_DECL_ISUPPORTS_INHERITED michael@0: NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(TextTrackCue, DOMEventTargetHelper) michael@0: michael@0: // TextTrackCue WebIDL michael@0: // See bug 868509 about splitting out the WebVTT-specific interfaces. michael@0: static already_AddRefed michael@0: Constructor(GlobalObject& aGlobal, michael@0: double aStartTime, michael@0: double aEndTime, michael@0: const nsAString& aText, michael@0: ErrorResult& aRv) michael@0: { michael@0: nsCOMPtr window = do_QueryInterface(aGlobal.GetAsSupports()); michael@0: nsRefPtr ttcue = new TextTrackCue(window, aStartTime, michael@0: aEndTime, aText, aRv); michael@0: return ttcue.forget(); michael@0: } michael@0: TextTrackCue(nsPIDOMWindow* aGlobal, double aStartTime, double aEndTime, michael@0: const nsAString& aText, ErrorResult& aRv); michael@0: michael@0: TextTrackCue(nsPIDOMWindow* aGlobal, double aStartTime, double aEndTime, michael@0: const nsAString& aText, HTMLTrackElement* aTrackElement, michael@0: ErrorResult& aRv); michael@0: michael@0: virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE; michael@0: michael@0: TextTrack* GetTrack() const michael@0: { michael@0: return mTrack; michael@0: } michael@0: michael@0: void GetId(nsAString& aId) const michael@0: { michael@0: aId = mId; michael@0: } michael@0: michael@0: void SetId(const nsAString& aId) michael@0: { michael@0: if (mId == aId) { michael@0: return; michael@0: } michael@0: michael@0: mId = aId; michael@0: } michael@0: michael@0: double StartTime() const michael@0: { michael@0: return mStartTime; michael@0: } michael@0: michael@0: void SetStartTime(double aStartTime) michael@0: { michael@0: if (mStartTime == aStartTime) { michael@0: return; michael@0: } michael@0: michael@0: mStartTime = aStartTime; michael@0: mReset = true; michael@0: } michael@0: michael@0: double EndTime() const michael@0: { michael@0: return mEndTime; michael@0: } michael@0: michael@0: void SetEndTime(double aEndTime) michael@0: { michael@0: if (mEndTime == aEndTime) { michael@0: return; michael@0: } michael@0: michael@0: mEndTime = aEndTime; michael@0: mReset = true; michael@0: } michael@0: michael@0: bool PauseOnExit() michael@0: { michael@0: return mPauseOnExit; michael@0: } michael@0: michael@0: void SetPauseOnExit(bool aPauseOnExit) michael@0: { michael@0: if (mPauseOnExit == aPauseOnExit) { michael@0: return; michael@0: } michael@0: michael@0: mPauseOnExit = aPauseOnExit; michael@0: } michael@0: michael@0: TextTrackRegion* GetRegion(); michael@0: void SetRegion(TextTrackRegion* aRegion); michael@0: michael@0: DirectionSetting Vertical() const michael@0: { michael@0: return mVertical; michael@0: } michael@0: michael@0: void SetVertical(const DirectionSetting& aVertical) michael@0: { michael@0: if (mVertical == aVertical) { michael@0: return; michael@0: } michael@0: michael@0: mReset = true; michael@0: mVertical = aVertical; michael@0: } michael@0: michael@0: bool SnapToLines() michael@0: { michael@0: return mSnapToLines; michael@0: } michael@0: michael@0: void SetSnapToLines(bool aSnapToLines) michael@0: { michael@0: if (mSnapToLines == aSnapToLines) { michael@0: return; michael@0: } michael@0: michael@0: mReset = true; michael@0: mSnapToLines = aSnapToLines; michael@0: } michael@0: michael@0: void GetLine(OwningLongOrAutoKeyword& aLine) const michael@0: { michael@0: if (mLineIsAutoKeyword) { michael@0: aLine.SetAsAutoKeyword() = AutoKeyword::Auto; michael@0: return; michael@0: } michael@0: aLine.SetAsLong() = mLineLong; michael@0: } michael@0: michael@0: void SetLine(const LongOrAutoKeyword& aLine) michael@0: { michael@0: if (aLine.IsLong() && michael@0: (mLineIsAutoKeyword || (aLine.GetAsLong() != mLineLong))) { michael@0: mLineIsAutoKeyword = false; michael@0: mLineLong = aLine.GetAsLong(); michael@0: mReset = true; michael@0: return; michael@0: } michael@0: if (aLine.IsAutoKeyword() && !mLineIsAutoKeyword) { michael@0: mLineIsAutoKeyword = true; michael@0: mReset = true; michael@0: } michael@0: } michael@0: michael@0: AlignSetting LineAlign() const michael@0: { michael@0: return mLineAlign; michael@0: } michael@0: michael@0: void SetLineAlign(AlignSetting& aLineAlign, ErrorResult& aRv) michael@0: { michael@0: if (mLineAlign == aLineAlign) michael@0: return; michael@0: michael@0: if (aLineAlign == AlignSetting::Left || michael@0: aLineAlign == AlignSetting::Right) { michael@0: return aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR); michael@0: } michael@0: michael@0: mReset = true; michael@0: mLineAlign = aLineAlign; michael@0: } michael@0: michael@0: int32_t Position() const michael@0: { michael@0: return mPosition; michael@0: } michael@0: michael@0: void SetPosition(int32_t aPosition, ErrorResult& aRv) michael@0: { michael@0: if (mPosition == aPosition) { michael@0: return; michael@0: } michael@0: michael@0: if (aPosition > 100 || aPosition < 0){ michael@0: aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR); michael@0: return; michael@0: } michael@0: michael@0: mReset = true; michael@0: mPosition = aPosition; michael@0: } michael@0: michael@0: AlignSetting PositionAlign() const michael@0: { michael@0: return mPositionAlign; michael@0: } michael@0: michael@0: void SetPositionAlign(AlignSetting aPositionAlign, ErrorResult& aRv) michael@0: { michael@0: if (mPositionAlign == aPositionAlign) michael@0: return; michael@0: michael@0: if (aPositionAlign == AlignSetting::Left || michael@0: aPositionAlign == AlignSetting::Right) { michael@0: return aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR); michael@0: } michael@0: michael@0: mReset = true; michael@0: mPositionAlign = aPositionAlign; michael@0: } michael@0: michael@0: int32_t Size() const michael@0: { michael@0: return mSize; michael@0: } michael@0: michael@0: void SetSize(int32_t aSize, ErrorResult& aRv) michael@0: { michael@0: if (mSize == aSize) { michael@0: return; michael@0: } michael@0: michael@0: if (aSize < 0 || aSize > 100) { michael@0: aRv.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR); michael@0: return; michael@0: } michael@0: michael@0: mReset = true; michael@0: mSize = aSize; michael@0: } michael@0: michael@0: AlignSetting Align() const michael@0: { michael@0: return mAlign; michael@0: } michael@0: michael@0: void SetAlign(AlignSetting& aAlign) michael@0: { michael@0: if (mAlign == aAlign) { michael@0: return; michael@0: } michael@0: michael@0: mReset = true; michael@0: mAlign = aAlign; michael@0: } michael@0: michael@0: void GetText(nsAString& aText) const michael@0: { michael@0: aText = mText; michael@0: } michael@0: michael@0: void SetText(const nsAString& aText) michael@0: { michael@0: if (mText == aText) { michael@0: return; michael@0: } michael@0: michael@0: mReset = true; michael@0: mText = aText; michael@0: } michael@0: michael@0: IMPL_EVENT_HANDLER(enter) michael@0: IMPL_EVENT_HANDLER(exit) michael@0: michael@0: HTMLDivElement* GetDisplayState() michael@0: { michael@0: return static_cast(mDisplayState.get()); michael@0: } michael@0: michael@0: void SetDisplayState(HTMLDivElement* aDisplayState) michael@0: { michael@0: mDisplayState = aDisplayState; michael@0: mReset = false; michael@0: } michael@0: michael@0: void Reset() michael@0: { michael@0: mReset = true; michael@0: } michael@0: michael@0: bool HasBeenReset() michael@0: { michael@0: return mReset; michael@0: } michael@0: michael@0: // Helper functions for implementation. michael@0: bool michael@0: operator==(const TextTrackCue& rhs) const michael@0: { michael@0: return mId.Equals(rhs.mId); michael@0: } michael@0: michael@0: const nsAString& Id() const michael@0: { michael@0: return mId; michael@0: } michael@0: michael@0: void SetTrack(TextTrack* aTextTrack) michael@0: { michael@0: mTrack = aTextTrack; michael@0: } michael@0: michael@0: /** michael@0: * Produces a tree of anonymous content based on the tree of the processed michael@0: * cue text. michael@0: * michael@0: * Returns a DocumentFragment that is the head of the tree of anonymous michael@0: * content. michael@0: */ michael@0: already_AddRefed GetCueAsHTML(); michael@0: michael@0: void SetTrackElement(HTMLTrackElement* aTrackElement); michael@0: michael@0: private: michael@0: void SetDefaultCueSettings(); michael@0: nsresult StashDocument(); michael@0: michael@0: nsRefPtr mDocument; michael@0: nsString mText; michael@0: double mStartTime; michael@0: double mEndTime; michael@0: michael@0: nsRefPtr mTrack; michael@0: nsRefPtr mTrackElement; michael@0: nsString mId; michael@0: int32_t mPosition; michael@0: AlignSetting mPositionAlign; michael@0: int32_t mSize; michael@0: bool mPauseOnExit; michael@0: bool mSnapToLines; michael@0: nsRefPtr mRegion; michael@0: DirectionSetting mVertical; michael@0: bool mLineIsAutoKeyword; michael@0: long mLineLong; michael@0: AlignSetting mAlign; michael@0: AlignSetting mLineAlign; michael@0: michael@0: // Holds the computed DOM elements that represent the parsed cue text. michael@0: // http://www.whatwg.org/specs/web-apps/current-work/#text-track-cue-display-state michael@0: nsRefPtr mDisplayState; michael@0: // Tells whether or not we need to recompute mDisplayState. This is set michael@0: // anytime a property that relates to the display of the TextTrackCue is michael@0: // changed. michael@0: bool mReset; michael@0: michael@0: static StaticRefPtr sParserWrapper; michael@0: }; michael@0: michael@0: } // namespace dom michael@0: } // namespace mozilla michael@0: michael@0: #endif // mozilla_dom_TextTrackCue_h