Bug 1385092 - Null check for the sParserWrapper. r=alwu
From the crash report and code logic, it is possible that the KillClearOnShutdown comes and the NS_XPCOM_SHUTDOWN_OBSERVER_ID never comes when getting obsercerService fail.
So add null check for the sParserWrapper and combine mShutdown to a new function.
MozReview-Commit-ID: Cj5ph2JrO7v
--- a/dom/html/TextTrackManager.cpp
+++ b/dom/html/TextTrackManager.cpp
@@ -125,16 +125,17 @@ TextTrackManager::TextTrackManager(HTMLM
mNewCues = new TextTrackCueList(window);
mLastActiveCues = new TextTrackCueList(window);
mTextTracks = new TextTrackList(window, this);
mPendingTextTracks = new TextTrackList(window, this);
if (!sParserWrapper) {
nsCOMPtr<nsIWebVTTParserWrapper> parserWrapper =
do_CreateInstance(NS_WEBVTTPARSERWRAPPER_CONTRACTID);
+ MOZ_ASSERT(parserWrapper, "Can't create nsIWebVTTParserWrapper");
sParserWrapper = parserWrapper;
ClearOnShutdown(&sParserWrapper);
}
mShutdownProxy = new ShutdownObserverProxy(this);
}
TextTrackManager::~TextTrackManager()
{
@@ -258,17 +259,17 @@ TextTrackManager::DidSeek()
}
void
TextTrackManager::UpdateCueDisplay()
{
WEBVTT_LOG("UpdateCueDisplay");
mUpdateCueDisplayDispatched = false;
- if (!mMediaElement || !mTextTracks) {
+ if (!mMediaElement || !mTextTracks || IsShutdown()) {
return;
}
nsIFrame* frame = mMediaElement->GetPrimaryFrame();
nsVideoFrame* videoFrame = do_QueryFrame(frame);
if (!videoFrame) {
return;
}
@@ -619,17 +620,17 @@ public:
}
private:
nsTArray<RefPtr<TextTrack>> mTextTracks;
};
void
TextTrackManager::DispatchUpdateCueDisplay()
{
- if (!mUpdateCueDisplayDispatched && !mShutdown &&
+ if (!mUpdateCueDisplayDispatched && !IsShutdown() &&
(mMediaElement->GetHasUserInteraction() || mMediaElement->IsCurrentlyPlaying())) {
WEBVTT_LOG("DispatchUpdateCueDisplay");
nsPIDOMWindowInner* win = mMediaElement->OwnerDoc()->GetInnerWindow();
if (win) {
nsGlobalWindow::Cast(win)->Dispatch(
TaskCategory::Other,
NewRunnableMethod("dom::TextTrackManager::UpdateCueDisplay",
this,
@@ -641,17 +642,17 @@ TextTrackManager::DispatchUpdateCueDispl
void
TextTrackManager::DispatchTimeMarchesOn()
{
// Run the algorithm if no previous instance is still running, otherwise
// enqueue the current playback position and whether only that changed
// through its usual monotonic increase during normal playback; current
// executing call upon completion will check queue for further 'work'.
- if (!mTimeMarchesOnDispatched && !mShutdown &&
+ if (!mTimeMarchesOnDispatched && !IsShutdown() &&
(mMediaElement->GetHasUserInteraction() || mMediaElement->IsCurrentlyPlaying())) {
WEBVTT_LOG("DispatchTimeMarchesOn");
nsPIDOMWindowInner* win = mMediaElement->OwnerDoc()->GetInnerWindow();
if (win) {
nsGlobalWindow::Cast(win)->Dispatch(
TaskCategory::Other,
NewRunnableMethod("dom::TextTrackManager::TimeMarchesOn",
this,
@@ -665,17 +666,17 @@ TextTrackManager::DispatchTimeMarchesOn(
void
TextTrackManager::TimeMarchesOn()
{
NS_ASSERTION(NS_IsMainThread(), "Wrong thread!");
WEBVTT_LOG("TimeMarchesOn");
mTimeMarchesOnDispatched = false;
// Early return if we don't have any TextTracks or shutting down.
- if (!mTextTracks || mTextTracks->Length() == 0 || mShutdown) {
+ if (!mTextTracks || mTextTracks->Length() == 0 || IsShutdown()) {
return;
}
nsISupports* parentObject =
mMediaElement->OwnerDoc()->GetParentObject();
if (NS_WARN_IF(!parentObject)) {
return;
}
@@ -914,11 +915,16 @@ TextTrackManager::ReportTelemetryForCue(
}
bool
TextTrackManager::IsLoaded()
{
return mTextTracks ? mTextTracks->AreTextTracksLoaded() : true;
}
+bool
+TextTrackManager::IsShutdown() const
+{
+ return (mShutdown || !sParserWrapper);
+}
} // namespace dom
} // namespace mozilla
--- a/dom/html/TextTrackManager.h
+++ b/dom/html/TextTrackManager.h
@@ -148,16 +148,18 @@ private:
nsTArray<TextTrack*>& aTextTracks);
void GetTextTracksOfKind(TextTrackKind aTextTrackKind,
nsTArray<TextTrack*>& aTextTracks);
bool TrackIsDefault(TextTrack* aTextTrack);
void ReportTelemetryForTrack(TextTrack* aTextTrack) const;
void ReportTelemetryForCue();
+ bool IsShutdown() const;
+
// If there is at least one cue has been added to the cue list once, we would
// report the usage of cue to Telemetry.
bool mCueTelemetryReported;
class ShutdownObserverProxy final : public nsIObserver
{
NS_DECL_ISUPPORTS