[tbb-commits] [tor-browser] 79/311: Bug 1749996 - Ensure CrashMonitor writes sessionstore final checkpoint before IOUtils shuts down. r=Gijs, a=RyanVM

gitolite role git at cupani.torproject.org
Tue Apr 26 15:27:59 UTC 2022


This is an automated email from the git hooks/post-receive script.

pierov pushed a commit to branch geckoview-99.0.1-11.0-1
in repository tor-browser.

commit ff7edb3e2dedcc1a940d96223bb863e1385408d6
Author: Barret Rennie <barret at brennie.ca>
AuthorDate: Sat Feb 5 20:57:50 2022 +0000

    Bug 1749996 - Ensure CrashMonitor writes sessionstore final checkpoint before IOUtils shuts down. r=Gijs, a=RyanVM
    
    Differential Revision: https://phabricator.services.mozilla.com/D137797
---
 browser/components/sessionstore/SessionFile.jsm  |  7 ++--
 toolkit/components/crashmonitor/CrashMonitor.jsm | 41 +++++++++++++++++++++---
 2 files changed, 38 insertions(+), 10 deletions(-)

diff --git a/browser/components/sessionstore/SessionFile.jsm b/browser/components/sessionstore/SessionFile.jsm
index 49ee979e231c6..c6abd2d6faa5d 100644
--- a/browser/components/sessionstore/SessionFile.jsm
+++ b/browser/components/sessionstore/SessionFile.jsm
@@ -28,9 +28,6 @@ const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
 const { XPCOMUtils } = ChromeUtils.import(
   "resource://gre/modules/XPCOMUtils.jsm"
 );
-const { AsyncShutdown } = ChromeUtils.import(
-  "resource://gre/modules/AsyncShutdown.jsm"
-);
 
 XPCOMUtils.defineLazyModuleGetters(this, {
   RunState: "resource:///modules/sessionstore/RunState.jsm",
@@ -488,7 +485,7 @@ var SessionFileInternal = {
 
     // Ensure that we can write sessionstore.js cleanly before the profile
     // becomes unaccessible.
-    AsyncShutdown.profileBeforeChange.addBlocker(
+    IOUtils.profileBeforeChange.addBlocker(
       "SessionFile: Finish writing Session Restore data",
       promise,
       {
@@ -506,7 +503,7 @@ var SessionFileInternal = {
     // doesn't forward the rejection.
     return promise.then(() => {
       // Remove the blocker, no matter if writing failed or not.
-      AsyncShutdown.profileBeforeChange.removeBlocker(promise);
+      IOUtils.profileBeforeChange.removeBlocker(promise);
 
       if (isFinalWrite) {
         Services.obs.notifyObservers(
diff --git a/toolkit/components/crashmonitor/CrashMonitor.jsm b/toolkit/components/crashmonitor/CrashMonitor.jsm
index 44ae8b85f2e63..f3710c1bea46e 100644
--- a/toolkit/components/crashmonitor/CrashMonitor.jsm
+++ b/toolkit/components/crashmonitor/CrashMonitor.jsm
@@ -33,16 +33,26 @@
 
 var EXPORTED_SYMBOLS = ["CrashMonitor"];
 
+const { PrivateBrowsingUtils } = ChromeUtils.import(
+  "resource://gre/modules/PrivateBrowsingUtils.jsm"
+);
+const { PromiseUtils } = ChromeUtils.import(
+  "resource://gre/modules/PromiseUtils.jsm"
+);
 const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
 
+const SESSIONSTORE_WINDOWS_RESTORED_TOPIC = "sessionstore-windows-restored";
+const SESSIONSTORE_FINAL_STATE_WRITE_COMPLETE_TOPIC =
+  "sessionstore-final-state-write-complete";
+
 const NOTIFICATIONS = [
   "final-ui-startup",
-  "sessionstore-windows-restored",
+  SESSIONSTORE_WINDOWS_RESTORED_TOPIC,
   "quit-application-granted",
   "quit-application",
   "profile-change-net-teardown",
   "profile-change-teardown",
-  "sessionstore-final-state-write-complete",
+  SESSIONSTORE_FINAL_STATE_WRITE_COMPLETE_TOPIC,
 ];
 
 const SHUTDOWN_PHASES = ["profile-before-change"];
@@ -59,6 +69,11 @@ var CrashMonitorInternal = {
    */
   checkpoints: {},
 
+  /**
+   * A deferred promise that resolves when all checkpoints have been written.
+   */
+  sessionStoreFinalWriteComplete: PromiseUtils.defer(),
+
   /**
    * Notifications received during previous session.
    *
@@ -158,9 +173,21 @@ var CrashMonitor = {
 
     // Add shutdown blocker for profile-before-change
     IOUtils.profileBeforeChange.addBlocker(
-      "CrashMonitor: Writing notifications to file after receiving profile-before-change",
-      () => this.writeCheckpoint("profile-before-change"),
-      () => this.checkpoints
+      "CrashMonitor: Writing notifications to file after receiving profile-before-change and awaiting all checkpoints written",
+      async () => {
+        await this.writeCheckpoint("profile-before-change");
+
+        // If SessionStore has not initialized, we don't want to wait for
+        // checkpoints that we won't hit, or we'll crash the browser during
+        // async shutdown.
+        if (
+          !PrivateBrowsingUtils.permanentPrivateBrowsing &&
+          CrashMonitorInternal.checkpoints[SESSIONSTORE_WINDOWS_RESTORED_TOPIC]
+        ) {
+          await CrashMonitorInternal.sessionStoreFinalWriteComplete.promise;
+        }
+      },
+      () => CrashMonitorInternal.checkpoints
     );
 
     CrashMonitorInternal.initialized = true;
@@ -184,6 +211,10 @@ var CrashMonitor = {
         Services.obs.removeObserver(this, aTopic);
       }, this);
     }
+
+    if (aTopic === SESSIONSTORE_FINAL_STATE_WRITE_COMPLETE_TOPIC) {
+      CrashMonitorInternal.sessionStoreFinalWriteComplete.resolve();
+    }
   },
 
   async writeCheckpoint(aCheckpoint) {

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the tbb-commits mailing list