diff --git a/content/html/content/src/HTMLTrackElement.cpp b/content/html/content/src/HTMLTrackElement.cpp index e5cdb1e0d4e9..a6de1af4edad 100644 --- a/content/html/content/src/HTMLTrackElement.cpp +++ b/content/html/content/src/HTMLTrackElement.cpp @@ -130,7 +130,7 @@ HTMLTrackElement::IsWebVTTEnabled() } TextTrack* -HTMLTrackElement::Track() +HTMLTrackElement::GetTrack() { if (!mTrack) { CreateTextTrack(); @@ -153,7 +153,14 @@ HTMLTrackElement::CreateTextTrack() kind = TextTrackKind::Subtitles; } - mTrack = new TextTrack(OwnerDoc()->GetParentObject(), kind, label, srcLang, + bool hasHadScriptObject = true; + nsIScriptGlobalObject* scriptObject = + OwnerDoc()->GetScriptHandlingObject(hasHadScriptObject); + + NS_ENSURE_TRUE_VOID(scriptObject || !hasHadScriptObject); + + nsCOMPtr window = do_QueryInterface(scriptObject); + mTrack = new TextTrack(window, kind, label, srcLang, TextTrackMode::Disabled, TextTrackReadyState::NotLoaded, TextTrackSource::Track); diff --git a/content/html/content/src/HTMLTrackElement.h b/content/html/content/src/HTMLTrackElement.h index b8000c09119b..03cc5bd82091 100644 --- a/content/html/content/src/HTMLTrackElement.h +++ b/content/html/content/src/HTMLTrackElement.h @@ -88,7 +88,7 @@ public: uint16_t ReadyState() const; void SetReadyState(uint16_t aReadyState); - TextTrack* Track(); + TextTrack* GetTrack(); virtual nsresult Clone(nsINodeInfo* aNodeInfo, nsINode** aResult) const MOZ_OVERRIDE; diff --git a/content/html/content/src/TextTrackManager.cpp b/content/html/content/src/TextTrackManager.cpp index 3d208f0ae105..5b19238404b8 100644 --- a/content/html/content/src/TextTrackManager.cpp +++ b/content/html/content/src/TextTrackManager.cpp @@ -85,11 +85,17 @@ TextTrackManager::TextTrackManager(HTMLMediaElement *aMediaElement) , performedTrackSelection(false) { MOZ_COUNT_CTOR(TextTrackManager); - mNewCues = new TextTrackCueList(mMediaElement->OwnerDoc()->GetParentObject()); - mTextTracks = new TextTrackList(mMediaElement->OwnerDoc()->GetParentObject(), - this); - mPendingTextTracks = - new TextTrackList(mMediaElement->OwnerDoc()->GetParentObject(), this); + + bool hasHadScriptObject = true; + nsIScriptGlobalObject* scriptObject = + mMediaElement->OwnerDoc()->GetScriptHandlingObject(hasHadScriptObject); + + NS_ENSURE_TRUE_VOID(scriptObject || !hasHadScriptObject); + + nsCOMPtr window = do_QueryInterface(scriptObject); + mNewCues = new TextTrackCueList(window); + mTextTracks = new TextTrackList(window, this); + mPendingTextTracks = new TextTrackList(window, this); if (!sParserWrapper) { nsCOMPtr parserWrapper = @@ -117,7 +123,7 @@ TextTrackManager::AddTextTrack(TextTrackKind aKind, const nsAString& aLabel, TextTrackReadyState aReadyState, TextTrackSource aTextTrackSource) { - if (!mMediaElement) { + if (!mMediaElement || !mTextTracks) { return nullptr; } nsRefPtr ttrack = @@ -135,7 +141,7 @@ TextTrackManager::AddTextTrack(TextTrackKind aKind, const nsAString& aLabel, void TextTrackManager::AddTextTrack(TextTrack* aTextTrack) { - if (!mMediaElement) { + if (!mMediaElement || !mTextTracks) { return; } mTextTracks->AddTextTrack(aTextTrack, CompareTextTracks(mMediaElement)); @@ -148,6 +154,10 @@ TextTrackManager::AddTextTrack(TextTrack* aTextTrack) void TextTrackManager::AddCues(TextTrack* aTextTrack) { + if (!mNewCues) { + return; + } + TextTrackCueList* cueList = aTextTrack->GetCues(); if (cueList) { bool dummy; @@ -160,6 +170,10 @@ TextTrackManager::AddCues(TextTrack* aTextTrack) void TextTrackManager::RemoveTextTrack(TextTrack* aTextTrack, bool aPendingListOnly) { + if (!mPendingTextTracks || !mTextTracks) { + return; + } + mPendingTextTracks->RemoveTextTrack(aTextTrack); if (aPendingListOnly) { return; @@ -171,12 +185,18 @@ TextTrackManager::RemoveTextTrack(TextTrack* aTextTrack, bool aPendingListOnly) void TextTrackManager::DidSeek() { - mTextTracks->DidSeek(); + if (mTextTracks) { + mTextTracks->DidSeek(); + } } void TextTrackManager::UpdateCueDisplay() { + if (!mMediaElement || !mTextTracks) { + return; + } + nsIFrame* frame = mMediaElement->GetPrimaryFrame(); nsVideoFrame* videoFrame = do_QueryFrame(frame); if (!videoFrame) { @@ -212,12 +232,17 @@ TextTrackManager::UpdateCueDisplay() void TextTrackManager::AddCue(TextTrackCue& aCue) { - mNewCues->AddCue(aCue); + if (mNewCues) { + mNewCues->AddCue(aCue); + } } void TextTrackManager::PopulatePendingList() { + if (!mTextTracks || !mPendingTextTracks || !mMediaElement) { + return; + } uint32_t len = mTextTracks->Length(); bool dummy; for (uint32_t index = 0; index < len; ++index) { @@ -233,7 +258,7 @@ TextTrackManager::PopulatePendingList() void TextTrackManager::HonorUserPreferencesForTrackSelection() { - if (performedTrackSelection) { + if (performedTrackSelection || !mTextTracks) { return; } @@ -316,6 +341,9 @@ void TextTrackManager::GetTextTracksOfKind(TextTrackKind aTextTrackKind, nsTArray& aTextTracks) { + if (!mTextTracks) { + return; + } for (uint32_t i = 0; i < mTextTracks->Length(); i++) { TextTrack* textTrack = (*mTextTracks)[i]; if (textTrack->Kind() == aTextTrackKind) { diff --git a/content/media/TextTrack.cpp b/content/media/TextTrack.cpp index de5e9e2f1ec6..a0e55048a007 100644 --- a/content/media/TextTrack.cpp +++ b/content/media/TextTrack.cpp @@ -16,9 +16,8 @@ namespace mozilla { namespace dom { -NS_IMPL_CYCLE_COLLECTION_INHERITED_5(TextTrack, +NS_IMPL_CYCLE_COLLECTION_INHERITED_4(TextTrack, DOMEventTargetHelper, - mParent, mCueList, mActiveCueList, mTextTrackList, @@ -29,14 +28,14 @@ NS_IMPL_RELEASE_INHERITED(TextTrack, DOMEventTargetHelper) NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(TextTrack) NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper) -TextTrack::TextTrack(nsISupports* aParent, +TextTrack::TextTrack(nsPIDOMWindow* aOwnerWindow, TextTrackKind aKind, const nsAString& aLabel, const nsAString& aLanguage, TextTrackMode aMode, TextTrackReadyState aReadyState, TextTrackSource aTextTrackSource) - : mParent(aParent) + : DOMEventTargetHelper(aOwnerWindow) , mKind(aKind) , mLabel(aLabel) , mLanguage(aLanguage) @@ -45,10 +44,9 @@ TextTrack::TextTrack(nsISupports* aParent, , mTextTrackSource(aTextTrackSource) { SetDefaultSettings(); - SetIsDOMBinding(); } -TextTrack::TextTrack(nsISupports* aParent, +TextTrack::TextTrack(nsPIDOMWindow* aOwnerWindow, TextTrackList* aTextTrackList, TextTrackKind aKind, const nsAString& aLabel, @@ -56,7 +54,7 @@ TextTrack::TextTrack(nsISupports* aParent, TextTrackMode aMode, TextTrackReadyState aReadyState, TextTrackSource aTextTrackSource) - : mParent(aParent) + : DOMEventTargetHelper(aOwnerWindow) , mTextTrackList(aTextTrackList) , mKind(aKind) , mLabel(aLabel) @@ -66,14 +64,14 @@ TextTrack::TextTrack(nsISupports* aParent, , mTextTrackSource(aTextTrackSource) { SetDefaultSettings(); - SetIsDOMBinding(); } void TextTrack::SetDefaultSettings() { - mCueList = new TextTrackCueList(mParent); - mActiveCueList = new TextTrackCueList(mParent); + nsPIDOMWindow* ownerWindow = GetOwner(); + mCueList = new TextTrackCueList(ownerWindow); + mActiveCueList = new TextTrackCueList(ownerWindow); mCuePos = 0; mDirty = false; } diff --git a/content/media/TextTrack.h b/content/media/TextTrack.h index 7ecc5d52fa55..abe3345c9259 100644 --- a/content/media/TextTrack.h +++ b/content/media/TextTrack.h @@ -42,14 +42,14 @@ public: NS_DECL_ISUPPORTS_INHERITED NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(TextTrack, DOMEventTargetHelper) - TextTrack(nsISupports* aParent, + TextTrack(nsPIDOMWindow* aOwnerWindow, TextTrackKind aKind, const nsAString& aLabel, const nsAString& aLanguage, TextTrackMode aMode, TextTrackReadyState aReadyState, TextTrackSource aTextTrackSource); - TextTrack(nsISupports* aParent, + TextTrack(nsPIDOMWindow* aOwnerWindow, TextTrackList* aTextTrackList, TextTrackKind aKind, const nsAString& aLabel, @@ -62,11 +62,6 @@ public: virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE; - nsISupports* GetParentObject() const - { - return mParent; - } - TextTrackKind Kind() const { return mKind; @@ -124,7 +119,6 @@ public: } private: - nsCOMPtr mParent; nsRefPtr mTextTrackList; TextTrackKind mKind; diff --git a/content/media/TextTrackCue.cpp b/content/media/TextTrackCue.cpp index 11b149c2a18b..d36640169209 100644 --- a/content/media/TextTrackCue.cpp +++ b/content/media/TextTrackCue.cpp @@ -43,40 +43,40 @@ TextTrackCue::SetDefaultCueSettings() mVertical = DirectionSetting::_empty; } -TextTrackCue::TextTrackCue(nsISupports* aGlobal, +TextTrackCue::TextTrackCue(nsPIDOMWindow* aOwnerWindow, double aStartTime, double aEndTime, const nsAString& aText, ErrorResult& aRv) - : mText(aText) + : DOMEventTargetHelper(aOwnerWindow) + , mText(aText) , mStartTime(aStartTime) , mEndTime(aEndTime) , mReset(false) { SetDefaultCueSettings(); - MOZ_ASSERT(aGlobal); - SetIsDOMBinding(); - if (NS_FAILED(StashDocument(aGlobal))) { + MOZ_ASSERT(aOwnerWindow); + if (NS_FAILED(StashDocument())) { aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); } } -TextTrackCue::TextTrackCue(nsISupports* aGlobal, +TextTrackCue::TextTrackCue(nsPIDOMWindow* aOwnerWindow, double aStartTime, double aEndTime, const nsAString& aText, HTMLTrackElement* aTrackElement, ErrorResult& aRv) - : mText(aText) + : DOMEventTargetHelper(aOwnerWindow) + , mText(aText) , mStartTime(aStartTime) , mEndTime(aEndTime) , mTrackElement(aTrackElement) , mReset(false) { SetDefaultCueSettings(); - MOZ_ASSERT(aGlobal); - SetIsDOMBinding(); - if (NS_FAILED(StashDocument(aGlobal))) { + MOZ_ASSERT(aOwnerWindow); + if (NS_FAILED(StashDocument())) { aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); } } @@ -85,9 +85,9 @@ TextTrackCue::TextTrackCue(nsISupports* aGlobal, * keep getting it from our window. */ nsresult -TextTrackCue::StashDocument(nsISupports* aGlobal) +TextTrackCue::StashDocument() { - nsCOMPtr window(do_QueryInterface(aGlobal)); + nsPIDOMWindow* window = GetOwner(); if (!window) { return NS_ERROR_NO_INTERFACE; } diff --git a/content/media/TextTrackCue.h b/content/media/TextTrackCue.h index c4b8ed8807c3..37e37b193801 100644 --- a/content/media/TextTrackCue.h +++ b/content/media/TextTrackCue.h @@ -39,24 +39,20 @@ public: const nsAString& aText, ErrorResult& aRv) { - nsRefPtr ttcue = new TextTrackCue(aGlobal.GetAsSupports(), aStartTime, + nsCOMPtr window = do_QueryInterface(aGlobal.GetAsSupports()); + nsRefPtr ttcue = new TextTrackCue(window, aStartTime, aEndTime, aText, aRv); return ttcue.forget(); } - TextTrackCue(nsISupports* aGlobal, double aStartTime, double aEndTime, + TextTrackCue(nsPIDOMWindow* aGlobal, double aStartTime, double aEndTime, const nsAString& aText, ErrorResult& aRv); - TextTrackCue(nsISupports* aGlobal, double aStartTime, double aEndTime, + TextTrackCue(nsPIDOMWindow* aGlobal, double aStartTime, double aEndTime, const nsAString& aText, HTMLTrackElement* aTrackElement, ErrorResult& aRv); virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE; - nsINode* GetParentObject() - { - return mDocument; - } - TextTrack* GetTrack() const { return mTrack; @@ -334,7 +330,7 @@ public: private: void SetDefaultCueSettings(); - nsresult StashDocument(nsISupports* aGlobal); + nsresult StashDocument(); nsRefPtr mDocument; nsString mText; diff --git a/content/media/TextTrackList.cpp b/content/media/TextTrackList.cpp index e4c3e657d588..015c5f8dce0c 100644 --- a/content/media/TextTrackList.cpp +++ b/content/media/TextTrackList.cpp @@ -13,9 +13,8 @@ namespace mozilla { namespace dom { -NS_IMPL_CYCLE_COLLECTION_INHERITED_3(TextTrackList, +NS_IMPL_CYCLE_COLLECTION_INHERITED_2(TextTrackList, DOMEventTargetHelper, - mGlobal, mTextTracks, mTextTrackManager) @@ -24,16 +23,16 @@ NS_IMPL_RELEASE_INHERITED(TextTrackList, DOMEventTargetHelper) NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(TextTrackList) NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper) -TextTrackList::TextTrackList(nsISupports* aGlobal) : mGlobal(aGlobal) +TextTrackList::TextTrackList(nsPIDOMWindow* aOwnerWindow) + : DOMEventTargetHelper(aOwnerWindow) { - SetIsDOMBinding(); } -TextTrackList::TextTrackList(nsISupports* aGlobal, TextTrackManager* aTextTrackManager) - : mGlobal(aGlobal) +TextTrackList::TextTrackList(nsPIDOMWindow* aOwnerWindow, + TextTrackManager* aTextTrackManager) + : DOMEventTargetHelper(aOwnerWindow) , mTextTrackManager(aTextTrackManager) { - SetIsDOMBinding(); } void @@ -84,7 +83,7 @@ TextTrackList::AddTextTrack(TextTrackKind aKind, TextTrackSource aTextTrackSource, const CompareTextTracks& aCompareTT) { - nsRefPtr track = new TextTrack(mGlobal, this, aKind, aLabel, + nsRefPtr track = new TextTrack(GetOwner(), this, aKind, aLabel, aLanguage, aMode, aReadyState, aTextTrackSource); AddTextTrack(track, aCompareTT); diff --git a/content/media/TextTrackList.h b/content/media/TextTrackList.h index 870149efa52f..bd7e361007e3 100644 --- a/content/media/TextTrackList.h +++ b/content/media/TextTrackList.h @@ -26,16 +26,11 @@ public: NS_DECL_ISUPPORTS_INHERITED NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(TextTrackList, DOMEventTargetHelper) - TextTrackList(nsISupports* aGlobal); - TextTrackList(nsISupports* aGlobal, TextTrackManager* aTextTrackManager); + TextTrackList(nsPIDOMWindow* aOwnerWindow); + TextTrackList(nsPIDOMWindow* aOwnerWindow, TextTrackManager* aTextTrackManager); virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE; - nsISupports* GetParentObject() const - { - return mGlobal; - } - uint32_t Length() const { return mTextTracks.Length(); @@ -72,7 +67,6 @@ public: IMPL_EVENT_HANDLER(removetrack) private: - nsCOMPtr mGlobal; nsTArray< nsRefPtr > mTextTracks; nsRefPtr mTextTrackManager; diff --git a/dom/webidl/HTMLTrackElement.webidl b/dom/webidl/HTMLTrackElement.webidl index fa31b6993c1e..c432d0c20f37 100644 --- a/dom/webidl/HTMLTrackElement.webidl +++ b/dom/webidl/HTMLTrackElement.webidl @@ -26,5 +26,5 @@ interface HTMLTrackElement : HTMLElement { const unsigned short ERROR = 3; readonly attribute unsigned short readyState; - readonly attribute TextTrack track; + readonly attribute TextTrack? track; };