Bug 1373271 - Handle crashes in preloaded browsers in tabbrowser draft bug1373271
authork88hudson <khudson@mozilla.com>
Thu, 15 Jun 2017 12:27:06 -0400
changeset 597577 2fccb140d16f0e4038638f6cfd7a3d45894248e8
parent 592895 e3638c5119ed03dcd6ad243f99b08251194e375b
child 634256 2b28b724915343855a201f04211be2e53ccb836c
push id64961
push userkhudson@mozilla.com
push dateTue, 20 Jun 2017 17:24:56 +0000
bugs1373271
milestone56.0a1
Bug 1373271 - Handle crashes in preloaded browsers in tabbrowser MozReview-Commit-ID: IVMQOOsyMnZ
browser/base/content/tabbrowser.xml
browser/components/sessionstore/test/browser_background_tab_crash.js
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -5609,16 +5609,26 @@
         ]]>
       </handler>
       <handler event="oop-browser-crashed">
         <![CDATA[
           if (!event.isTrusted)
             return;
 
           let browser = event.originalTarget;
+
+          // Preloaded browsers do not actually have any tabs. If one crashes,
+          // it should be released and removed.
+          if (browser === this._preloadedBrowser) {
+            // Calling _getPreloadedBrowser is necessary to actually consume the preloaded browser
+            let preloaded = this._getPreloadedBrowser();
+            preloaded.remove();
+            return;
+          }
+
           let icon = browser.mIconURL;
           let tab = this.getTabForBrowser(browser);
 
           if (this.selectedBrowser == browser) {
             TabCrashHandler.onSelectedBrowserCrash(browser);
           } else {
             this.updateBrowserRemoteness(browser, false);
             SessionStore.reviveCrashedTab(tab);
--- a/browser/components/sessionstore/test/browser_background_tab_crash.js
+++ b/browser/components/sessionstore/test/browser_background_tab_crash.js
@@ -214,8 +214,35 @@ add_task(async function test_background_
 
       // Selecting the third tab should restore it.
       tabRestored = promiseTabRestored(tab3);
       await BrowserTestUtils.switchTab(gBrowser, tab3);
       await tabRestored;
     });
   });
 });
+
+// Tests that crashed preloaded tabs are removed and no unexpected errors are
+// thrown.
+add_task(async function test_preload_crash() {
+  if (!Services.prefs.getBoolPref("browser.newtab.preload")) {
+    return;
+  }
+
+  // Since new tab is only crashable for the activity-stream version,
+  // we need to flip the pref
+  await SpecialPowers.pushPrefEnv({
+    set: [[ "browser.newtabpage.activity-stream.enabled", true ]]
+  });
+
+  // Release any existing preloaded browser
+  let preloaded = gBrowser._getPreloadedBrowser();
+  if (preloaded) {
+    preloaded.remove();
+  }
+
+  // Create a fresh preloaded browser
+  gBrowser._createPreloadBrowser();
+
+  await BrowserTestUtils.crashBrowser(gBrowser._preloadedBrowser, false);
+
+  Assert.ok(!gBrowser._preloadedBrowser);
+});