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