/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */

/* Auto-recovery module.
 * This module aims to catch fatal browser initialization errors and either
 * automatically correct likely causes from them, or automatically restarting
 * the browser in safe mode. This is hooked into the browser's "onload"
 * event because it can be assumed that at that point, everything must
 * have been properly initialized already.
 */

var Cc = Components.classes;
var Ci = Components.interfaces;
var Cu = Components.utils;

// Services = object with smart getters for common XPCOM services
Cu.import("resource://gre/modules/Services.jsm");

var browser_autoRecovery = {
  onLoad: function() {
    var nsIAS = Ci.nsIAppStartup; // Application startup interface
    
    if (typeof gBrowser === "undefined") {
      // gBrowser should always be defined at this point, but if it is not, then most likely 
      // it is due to an incompatible or outdated language pack being installed and selected.
      // In this case, we reset "general.useragent.locale" to try to recover browser startup.
      if (Services.prefs.prefHasUserValue("general.useragent.locale")) {
        // Restart automatically in en-US.
        Services.prefs.clearUserPref("general.useragent.locale");
        Cc["@mozilla.org/toolkit/app-startup;1"].getService(nsIAS).quit(nsIAS.eRestart | nsIAS.eAttemptQuit);
      } else if (!Services.appinfo.inSafeMode) {
        // gBrowser isn't defined, and we're not using a custom locale. Most likely
        // a user-installed add-on causes issues here, so we restart in Safe Mode.
        let RISM = Services.prompt.confirm(null, "Error",
                                           "The Browser didn't start properly!\n"+
                                           "This is usually caused by an add-on or misconfiguration.\n\n"+
                                           "Restart in Safe Mode?");
        if (RISM) {
          Cc["@mozilla.org/toolkit/app-startup;1"].getService(nsIAS).restartInSafeMode(nsIAS.eRestart | nsIAS.eAttemptQuit);
        } else {
          // Force quit application
          Cc["@mozilla.org/toolkit/app-startup;1"].getService(nsIAS).quit(nsIAS.eForceQuit);
        }
      }
      // Something else caused this issue and we're already in Safe Mode, so we return
      // without doing anything else, and let normal error handling take place.
      return;
    } // gBrowser undefined
    
    // Other checks than gBrowser undefined can go here!
    
    // Remove our listener, since we don't want this to fire on every load.
    window.removeEventListener("load", browser_autoRecovery.onLoad, false);
  }
};

window.addEventListener("load", browser_autoRecovery.onLoad, false);
