From 03ca7715a5ce9851ef7c2a02f2a4c9cdc81de5e9 Mon Sep 17 00:00:00 2001 From: JW Wang Date: Thu, 12 Oct 2017 10:46:13 +0800 Subject: [PATCH] Bug 1407148 - add logs for debugging crashes. r=gerald MozReview-Commit-ID: FgDbl2tCbEE --HG-- extra : rebase_source : d94d5783a2a08022d8ef89f14f8f35c99ee124fe extra : source : 9b4dfa4ccd83c2a933f65d422641c5a9c018ce5c --- dom/html/HTMLMediaElement.cpp | 35 +++++++++++++++++++++++++++++++++-- dom/html/HTMLMediaElement.h | 3 +++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/dom/html/HTMLMediaElement.cpp b/dom/html/HTMLMediaElement.cpp index 18acd95ff3f3..80a7cf3d5381 100644 --- a/dom/html/HTMLMediaElement.cpp +++ b/dom/html/HTMLMediaElement.cpp @@ -1860,6 +1860,8 @@ void HTMLMediaElement::AbortExistingLoads() mEventDeliveryPaused = false; mPendingEvents.Clear(); + + AssertReadyStateIsNothing(); } void HTMLMediaElement::NoSupportedMediaSourceError(const nsACString& aErrorDetails) @@ -1921,6 +1923,8 @@ void HTMLMediaElement::QueueLoadFromSourceTask() ChangeReadyState(nsIDOMHTMLMediaElement::HAVE_NOTHING); } + AssertReadyStateIsNothing(); + ChangeDelayLoadStatus(true); ChangeNetworkState(nsIDOMHTMLMediaElement::NETWORK_LOADING); RefPtr r = NewRunnableMethod("HTMLMediaElement::LoadFromSourceChildren", @@ -2579,6 +2583,8 @@ nsresult HTMLMediaElement::LoadResource() return FinishDecoderSetup(decoder); } + AssertReadyStateIsNothing(); + RefPtr loader = new ChannelLoader; nsresult rv = loader->Load(this); if (NS_SUCCEEDED(rv)) { @@ -4868,12 +4874,36 @@ HTMLMediaElement::CanPlayType(const nsAString& aType, nsAString& aResult) return NS_OK; } +void +HTMLMediaElement::AssertReadyStateIsNothing() +{ +#ifdef MOZ_DIAGNOSTIC_ASSERT_ENABLED + if (mReadyState != nsIDOMHTMLMediaElement::HAVE_NOTHING) { + char buf[1024]; + SprintfLiteral(buf, + "readyState=%d networkState=%d mLoadWaitStatus=%d " + "mSourceLoadCandidate=%d " + "mIsLoadingFromSourceChildren=%d mPreloadAction=%d " + "mSuspendedForPreloadNone=%d error=%d", + int(mReadyState.Ref()), + int(mNetworkState), + int(mLoadWaitStatus), + !!mSourceLoadCandidate, + mIsLoadingFromSourceChildren, + int(mPreloadAction), + mSuspendedForPreloadNone, + GetError() ? GetError()->Code() : 0); + MOZ_CRASH_UNSAFE_PRINTF("ReadyState should be HAVE_NOTHING! %s", buf); + } +#endif +} + nsresult HTMLMediaElement::InitializeDecoderAsClone(ChannelMediaDecoder* aOriginal) { NS_ASSERTION(mLoadingSrc, "mLoadingSrc must already be set"); NS_ASSERTION(mDecoder == nullptr, "Shouldn't have a decoder"); - MOZ_DIAGNOSTIC_ASSERT(mReadyState == nsIDOMHTMLMediaElement::HAVE_NOTHING); + AssertReadyStateIsNothing(); MediaDecoderInit decoderInit(this, mMuted ? 0.0 : mVolume, @@ -4927,7 +4957,7 @@ nsresult HTMLMediaElement::InitializeDecoderForChannel(nsIChannel* aChannel, nsIStreamListener** aListener) { NS_ASSERTION(mLoadingSrc, "mLoadingSrc must already be set"); - MOZ_DIAGNOSTIC_ASSERT(mReadyState == nsIDOMHTMLMediaElement::HAVE_NOTHING); + AssertReadyStateIsNothing(); DecoderDoctorDiagnostics diagnostics; @@ -6586,6 +6616,7 @@ void HTMLMediaElement::NotifyAddedSource() if (!HasAttr(kNameSpaceID_None, nsGkAtoms::src) && mNetworkState == nsIDOMHTMLMediaElement::NETWORK_EMPTY) { + AssertReadyStateIsNothing(); QueueSelectResourceTask(); } diff --git a/dom/html/HTMLMediaElement.h b/dom/html/HTMLMediaElement.h index 083a9d0ae87f..1486957bd1d3 100644 --- a/dom/html/HTMLMediaElement.h +++ b/dom/html/HTMLMediaElement.h @@ -1820,6 +1820,9 @@ private: // resolved/rejected at AsyncResolveSeekDOMPromiseIfExists()/ // AsyncRejectSeekDOMPromiseIfExists() methods. RefPtr mSeekDOMPromise; + + // For debugging bug 1407148. + void AssertReadyStateIsNothing(); }; // Check if the context is chrome or has the debugger or tabs permission