diff options
Diffstat (limited to 'browser/components/sessionstore/test/browser_461634.js')
-rw-r--r-- | browser/components/sessionstore/test/browser_461634.js | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/browser/components/sessionstore/test/browser_461634.js b/browser/components/sessionstore/test/browser_461634.js new file mode 100644 index 0000000000..5de6b92c33 --- /dev/null +++ b/browser/components/sessionstore/test/browser_461634.js @@ -0,0 +1,137 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +const { SessionStore } = ChromeUtils.importESModule( + "resource:///modules/sessionstore/SessionStore.sys.mjs" +); + +add_task(async function testClosedTabData() { + /** Test for Bug 461634 **/ + + const REMEMBER = Date.now(), + FORGET = Math.random(); + let test_state = { + windows: [ + { + tabs: [{ entries: [] }], + _closedTabs: [ + { + state: { entries: [{ url: "http://www.example.net/" }] }, + title: FORGET, + }, + { + state: { entries: [{ url: "http://www.example.net/" }] }, + title: REMEMBER, + }, + { + state: { entries: [{ url: "http://www.example.net/" }] }, + title: FORGET, + }, + { + state: { entries: [{ url: "http://www.example.net/" }] }, + title: REMEMBER, + }, + ], + }, + ], + }; + let remember_count = 2; + + function countByTitle(aClosedTabList, aTitle) { + return aClosedTabList.filter(aData => aData.title == aTitle).length; + } + + function testForError(aFunction) { + try { + aFunction(); + return false; + } catch (ex) { + return ex.name == "NS_ERROR_ILLEGAL_VALUE"; + } + } + + // Open a window and add the above closed tab list. + let newWin = openDialog(location, "", "chrome,all,dialog=no"); + await promiseWindowLoaded(newWin); + + Services.prefs.setIntPref( + "browser.sessionstore.max_tabs_undo", + test_state.windows[0]._closedTabs.length + ); + await setWindowState(newWin, test_state); + + let closedTabs = SessionStore.getClosedTabData(newWin); + + // Verify that non JSON serialized data is the same as JSON serialized data. + is( + JSON.stringify(closedTabs), + JSON.stringify(SessionStore.getClosedTabData(newWin)), + "Non-serialized data is the same as serialized data" + ); + + is( + closedTabs.length, + test_state.windows[0]._closedTabs.length, + "Closed tab list has the expected length" + ); + is( + countByTitle(closedTabs, FORGET), + test_state.windows[0]._closedTabs.length - remember_count, + "The correct amout of tabs are to be forgotten" + ); + is( + countByTitle(closedTabs, REMEMBER), + remember_count, + "Everything is set up" + ); + + // All of the following calls with illegal arguments should throw NS_ERROR_ILLEGAL_VALUE. + ok( + testForError(() => ss.forgetClosedTab({}, 0)), + "Invalid window for forgetClosedTab throws" + ); + ok( + testForError(() => ss.forgetClosedTab(newWin, -1)), + "Invalid tab for forgetClosedTab throws" + ); + ok( + testForError(() => + ss.forgetClosedTab(newWin, test_state.windows[0]._closedTabs.length + 1) + ), + "Invalid tab for forgetClosedTab throws" + ); + + // Remove third tab, then first tab. + ss.forgetClosedTab(newWin, 2); + ss.forgetClosedTab(newWin, null); + + closedTabs = SessionStore.getClosedTabData(newWin); + + // Verify that non JSON serialized data is the same as JSON serialized data. + is( + JSON.stringify(closedTabs), + JSON.stringify(SessionStore.getClosedTabData(newWin)), + "Non-serialized data is the same as serialized data" + ); + + is( + closedTabs.length, + remember_count, + "The correct amout of tabs was removed" + ); + is( + countByTitle(closedTabs, FORGET), + 0, + "All tabs specifically forgotten were indeed removed" + ); + is( + countByTitle(closedTabs, REMEMBER), + remember_count, + "... and tabs not specifically forgetten weren't" + ); + + // Clean up. + Services.prefs.clearUserPref("browser.sessionstore.max_tabs_undo"); + await BrowserTestUtils.closeWindow(newWin); +}); |