author | JW Wang <jwwang@mozilla.com> |
Fri, 23 Sep 2016 14:51:52 +0800 | |
changeset 316155 | 27949d48ec6669996962cb05ae18363ab55eb55f |
parent 316144 | d856f453dcd6c10aa5a0724824cc3b9b685db419 |
child 316156 | a55838bd4bbb5547eaa7ece8a5c0d4e4879579fa |
push id | 30765 |
push user | philringnalda@gmail.com |
push date | Tue, 04 Oct 2016 03:06:46 +0000 |
treeherder | mozilla-central@adb484f84dec [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | cpearce |
bugs | 1239899 |
milestone | 52.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
dom/html/HTMLMediaElement.cpp | file | annotate | diff | comparison | revisions | |
dom/html/HTMLMediaElement.h | file | annotate | diff | comparison | revisions |
--- a/dom/html/HTMLMediaElement.cpp +++ b/dom/html/HTMLMediaElement.cpp @@ -2902,17 +2902,16 @@ HTMLMediaElement::HTMLMediaElement(alrea mMediaSecurityVerified(false), mCORSMode(CORS_NONE), mIsEncrypted(false), mWaitingForKey(false), mDownloadSuspendedByCache(false, "HTMLMediaElement::mDownloadSuspendedByCache"), mAudioChannelVolume(1.0), mPlayingThroughTheAudioChannel(false), mDisableVideo(false), - mElementInTreeState(ELEMENT_NOT_INTREE), mHasUserInteraction(false), mFirstFrameLoaded(false), mDefaultPlaybackStartPosition(0.0), mIsAudioTrackAudible(false), mAudible(IsAudible()), mVisibilityState(Visibility::APPROXIMATELY_NONVISIBLE) { ErrorResult rv; @@ -3403,25 +3402,27 @@ HTMLMediaElement::AfterSetAttr(int32_t a nsresult HTMLMediaElement::BindToTree(nsIDocument* aDocument, nsIContent* aParent, nsIContent* aBindingParent, bool aCompileEventHandlers) { nsresult rv = nsGenericHTMLElement::BindToTree(aDocument, aParent, aBindingParent, aCompileEventHandlers); + + mUnboundFromTree = false; + if (aDocument) { mAutoplayEnabled = IsAutoplayEnabled() && (!aDocument || !aDocument->IsStaticDocument()) && !IsEditable(); // The preload action depends on the value of the autoplay attribute. // It's value may have changed, so update it. UpdatePreloadAction(); } - mElementInTreeState = ELEMENT_INTREE; if (mDecoder) { // When the MediaElement is binding to tree, the dormant status is // aligned to document's hidden status. mDecoder->NotifyOwnerActivityChanged(!IsHidden()); } return rv; @@ -3645,22 +3646,22 @@ HTMLMediaElement::ReportTelemetry() } } } } void HTMLMediaElement::UnbindFromTree(bool aDeep, bool aNullParent) { + mUnboundFromTree = true; + if (!mPaused && mNetworkState != nsIDOMHTMLMediaElement::NETWORK_EMPTY) { Pause(); } - mElementInTreeState = ELEMENT_NOT_INTREE_HAD_INTREE; - nsGenericHTMLElement::UnbindFromTree(aDeep, aNullParent); if (mDecoder) { MOZ_ASSERT(IsHidden()); mDecoder->NotifyOwnerActivityChanged(false); } } @@ -4984,21 +4985,18 @@ void HTMLMediaElement::CheckAutoplayData bool HTMLMediaElement::IsActive() const { nsIDocument* ownerDoc = OwnerDoc(); return ownerDoc && ownerDoc->IsActive() && ownerDoc->IsVisible(); } bool HTMLMediaElement::IsHidden() const { - if (mElementInTreeState == ELEMENT_NOT_INTREE_HAD_INTREE) { - return true; - } - nsIDocument* ownerDoc = OwnerDoc(); - return !ownerDoc || ownerDoc->Hidden(); + nsIDocument* ownerDoc; + return mUnboundFromTree || !(ownerDoc = OwnerDoc()) || ownerDoc->Hidden(); } VideoFrameContainer* HTMLMediaElement::GetVideoFrameContainer() { if (mShuttingDown) { return nullptr; }
--- a/dom/html/HTMLMediaElement.h +++ b/dom/html/HTMLMediaElement.h @@ -1627,27 +1627,20 @@ protected: RefPtr<VideoTrackList> mVideoTrackList; nsAutoPtr<MediaStreamTrackListener> mMediaStreamTrackListener; // The principal guarding mVideoFrameContainer access when playing a // MediaStream. nsCOMPtr<nsIPrincipal> mSrcStreamVideoPrincipal; - enum ElementInTreeState { - // The MediaElement is not in the DOM tree now. - ELEMENT_NOT_INTREE, - // The MediaElement is in the DOM tree now. - ELEMENT_INTREE, - // The MediaElement is not in the DOM tree now but had been binded to the - // tree before. - ELEMENT_NOT_INTREE_HAD_INTREE - }; - - ElementInTreeState mElementInTreeState; + // True if UnbindFromTree() is called on the element. + // Note this flag is false when the element is in a phase after creation and + // before attaching to the DOM tree. + bool mUnboundFromTree = false; public: // Helper class to measure times for MSE telemetry stats class TimeDurationAccumulator { public: TimeDurationAccumulator() : mCount(0)