Bug 1367596 - Don't show blank for tabs that haven't presented if they've loaded a non-blank page and are not busy. r?billm"
MozReview-Commit-ID: 3HFG2uzlQRe
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -4088,30 +4088,42 @@
},
// This function is called after all the main state changes to
// make sure we display the right tab.
updateDisplay() {
let requestedTabState = this.getTabState(this.requestedTab);
let requestedBrowser = this.requestedTab.linkedBrowser;
- // It is more desirable to show a blank tab when appropriate than
+ // It is often more desirable to show a blank tab when appropriate than
// the tab switch spinner - especially since the spinner is usually
// preceded by a perceived lag of TAB_SWITCH_TIMEOUT ms in the
// tab switch. We can hide this lag, and hide the time being spent
// constructing TabChild's, layer trees, etc, by showing a blank
// tab instead and focusing it immediately.
let shouldBeBlank = false;
if (requestedBrowser.isRemoteBrowser) {
- // If a tab is remote, we can show a blank tab instead of a
- // spinner if we know it has never presented before, or if it
- // has just crashed and we haven't started showing the tab crashed
- // page yet.
+ // If a tab is remote and the window is not minimized, we can show a
+ // blank tab instead of a spinner in the following cases:
+ //
+ // 1. The tab has just crashed, and we haven't started showing the
+ // tab crashed page yet (in this case, the TabParent is null)
+ // 2. The tab has never presented, and has not finished loading
+ // a non-blank page.
+ //
+ // For (2), "finished loading a non-blank page" is determined by
+ // looking at the loaded URI and the busy state on the tab element.
+ let hasSufficientlyLoaded =
+ !this.requestedTab.hasAttribute("busy") &&
+ requestedBrowser.currentURI.spec != "about:blank";
+
let fl = requestedBrowser.frameLoader;
- shouldBeBlank = !this.minimized && (!fl.tabParent || !fl.tabParent.hasPresented);
+ shouldBeBlank = !this.minimized &&
+ (!fl.tabParent ||
+ (!hasSufficientlyLoaded && !fl.tabParent.hasPresented));
}
this.log("Tab should be blank: " + shouldBeBlank);
this.log("Requested tab is remote?: " + requestedBrowser.isRemoteBrowser);
// Figure out which tab we actually want visible right now.
let showTab = null;
if (requestedTabState != this.STATE_LOADED &&
@@ -4606,17 +4618,16 @@
this.switchInProgress = false;
}
},
spinnerDisplayed() {
this.assert(!this.spinnerTab);
let browser = this.requestedTab.linkedBrowser;
this.assert(browser.isRemoteBrowser);
- this.assert(browser.frameLoader.tabParent.hasPresented);
TelemetryStopwatch.start("FX_TAB_SWITCH_SPINNER_VISIBLE_MS", window);
// We have a second, similar probe for capturing recordings of
// when the spinner is displayed for very long periods.
TelemetryStopwatch.start("FX_TAB_SWITCH_SPINNER_VISIBLE_LONG_MS", window);
this.addMarker("AsyncTabSwitch:SpinnerShown");
},
spinnerHidden() {