Bug 1373271 - Handle crashes in preloaded browsers in tabbrowser
MozReview-Commit-ID: IVMQOOsyMnZ
--- 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);
+});