Bug 1426801 - Clear gFirstIdleTask if we fail to dispatch the runnable. r=mrbkap draft
authorAndrew McCreight <continuation@gmail.com>
Thu, 04 Jan 2018 14:59:14 -0800
changeset 716041 48978f1ca15c9e6f104751712ab8b32b80bdf3b8
parent 716040 932ccf547dfe25275686d8e54f846be2e40b4db5
child 744931 3bfb60f6239e9ebd1137725bb025d4dc611beba8
push id94308
push userbmo:continuation@gmail.com
push dateFri, 05 Jan 2018 00:26:50 +0000
reviewersmrbkap
bugs1426801
milestone59.0a1
Bug 1426801 - Clear gFirstIdleTask if we fail to dispatch the runnable. r=mrbkap MozReview-Commit-ID: 23f9VDTyyqg
dom/ipc/ContentChild.cpp
--- a/dom/ipc/ContentChild.cpp
+++ b/dom/ipc/ContentChild.cpp
@@ -1806,17 +1806,20 @@ ContentChild::RecvPBrowserConstructor(PB
 
   static bool hasRunOnce = false;
   if (!hasRunOnce) {
     hasRunOnce = true;
     MOZ_ASSERT(!gFirstIdleTask);
     RefPtr<CancelableRunnable> firstIdleTask = NewCancelableRunnableFunction("FirstIdleRunnable",
                                                                              FirstIdle);
     gFirstIdleTask = firstIdleTask;
-    NS_IdleDispatchToCurrentThread(firstIdleTask.forget());
+    if (NS_FAILED(NS_IdleDispatchToCurrentThread(firstIdleTask.forget()))) {
+      gFirstIdleTask = nullptr;
+      hasRunOnce = false;
+    }
   }
 
   return nsIContentChild::RecvPBrowserConstructor(aActor,
                                                   aTabId,
                                                   aSameTabGroupAs,
                                                   aContext,
                                                   aChromeFlags,
                                                   aCpID,
@@ -2312,16 +2315,17 @@ ContentChild::ActorDestroy(ActorDestroyR
 #ifndef NS_FREE_PERMANENT_DATA
   // In release builds, there's no point in the content process
   // going through the full XPCOM shutdown path, because it doesn't
   // keep persistent state.
   ProcessChild::QuickExit();
 #else
   if (gFirstIdleTask) {
     gFirstIdleTask->Cancel();
+    gFirstIdleTask = nullptr;
   }
 
   nsHostObjectProtocolHandler::RemoveDataEntries();
 
   mAlertObservers.Clear();
 
   mIdleObservers.Clear();