forked from mirrors/gecko-dev
		
	 b7abed98d9
			
		
	
	
		b7abed98d9
		
	
	
	
	
		
			
			MozReview-Commit-ID: uoPx46cNL1 --HG-- extra : rebase_source : 753343359129011528fb8deef5a1a7c055ed6bdc
		
			
				
	
	
		
			138 lines
		
	
	
	
		
			4.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			138 lines
		
	
	
	
		
			4.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| 
 | |
| /**
 | |
|  * This test ensures that we correctly clean up the session state before
 | |
|  * writing to disk a last time on shutdown. For now it only tests that each
 | |
|  * tab's shistory is capped to a maximum number of preceding and succeeding
 | |
|  * entries.
 | |
|  */
 | |
| 
 | |
| const {XPCOMUtils} = ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm", {});
 | |
| const {SessionWorker} = ChromeUtils.import("resource:///modules/sessionstore/SessionWorker.jsm", {});
 | |
| 
 | |
| const profd = do_get_profile();
 | |
| const {SessionFile} = ChromeUtils.import("resource:///modules/sessionstore/SessionFile.jsm", {});
 | |
| const {Paths} = SessionFile;
 | |
| 
 | |
| const {File} = OS;
 | |
| 
 | |
| const MAX_ENTRIES = 9;
 | |
| const URL = "http://example.com/#";
 | |
| 
 | |
| // We need a XULAppInfo to initialize SessionFile
 | |
| ChromeUtils.import("resource://testing-common/AppInfo.jsm", this);
 | |
| updateAppInfo({
 | |
|   name: "SessionRestoreTest",
 | |
|   ID: "{230de50e-4cd1-11dc-8314-0800200c9a66}",
 | |
|   version: "1",
 | |
|   platformVersion: "",
 | |
| });
 | |
| 
 | |
| var gSourceHandle;
 | |
| 
 | |
| async function prepareWithLimit(back, fwd) {
 | |
|   await SessionFile.wipe();
 | |
| 
 | |
|   if (!gSourceHandle) {
 | |
|     gSourceHandle = do_get_file("data/sessionstore_valid.js");
 | |
|   }
 | |
|   gSourceHandle.copyTo(profd, "sessionstore.js");
 | |
|   await writeCompressedFile(Paths.clean.replace("jsonlz4", "js"), Paths.clean);
 | |
| 
 | |
|   Services.prefs.setIntPref("browser.sessionstore.max_serialize_back", back);
 | |
|   Services.prefs.setIntPref("browser.sessionstore.max_serialize_forward", fwd);
 | |
| 
 | |
|   // Finish SessionFile initialization.
 | |
|   await SessionFile.read();
 | |
| }
 | |
| 
 | |
| add_task(async function setup() {
 | |
|   await SessionFile.read();
 | |
| 
 | |
|   // Reset prefs on cleanup.
 | |
|   registerCleanupFunction(() => {
 | |
|     Services.prefs.clearUserPref("browser.sessionstore.max_serialize_back");
 | |
|     Services.prefs.clearUserPref("browser.sessionstore.max_serialize_forward");
 | |
|   });
 | |
| });
 | |
| 
 | |
| function createSessionState(index) {
 | |
|   // Generate the tab state entries and set the one-based
 | |
|   // tab-state index to the middle session history entry.
 | |
|   let tabState = {entries: [], index};
 | |
|   for (let i = 0; i < MAX_ENTRIES; i++) {
 | |
|     tabState.entries.push({url: URL + i});
 | |
|   }
 | |
| 
 | |
|   return {windows: [{tabs: [tabState]}]};
 | |
| }
 | |
| 
 | |
| async function writeAndParse(state, path, options = {}) {
 | |
|   await SessionWorker.post("write", [state, options]);
 | |
|   return JSON.parse(await File.read(path, {encoding: "utf-8", compression: "lz4"}));
 | |
| }
 | |
| 
 | |
| add_task(async function test_shistory_cap_none() {
 | |
|   let state = createSessionState(5);
 | |
| 
 | |
|   // Don't limit the number of shistory entries.
 | |
|   await prepareWithLimit(-1, -1);
 | |
| 
 | |
|   // Check that no caps are applied.
 | |
|   let diskState = await writeAndParse(state, Paths.clean, {isFinalWrite: true});
 | |
|   Assert.deepEqual(state, diskState, "no cap applied");
 | |
| });
 | |
| 
 | |
| add_task(async function test_shistory_cap_middle() {
 | |
|   let state = createSessionState(5);
 | |
|   await prepareWithLimit(2, 3);
 | |
| 
 | |
|   // Cap is only applied on clean shutdown.
 | |
|   let diskState = await writeAndParse(state, Paths.recovery);
 | |
|   Assert.deepEqual(state, diskState, "no cap applied");
 | |
| 
 | |
|   // Check that the right number of shistory entries was discarded
 | |
|   // and the shistory index updated accordingly.
 | |
|   diskState = await writeAndParse(state, Paths.clean, {isFinalWrite: true});
 | |
|   let tabState = state.windows[0].tabs[0];
 | |
|   tabState.entries = tabState.entries.slice(2, 8);
 | |
|   tabState.index = 3;
 | |
|   Assert.deepEqual(state, diskState, "cap applied");
 | |
| });
 | |
| 
 | |
| add_task(async function test_shistory_cap_lower_bound() {
 | |
|   let state = createSessionState(1);
 | |
|   await prepareWithLimit(5, 5);
 | |
| 
 | |
|   // Cap is only applied on clean shutdown.
 | |
|   let diskState = await writeAndParse(state, Paths.recovery);
 | |
|   Assert.deepEqual(state, diskState, "no cap applied");
 | |
| 
 | |
|   // Check that the right number of shistory entries was discarded.
 | |
|   diskState = await writeAndParse(state, Paths.clean, {isFinalWrite: true});
 | |
|   let tabState = state.windows[0].tabs[0];
 | |
|   tabState.entries = tabState.entries.slice(0, 6);
 | |
|   Assert.deepEqual(state, diskState, "cap applied");
 | |
| });
 | |
| 
 | |
| add_task(async function test_shistory_cap_upper_bound() {
 | |
|   let state = createSessionState(MAX_ENTRIES);
 | |
|   await prepareWithLimit(5, 5);
 | |
| 
 | |
|   // Cap is only applied on clean shutdown.
 | |
|   let diskState = await writeAndParse(state, Paths.recovery);
 | |
|   Assert.deepEqual(state, diskState, "no cap applied");
 | |
| 
 | |
|   // Check that the right number of shistory entries was discarded
 | |
|   // and the shistory index updated accordingly.
 | |
|   diskState = await writeAndParse(state, Paths.clean, {isFinalWrite: true});
 | |
|   let tabState = state.windows[0].tabs[0];
 | |
|   tabState.entries = tabState.entries.slice(3);
 | |
|   tabState.index = 6;
 | |
|   Assert.deepEqual(state, diskState, "cap applied");
 | |
| });
 | |
| 
 | |
| add_task(async function cleanup() {
 | |
|   await SessionFile.wipe();
 | |
|   await SessionFile.read();
 | |
| });
 |