зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1422588 fix discard if tab sessionstate is not ready, r=Gijs,mikedeboer
If discard is used immediately after creating a tab, restoring the tab resulted in an unusable tab. This was due to the sessionstate not being ready. This adds enough sessionstate to restore when this occurs. MozReview-Commit-ID: 6PIc71BS8VU --HG-- extra : rebase_source : 1bb9627eee561e9bf924e9eb2a34a5071cae3742
This commit is contained in:
Родитель
c6df0d1bfe
Коммит
0df4ab0a93
|
@ -67,3 +67,41 @@ add_task(async function test_discarded() {
|
||||||
BrowserTestUtils.removeTab(tab2);
|
BrowserTestUtils.removeTab(tab2);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// If discard is called immediately after creating a new tab, the new tab may not have loaded,
|
||||||
|
// and the sessionstore for that tab is not ready for discarding. The result was a corrupted
|
||||||
|
// sessionstore for the tab, which when the tab was activated, resulted in a tab with partial
|
||||||
|
// state.
|
||||||
|
add_task(async function test_create_then_discard() {
|
||||||
|
let extension = ExtensionTestUtils.loadExtension({
|
||||||
|
manifest: {
|
||||||
|
"permissions": ["tabs", "webNavigation"],
|
||||||
|
},
|
||||||
|
|
||||||
|
background: async function() {
|
||||||
|
let createdTab;
|
||||||
|
|
||||||
|
browser.tabs.onUpdated.addListener((tabId, updatedInfo) => {
|
||||||
|
if (!updatedInfo.discarded) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
browser.webNavigation.onCompleted.addListener(async (details) => {
|
||||||
|
browser.test.assertEq(createdTab.id, details.tabId, "created tab navigation is completed");
|
||||||
|
let activeTab = await browser.tabs.get(details.tabId);
|
||||||
|
browser.test.assertEq("http://example.com/", details.url, "created tab url is correct");
|
||||||
|
browser.test.assertEq("http://example.com/", activeTab.url, "created tab url is correct");
|
||||||
|
browser.tabs.remove(details.tabId);
|
||||||
|
browser.test.notifyPass("test-finished");
|
||||||
|
}, {url: [{hostContains: "example.com"}]});
|
||||||
|
|
||||||
|
browser.tabs.update(tabId, {active: true});
|
||||||
|
});
|
||||||
|
|
||||||
|
createdTab = await browser.tabs.create({url: "http://example.com/", active: false});
|
||||||
|
browser.tabs.discard(createdTab.id);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
await extension.startup();
|
||||||
|
await extension.awaitFinish("test-finished");
|
||||||
|
await extension.unload();
|
||||||
|
});
|
||||||
|
|
|
@ -2030,11 +2030,25 @@ var SessionStoreInternal = {
|
||||||
this._crashedBrowsers.delete(browser.permanentKey);
|
this._crashedBrowsers.delete(browser.permanentKey);
|
||||||
aTab.removeAttribute("crashed");
|
aTab.removeAttribute("crashed");
|
||||||
|
|
||||||
|
let {userTypedValue = "", userTypedClear = 0} = browser;
|
||||||
|
|
||||||
|
let cacheState = TabStateCache.get(browser);
|
||||||
|
if (cacheState === undefined && userTypedValue) {
|
||||||
|
// Discard was likely called before state can be cached. Update
|
||||||
|
// the persistent tab state cache with browser information so a
|
||||||
|
// restore will be successful. This information is necessary for
|
||||||
|
// restoreTabContent in ContentRestore.jsm to work properly.
|
||||||
|
TabStateCache.update(browser, {
|
||||||
|
userTypedValue,
|
||||||
|
userTypedClear: 1,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
TAB_LAZY_STATES.set(aTab, {
|
TAB_LAZY_STATES.set(aTab, {
|
||||||
url: browser.currentURI.spec,
|
url: browser.currentURI.spec,
|
||||||
title: aTab.label,
|
title: aTab.label,
|
||||||
userTypedValue: browser.userTypedValue || "",
|
userTypedValue,
|
||||||
userTypedClear: browser.userTypedClear || 0
|
userTypedClear,
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче