Bug 1407148 - add logs for debugging crashes.
MozReview-Commit-ID: FgDbl2tCbEE
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -1855,16 +1855,18 @@ void HTMLMediaElement::AbortExistingLoad
mIsRunningSelectResource = false;
if (mTextTrackManager) {
mTextTrackManager->NotifyReset();
}
mEventDeliveryPaused = false;
mPendingEvents.Clear();
+
+ AssertReadyStateIsNothing();
}
void HTMLMediaElement::NoSupportedMediaSourceError(const nsACString& aErrorDetails)
{
if (mDecoder) {
ShutdownDecoder();
}
mErrorSink->SetError(MEDIA_ERR_SRC_NOT_SUPPORTED, aErrorDetails);
@@ -1916,16 +1918,18 @@ void HTMLMediaElement::QueueLoadFromSour
}
if (mDecoder) {
// Reset readyState to HAVE_NOTHING since we're going to load a new decoder.
ShutdownDecoder();
ChangeReadyState(nsIDOMHTMLMediaElement::HAVE_NOTHING);
}
+ AssertReadyStateIsNothing();
+
ChangeDelayLoadStatus(true);
ChangeNetworkState(nsIDOMHTMLMediaElement::NETWORK_LOADING);
RefPtr<Runnable> r = NewRunnableMethod("HTMLMediaElement::LoadFromSourceChildren",
this, &HTMLMediaElement::LoadFromSourceChildren);
RunInStableState(r);
}
void HTMLMediaElement::QueueSelectResourceTask()
@@ -2574,16 +2578,18 @@ nsresult HTMLMediaElement::LoadResource(
decoder->Shutdown();
LOG(LogLevel::Debug,
("%p Failed to load for decoder %p", this, decoder.get()));
return rv;
}
return FinishDecoderSetup(decoder);
}
+ AssertReadyStateIsNothing();
+
RefPtr<ChannelLoader> loader = new ChannelLoader;
nsresult rv = loader->Load(this);
if (NS_SUCCEEDED(rv)) {
mChannelLoader = loader.forget();
}
return rv;
}
@@ -4863,22 +4869,46 @@ HTMLMediaElement::CanPlayType(const nsAS
LOG(LogLevel::Debug, ("%p CanPlayType(%s) = \"%s\"", this,
NS_ConvertUTF16toUTF8(aType).get(),
NS_ConvertUTF16toUTF8(aResult).get()));
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,
mPreservesPitch,
mPlaybackRate,
mPreloadAction ==
HTMLMediaElement::PRELOAD_METADATA,
mHasSuspendTaint,
@@ -4922,17 +4952,17 @@ HTMLMediaElement::SetupDecoder(DecoderTy
return rv;
}
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;
nsAutoCString mimeType;
aChannel->GetContentType(mimeType);
NS_ASSERTION(!mimeType.IsEmpty(), "We should have the Content-Type.");
NS_ConvertUTF8toUTF16 mimeUTF16(mimeType);
@@ -6581,16 +6611,17 @@ void HTMLMediaElement::NotifyAddedSource
{
// If a source element is inserted as a child of a media element
// that has no src attribute and whose networkState has the value
// NETWORK_EMPTY, the user agent must invoke the media element's
// resource selection algorithm.
if (!HasAttr(kNameSpaceID_None, nsGkAtoms::src) &&
mNetworkState == nsIDOMHTMLMediaElement::NETWORK_EMPTY)
{
+ AssertReadyStateIsNothing();
QueueSelectResourceTask();
}
// A load was paused in the resource selection algorithm, waiting for
// a new source child to be added, resume the resource selection algorithm.
if (mLoadWaitStatus == WAITING_FOR_SOURCE) {
// Rest the flag so we don't queue multiple LoadFromSourceTask() when
// multiple <source> are attached in an event loop.
--- a/dom/html/HTMLMediaElement.h
+++ b/dom/html/HTMLMediaElement.h
@@ -1815,16 +1815,19 @@ private:
// We keep track of these because the load algorithm resolves/rejects all
// already-dispatched pending play promises.
nsTArray<nsResolveOrRejectPendingPlayPromisesRunner*> mPendingPlayPromisesRunners;
// A pending seek promise which is created at Seek() method call and is
// resolved/rejected at AsyncResolveSeekDOMPromiseIfExists()/
// AsyncRejectSeekDOMPromiseIfExists() methods.
RefPtr<dom::Promise> mSeekDOMPromise;
+
+ // For debugging bug 1407148.
+ void AssertReadyStateIsNothing();
};
// Check if the context is chrome or has the debugger or tabs permission
bool
HasDebuggerOrTabsPrivilege(JSContext* aCx, JSObject* aObj);
} // namespace dom
} // namespace mozilla