Bug 950308 - TextTrack, TextTrackCue, TextTrackList should BindToOwner. r=smaug

This commit is contained in:
Rick Eyre 2014-04-07 13:58:38 -04:00
parent 8f5afee871
commit fd2961dce2
10 changed files with 85 additions and 69 deletions

View File

@ -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<nsPIDOMWindow> window = do_QueryInterface(scriptObject);
mTrack = new TextTrack(window, kind, label, srcLang,
TextTrackMode::Disabled,
TextTrackReadyState::NotLoaded,
TextTrackSource::Track);

View File

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

View File

@ -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<nsPIDOMWindow> window = do_QueryInterface(scriptObject);
mNewCues = new TextTrackCueList(window);
mTextTracks = new TextTrackList(window, this);
mPendingTextTracks = new TextTrackList(window, this);
if (!sParserWrapper) {
nsCOMPtr<nsIWebVTTParserWrapper> parserWrapper =
@ -117,7 +123,7 @@ TextTrackManager::AddTextTrack(TextTrackKind aKind, const nsAString& aLabel,
TextTrackReadyState aReadyState,
TextTrackSource aTextTrackSource)
{
if (!mMediaElement) {
if (!mMediaElement || !mTextTracks) {
return nullptr;
}
nsRefPtr<TextTrack> 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<TextTrack*>& aTextTracks)
{
if (!mTextTracks) {
return;
}
for (uint32_t i = 0; i < mTextTracks->Length(); i++) {
TextTrack* textTrack = (*mTextTracks)[i];
if (textTrack->Kind() == aTextTrackKind) {

View File

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

View File

@ -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<nsISupports> mParent;
nsRefPtr<TextTrackList> mTextTrackList;
TextTrackKind mKind;

View File

@ -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<nsPIDOMWindow> window(do_QueryInterface(aGlobal));
nsPIDOMWindow* window = GetOwner();
if (!window) {
return NS_ERROR_NO_INTERFACE;
}

View File

@ -39,24 +39,20 @@ public:
const nsAString& aText,
ErrorResult& aRv)
{
nsRefPtr<TextTrackCue> ttcue = new TextTrackCue(aGlobal.GetAsSupports(), aStartTime,
nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(aGlobal.GetAsSupports());
nsRefPtr<TextTrackCue> 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<nsIDocument> mDocument;
nsString mText;

View File

@ -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<TextTrack> track = new TextTrack(mGlobal, this, aKind, aLabel,
nsRefPtr<TextTrack> track = new TextTrack(GetOwner(), this, aKind, aLabel,
aLanguage, aMode, aReadyState,
aTextTrackSource);
AddTextTrack(track, aCompareTT);

View File

@ -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<nsISupports> mGlobal;
nsTArray< nsRefPtr<TextTrack> > mTextTracks;
nsRefPtr<TextTrackManager> mTextTrackManager;

View File

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