Bug 600531 - Reload(F5)/Ctrl+Reload(F5) and reload button does not work after session restore [r=dietrich, a=blocking-b7]

This commit is contained in:
Paul O’Shannessy 2010-09-30 12:35:34 -07:00
parent 6fbe21f5ba
commit b1f1367491
2 changed files with 71 additions and 6 deletions

View File

@ -3539,10 +3539,15 @@ SessionStoreService.prototype = {
function sss__resetTabRestoringState(aTab, aRestoreNextTab, aRestoreThisTab) {
let browser = aTab.linkedBrowser;
// Always delete the session history listener off the browser
delete browser.__SS_shistoryListener;
if (browser.__SS_restoring) {
// If the session history listener hasn't been detached, make sure we
// remove it and delete the reference.
if (browser.__SS_shistoryListener) {
browser.webNavigation.sessionHistory.
removeSHistoryListener(browser.__SS_shistoryListener);
delete browser.__SS_shistoryListener;
}
delete browser.__SS_restoring;
if (aRestoreNextTab) {
// this._tabsRestoringCount is decremented in restoreNextTab.
@ -3721,8 +3726,12 @@ let gRestoreTabsProgressListener = {
aStateFlags & Ci.nsIWebProgressListener.STATE_STOP &&
aStateFlags & Ci.nsIWebProgressListener.STATE_IS_NETWORK &&
aStateFlags & Ci.nsIWebProgressListener.STATE_IS_WINDOW) {
delete aBrowser.__SS_restoring;
this.ss.restoreNextTab(true);
// We need to reset the tab before starting the next restore.
// _resetTabRestoringState will make sure we remove the session history
// listener and will call restoreNextTab.
let window = aBrowser.ownerDocument.defaultView;
let tab = window.gBrowser._getTabForContentWindow(aBrowser.contentWindow);
this.ss._resetTabRestoringState(tab, true, false);
}
}
}

View File

@ -577,7 +577,7 @@ function test_reload() {
if (loadCount == state.windows[0].tabs.length) {
window.gBrowser.removeTabsProgressListener(progressListener);
runNextTest();
test_reload2(state);
}
else {
// reload the next tab
@ -592,6 +592,62 @@ function test_reload() {
}
// This test shouldn't be added to tests. It will be called directly from
// test_reload. This guarantees that we're already in a tested restored state
// and we know what the state should be.
function test_reload2(aState) {
info("starting test_reload2");
let progressListener = {
onStateChange: function (aBrowser, aWebProgress, aRequest, aStateFlags, aStatus) {
if (aStateFlags & Ci.nsIWebProgressListener.STATE_STOP &&
aStateFlags & Ci.nsIWebProgressListener.STATE_IS_NETWORK &&
aStateFlags & Ci.nsIWebProgressListener.STATE_IS_WINDOW)
test_reload2_progressCallback(aBrowser);
}
}
// Simulate a left mouse button click with no modifiers, which is what
// Command-R, or clicking reload does.
let fakeEvent = {
button: 0,
metaKey: false,
altKey: false,
ctrlKey: false,
shiftKey: false,
}
let loadCount = 0;
function test_reload2_progressCallback(aBrowser) {
loadCount++;
if (loadCount <= aState.windows[0].tabs.length) {
// double check that this tab was the right one
let expectedData = aState.windows[0].tabs[loadCount - 1].extData.uniq;
let tab;
for (let i = 0; i < window.gBrowser.tabs.length; i++) {
if (!tab && window.gBrowser.tabs[i].linkedBrowser == aBrowser)
tab = window.gBrowser.tabs[i];
}
is(ss.getTabValue(tab, "uniq"), expectedData,
"test_reload2: load " + loadCount + " - correct tab was reloaded");
if (loadCount == aState.windows[0].tabs.length) {
window.gBrowser.removeTabsProgressListener(progressListener);
runNextTest();
}
else {
// reload the next tab
window.gBrowser.selectTabAtIndex(loadCount);
BrowserReloadOrDuplicate(fakeEvent);
}
}
}
window.gBrowser.addTabsProgressListener(progressListener);
BrowserReloadOrDuplicate(fakeEvent);
}
function countTabs() {
let needsRestore = 0,
isRestoring = 0,