Bug 1407148 - add logs for debugging crashes. r=gerald

MozReview-Commit-ID: FgDbl2tCbEE

--HG--
extra : rebase_source : d94d5783a2a08022d8ef89f14f8f35c99ee124fe
extra : source : 9b4dfa4ccd83c2a933f65d422641c5a9c018ce5c
This commit is contained in:
JW Wang 2017-10-12 10:46:13 +08:00
Родитель da66155d17
Коммит 03ca7715a5
2 изменённых файлов: 36 добавлений и 2 удалений

Просмотреть файл

@ -1860,6 +1860,8 @@ void HTMLMediaElement::AbortExistingLoads()
mEventDeliveryPaused = false; mEventDeliveryPaused = false;
mPendingEvents.Clear(); mPendingEvents.Clear();
AssertReadyStateIsNothing();
} }
void HTMLMediaElement::NoSupportedMediaSourceError(const nsACString& aErrorDetails) void HTMLMediaElement::NoSupportedMediaSourceError(const nsACString& aErrorDetails)
@ -1921,6 +1923,8 @@ void HTMLMediaElement::QueueLoadFromSourceTask()
ChangeReadyState(nsIDOMHTMLMediaElement::HAVE_NOTHING); ChangeReadyState(nsIDOMHTMLMediaElement::HAVE_NOTHING);
} }
AssertReadyStateIsNothing();
ChangeDelayLoadStatus(true); ChangeDelayLoadStatus(true);
ChangeNetworkState(nsIDOMHTMLMediaElement::NETWORK_LOADING); ChangeNetworkState(nsIDOMHTMLMediaElement::NETWORK_LOADING);
RefPtr<Runnable> r = NewRunnableMethod("HTMLMediaElement::LoadFromSourceChildren", RefPtr<Runnable> r = NewRunnableMethod("HTMLMediaElement::LoadFromSourceChildren",
@ -2579,6 +2583,8 @@ nsresult HTMLMediaElement::LoadResource()
return FinishDecoderSetup(decoder); return FinishDecoderSetup(decoder);
} }
AssertReadyStateIsNothing();
RefPtr<ChannelLoader> loader = new ChannelLoader; RefPtr<ChannelLoader> loader = new ChannelLoader;
nsresult rv = loader->Load(this); nsresult rv = loader->Load(this);
if (NS_SUCCEEDED(rv)) { if (NS_SUCCEEDED(rv)) {
@ -4868,12 +4874,36 @@ HTMLMediaElement::CanPlayType(const nsAString& aType, nsAString& aResult)
return NS_OK; 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 nsresult
HTMLMediaElement::InitializeDecoderAsClone(ChannelMediaDecoder* aOriginal) HTMLMediaElement::InitializeDecoderAsClone(ChannelMediaDecoder* aOriginal)
{ {
NS_ASSERTION(mLoadingSrc, "mLoadingSrc must already be set"); NS_ASSERTION(mLoadingSrc, "mLoadingSrc must already be set");
NS_ASSERTION(mDecoder == nullptr, "Shouldn't have a decoder"); NS_ASSERTION(mDecoder == nullptr, "Shouldn't have a decoder");
MOZ_DIAGNOSTIC_ASSERT(mReadyState == nsIDOMHTMLMediaElement::HAVE_NOTHING); AssertReadyStateIsNothing();
MediaDecoderInit decoderInit(this, MediaDecoderInit decoderInit(this,
mMuted ? 0.0 : mVolume, mMuted ? 0.0 : mVolume,
@ -4927,7 +4957,7 @@ nsresult HTMLMediaElement::InitializeDecoderForChannel(nsIChannel* aChannel,
nsIStreamListener** aListener) nsIStreamListener** aListener)
{ {
NS_ASSERTION(mLoadingSrc, "mLoadingSrc must already be set"); NS_ASSERTION(mLoadingSrc, "mLoadingSrc must already be set");
MOZ_DIAGNOSTIC_ASSERT(mReadyState == nsIDOMHTMLMediaElement::HAVE_NOTHING); AssertReadyStateIsNothing();
DecoderDoctorDiagnostics diagnostics; DecoderDoctorDiagnostics diagnostics;
@ -6586,6 +6616,7 @@ void HTMLMediaElement::NotifyAddedSource()
if (!HasAttr(kNameSpaceID_None, nsGkAtoms::src) && if (!HasAttr(kNameSpaceID_None, nsGkAtoms::src) &&
mNetworkState == nsIDOMHTMLMediaElement::NETWORK_EMPTY) mNetworkState == nsIDOMHTMLMediaElement::NETWORK_EMPTY)
{ {
AssertReadyStateIsNothing();
QueueSelectResourceTask(); QueueSelectResourceTask();
} }

Просмотреть файл

@ -1820,6 +1820,9 @@ private:
// resolved/rejected at AsyncResolveSeekDOMPromiseIfExists()/ // resolved/rejected at AsyncResolveSeekDOMPromiseIfExists()/
// AsyncRejectSeekDOMPromiseIfExists() methods. // AsyncRejectSeekDOMPromiseIfExists() methods.
RefPtr<dom::Promise> mSeekDOMPromise; RefPtr<dom::Promise> mSeekDOMPromise;
// For debugging bug 1407148.
void AssertReadyStateIsNothing();
}; };
// Check if the context is chrome or has the debugger or tabs permission // Check if the context is chrome or has the debugger or tabs permission