forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			188 lines
		
	
	
	
		
			7.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			188 lines
		
	
	
	
		
			7.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* Any copyright is dedicated to the Public Domain.
 | |
|  * http://creativecommons.org/publicdomain/zero/1.0/ */
 | |
| 
 | |
| "use strict";
 | |
| 
 | |
| const RAND = Math.random();
 | |
| const URL = "http://mochi.test:8888/browser/" +
 | |
|             "browser/components/sessionstore/test/browser_sessionStorage.html" +
 | |
|             "?" + RAND;
 | |
| 
 | |
| const OUTER_VALUE = "outer-value-" + RAND;
 | |
| const INNER_VALUE = "inner-value-" + RAND;
 | |
| 
 | |
| /**
 | |
|  * This test ensures that setting, modifying and restoring sessionStorage data
 | |
|  * works as expected.
 | |
|  */
 | |
| add_task(function session_storage() {
 | |
|   let tab = gBrowser.addTab(URL);
 | |
|   let browser = tab.linkedBrowser;
 | |
|   yield promiseBrowserLoaded(browser);
 | |
| 
 | |
|   // Flush to make sure chrome received all data.
 | |
|   yield TabStateFlusher.flush(browser);
 | |
| 
 | |
|   let {storage} = JSON.parse(ss.getTabState(tab));
 | |
|   is(storage["http://example.com"].test, INNER_VALUE,
 | |
|     "sessionStorage data for example.com has been serialized correctly");
 | |
|   is(storage["http://mochi.test:8888"].test, OUTER_VALUE,
 | |
|     "sessionStorage data for mochi.test has been serialized correctly");
 | |
| 
 | |
|   // Ensure that modifying sessionStore values works for the inner frame only.
 | |
|   yield modifySessionStorage(browser, {test: "modified1"}, {frameIndex: 0});
 | |
|   yield TabStateFlusher.flush(browser);
 | |
| 
 | |
|   ({storage} = JSON.parse(ss.getTabState(tab)));
 | |
|   is(storage["http://example.com"].test, "modified1",
 | |
|     "sessionStorage data for example.com has been serialized correctly");
 | |
|   is(storage["http://mochi.test:8888"].test, OUTER_VALUE,
 | |
|     "sessionStorage data for mochi.test has been serialized correctly");
 | |
| 
 | |
|   // Ensure that modifying sessionStore values works for both frames.
 | |
|   yield modifySessionStorage(browser, {test: "modified"});
 | |
|   yield modifySessionStorage(browser, {test: "modified2"}, {frameIndex: 0});
 | |
|   yield TabStateFlusher.flush(browser);
 | |
| 
 | |
|   ({storage} = JSON.parse(ss.getTabState(tab)));
 | |
|   is(storage["http://example.com"].test, "modified2",
 | |
|     "sessionStorage data for example.com has been serialized correctly");
 | |
|   is(storage["http://mochi.test:8888"].test, "modified",
 | |
|     "sessionStorage data for mochi.test has been serialized correctly");
 | |
| 
 | |
|   // Test that duplicating a tab works.
 | |
|   let tab2 = gBrowser.duplicateTab(tab);
 | |
|   let browser2 = tab2.linkedBrowser;
 | |
|   yield promiseTabRestored(tab2);
 | |
| 
 | |
|   // Flush to make sure chrome received all data.
 | |
|   yield TabStateFlusher.flush(browser2);
 | |
| 
 | |
|   ({storage} = JSON.parse(ss.getTabState(tab2)));
 | |
|   is(storage["http://example.com"].test, "modified2",
 | |
|     "sessionStorage data for example.com has been duplicated correctly");
 | |
|   is(storage["http://mochi.test:8888"].test, "modified",
 | |
|     "sessionStorage data for mochi.test has been duplicated correctly");
 | |
| 
 | |
|   // Ensure that the content script retains restored data
 | |
|   // (by e.g. duplicateTab) and sends it along with new data.
 | |
|   yield modifySessionStorage(browser2, {test: "modified3"});
 | |
|   yield TabStateFlusher.flush(browser2);
 | |
| 
 | |
|   ({storage} = JSON.parse(ss.getTabState(tab2)));
 | |
|   is(storage["http://example.com"].test, "modified2",
 | |
|     "sessionStorage data for example.com has been duplicated correctly");
 | |
|   is(storage["http://mochi.test:8888"].test, "modified3",
 | |
|     "sessionStorage data for mochi.test has been duplicated correctly");
 | |
| 
 | |
|   // Check that loading a new URL discards data.
 | |
|   browser2.loadURI("http://mochi.test:8888/");
 | |
|   yield promiseBrowserLoaded(browser2);
 | |
|   yield TabStateFlusher.flush(browser2);
 | |
| 
 | |
|   ({storage} = JSON.parse(ss.getTabState(tab2)));
 | |
|   is(storage["http://mochi.test:8888"].test, "modified3",
 | |
|     "navigating retains correct storage data");
 | |
|   ok(!storage["http://example.com"], "storage data was discarded");
 | |
| 
 | |
|   // Check that loading a new URL discards data.
 | |
|   browser2.loadURI("about:mozilla");
 | |
|   yield promiseBrowserLoaded(browser2);
 | |
|   yield TabStateFlusher.flush(browser2);
 | |
| 
 | |
|   let state = JSON.parse(ss.getTabState(tab2));
 | |
|   ok(!state.hasOwnProperty("storage"), "storage data was discarded");
 | |
| 
 | |
|   // Clean up.
 | |
|   yield promiseRemoveTab(tab);
 | |
|   yield promiseRemoveTab(tab2);
 | |
| });
 | |
| 
 | |
| /**
 | |
|  * This test ensures that purging domain data also purges data from the
 | |
|  * sessionStorage data collected for tabs.
 | |
|  */
 | |
| add_task(function purge_domain() {
 | |
|   let tab = gBrowser.addTab(URL);
 | |
|   let browser = tab.linkedBrowser;
 | |
|   yield promiseBrowserLoaded(browser);
 | |
| 
 | |
|   // Purge data for "mochi.test".
 | |
|   yield purgeDomainData(browser, "mochi.test");
 | |
| 
 | |
|   // Flush to make sure chrome received all data.
 | |
|   yield TabStateFlusher.flush(browser);
 | |
| 
 | |
|   let {storage} = JSON.parse(ss.getTabState(tab));
 | |
|   ok(!storage["http://mochi.test:8888"],
 | |
|     "sessionStorage data for mochi.test has been purged");
 | |
|   is(storage["http://example.com"].test, INNER_VALUE,
 | |
|     "sessionStorage data for example.com has been preserved");
 | |
| 
 | |
|   yield promiseRemoveTab(tab);
 | |
| });
 | |
| 
 | |
| /**
 | |
|  * This test ensures that collecting sessionStorage data respects the privacy
 | |
|  * levels as set by the user.
 | |
|  */
 | |
| add_task(function respect_privacy_level() {
 | |
|   let tab = gBrowser.addTab(URL + "&secure");
 | |
|   yield promiseBrowserLoaded(tab.linkedBrowser);
 | |
|   yield promiseRemoveTab(tab);
 | |
| 
 | |
|   let [{state: {storage}}] = JSON.parse(ss.getClosedTabData(window));
 | |
|   is(storage["http://mochi.test:8888"].test, OUTER_VALUE,
 | |
|     "http sessionStorage data has been saved");
 | |
|   is(storage["https://example.com"].test, INNER_VALUE,
 | |
|     "https sessionStorage data has been saved");
 | |
| 
 | |
|   // Disable saving data for encrypted sites.
 | |
|   Services.prefs.setIntPref("browser.sessionstore.privacy_level", 1);
 | |
| 
 | |
|   tab = gBrowser.addTab(URL + "&secure");
 | |
|   yield promiseBrowserLoaded(tab.linkedBrowser);
 | |
|   yield promiseRemoveTab(tab);
 | |
| 
 | |
|   [{state: {storage}}] = JSON.parse(ss.getClosedTabData(window));
 | |
|   is(storage["http://mochi.test:8888"].test, OUTER_VALUE,
 | |
|     "http sessionStorage data has been saved");
 | |
|   ok(!storage["https://example.com"],
 | |
|     "https sessionStorage data has *not* been saved");
 | |
| 
 | |
|   // Disable saving data for any site.
 | |
|   Services.prefs.setIntPref("browser.sessionstore.privacy_level", 2);
 | |
| 
 | |
|   // Check that duplicating a tab copies all private data.
 | |
|   tab = gBrowser.addTab(URL + "&secure");
 | |
|   yield promiseBrowserLoaded(tab.linkedBrowser);
 | |
|   let tab2 = gBrowser.duplicateTab(tab);
 | |
|   yield promiseTabRestored(tab2);
 | |
|   yield promiseRemoveTab(tab);
 | |
| 
 | |
|   // With privacy_level=2 the |tab| shouldn't have any sessionStorage data.
 | |
|   [{state: {storage}}] = JSON.parse(ss.getClosedTabData(window));
 | |
|   ok(!storage, "sessionStorage data has *not* been saved");
 | |
| 
 | |
|   // Remove all closed tabs before continuing with the next test.
 | |
|   // As Date.now() isn't monotonic we might sometimes check
 | |
|   // the wrong closedTabData entry.
 | |
|   while (ss.getClosedTabCount(window) > 0) {
 | |
|     ss.forgetClosedTab(window, 0);
 | |
|   }
 | |
| 
 | |
|   // Restore the default privacy level and close the duplicated tab.
 | |
|   Services.prefs.clearUserPref("browser.sessionstore.privacy_level");
 | |
|   yield promiseRemoveTab(tab2);
 | |
| 
 | |
|   // With privacy_level=0 the duplicated |tab2| should persist all data.
 | |
|   [{state: {storage}}] = JSON.parse(ss.getClosedTabData(window));
 | |
|   is(storage["http://mochi.test:8888"].test, OUTER_VALUE,
 | |
|     "http sessionStorage data has been saved");
 | |
|   is(storage["https://example.com"].test, INNER_VALUE,
 | |
|     "https sessionStorage data has been saved");
 | |
| });
 | |
| 
 | |
| function purgeDomainData(browser, domain) {
 | |
|   return sendMessage(browser, "ss-test:purgeDomainData", domain);
 | |
| }
 | 
