Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 /* Any copyright is dedicated to the Public Domain.
2 * http://creativecommons.org/publicdomain/zero/1.0/ */
4 "use strict";
6 const RAND = Math.random();
7 const URL = "http://mochi.test:8888/browser/" +
8 "browser/components/sessionstore/test/browser_sessionStorage.html" +
9 "?" + RAND;
11 const OUTER_VALUE = "outer-value-" + RAND;
12 const INNER_VALUE = "inner-value-" + RAND;
14 /**
15 * This test ensures that setting, modifying and restoring sessionStorage data
16 * works as expected.
17 */
18 add_task(function session_storage() {
19 let tab = gBrowser.addTab(URL);
20 let browser = tab.linkedBrowser;
21 yield promiseBrowserLoaded(browser);
23 // Flush to make sure chrome received all data.
24 SyncHandlers.get(browser).flush();
26 let {storage} = JSON.parse(ss.getTabState(tab));
27 is(storage["http://example.com"].test, INNER_VALUE,
28 "sessionStorage data for example.com has been serialized correctly");
29 is(storage["http://mochi.test:8888"].test, OUTER_VALUE,
30 "sessionStorage data for mochi.test has been serialized correctly");
32 // Ensure that modifying sessionStore values works.
33 yield modifySessionStorage(browser, {test: "modified"});
34 yield modifySessionStorage2(browser, {test: "modified2"});
35 SyncHandlers.get(browser).flush();
37 let {storage} = JSON.parse(ss.getTabState(tab));
38 is(storage["http://example.com"].test, "modified2",
39 "sessionStorage data for example.com has been serialized correctly");
40 is(storage["http://mochi.test:8888"].test, "modified",
41 "sessionStorage data for mochi.test has been serialized correctly");
43 // Test that duplicating a tab works.
44 let tab2 = gBrowser.duplicateTab(tab);
45 let browser2 = tab2.linkedBrowser;
46 yield promiseTabRestored(tab2);
48 // Flush to make sure chrome received all data.
49 SyncHandlers.get(browser2).flush();
51 let {storage} = JSON.parse(ss.getTabState(tab2));
52 is(storage["http://example.com"].test, "modified2",
53 "sessionStorage data for example.com has been duplicated correctly");
54 is(storage["http://mochi.test:8888"].test, "modified",
55 "sessionStorage data for mochi.test has been duplicated correctly");
57 // Ensure that the content script retains restored data
58 // (by e.g. duplicateTab) and sends it along with new data.
59 yield modifySessionStorage(browser2, {test: "modified3"});
60 SyncHandlers.get(browser2).flush();
62 let {storage} = JSON.parse(ss.getTabState(tab2));
63 is(storage["http://example.com"].test, "modified2",
64 "sessionStorage data for example.com has been duplicated correctly");
65 is(storage["http://mochi.test:8888"].test, "modified3",
66 "sessionStorage data for mochi.test has been duplicated correctly");
68 // Check that loading a new URL discards data.
69 browser2.loadURI("http://mochi.test:8888/");
70 yield promiseBrowserLoaded(browser2);
71 SyncHandlers.get(browser2).flush();
73 let {storage} = JSON.parse(ss.getTabState(tab2));
74 is(storage["http://mochi.test:8888"].test, "modified3",
75 "navigating retains correct storage data");
76 ok(!storage["http://example.com"], "storage data was discarded");
78 // Check that loading a new URL discards data.
79 browser2.loadURI("about:mozilla");
80 yield promiseBrowserLoaded(browser2);
81 SyncHandlers.get(browser2).flush();
83 let state = JSON.parse(ss.getTabState(tab2));
84 ok(!state.hasOwnProperty("storage"), "storage data was discarded");
86 // Clean up.
87 gBrowser.removeTab(tab);
88 gBrowser.removeTab(tab2);
89 });
91 /**
92 * This test ensures that purging domain data also purges data from the
93 * sessionStorage data collected for tabs.
94 */
95 add_task(function purge_domain() {
96 let tab = gBrowser.addTab(URL);
97 let browser = tab.linkedBrowser;
98 yield promiseBrowserLoaded(browser);
100 // Purge data for "mochi.test".
101 yield purgeDomainData(browser, "mochi.test");
103 // Flush to make sure chrome received all data.
104 SyncHandlers.get(browser).flush();
106 let {storage} = JSON.parse(ss.getTabState(tab));
107 ok(!storage["http://mochi.test:8888"],
108 "sessionStorage data for mochi.test has been purged");
109 is(storage["http://example.com"].test, INNER_VALUE,
110 "sessionStorage data for example.com has been preserved");
112 gBrowser.removeTab(tab);
113 });
115 /**
116 * This test ensures that collecting sessionStorage data respects the privacy
117 * levels as set by the user.
118 */
119 add_task(function respect_privacy_level() {
120 let tab = gBrowser.addTab(URL + "&secure");
121 yield promiseBrowserLoaded(tab.linkedBrowser);
122 gBrowser.removeTab(tab);
124 let [{state: {storage}}] = JSON.parse(ss.getClosedTabData(window));
125 is(storage["http://mochi.test:8888"].test, OUTER_VALUE,
126 "http sessionStorage data has been saved");
127 is(storage["https://example.com"].test, INNER_VALUE,
128 "https sessionStorage data has been saved");
130 // Disable saving data for encrypted sites.
131 Services.prefs.setIntPref("browser.sessionstore.privacy_level", 1);
133 let tab = gBrowser.addTab(URL + "&secure");
134 yield promiseBrowserLoaded(tab.linkedBrowser);
135 gBrowser.removeTab(tab);
137 let [{state: {storage}}] = JSON.parse(ss.getClosedTabData(window));
138 is(storage["http://mochi.test:8888"].test, OUTER_VALUE,
139 "http sessionStorage data has been saved");
140 ok(!storage["https://example.com"],
141 "https sessionStorage data has *not* been saved");
143 // Disable saving data for any site.
144 Services.prefs.setIntPref("browser.sessionstore.privacy_level", 2);
146 // Check that duplicating a tab copies all private data.
147 let tab = gBrowser.addTab(URL + "&secure");
148 yield promiseBrowserLoaded(tab.linkedBrowser);
149 let tab2 = gBrowser.duplicateTab(tab);
150 yield promiseTabRestored(tab2);
151 gBrowser.removeTab(tab);
153 // With privacy_level=2 the |tab| shouldn't have any sessionStorage data.
154 let [{state: {storage}}] = JSON.parse(ss.getClosedTabData(window));
155 ok(!storage, "sessionStorage data has *not* been saved");
157 // Restore the default privacy level and close the duplicated tab.
158 Services.prefs.clearUserPref("browser.sessionstore.privacy_level");
159 gBrowser.removeTab(tab2);
161 // With privacy_level=0 the duplicated |tab2| should persist all data.
162 let [{state: {storage}}] = JSON.parse(ss.getClosedTabData(window));
163 is(storage["http://mochi.test:8888"].test, OUTER_VALUE,
164 "http sessionStorage data has been saved");
165 is(storage["https://example.com"].test, INNER_VALUE,
166 "https sessionStorage data has been saved");
167 });
169 function waitForStorageEvent(browser) {
170 return promiseContentMessage(browser, "ss-test:MozStorageChanged");
171 }
173 function modifySessionStorage(browser, data) {
174 browser.messageManager.sendAsyncMessage("ss-test:modifySessionStorage", data);
175 return waitForStorageEvent(browser);
176 }
178 function modifySessionStorage2(browser, data) {
179 browser.messageManager.sendAsyncMessage("ss-test:modifySessionStorage2", data);
180 return waitForStorageEvent(browser);
181 }
183 function purgeDomainData(browser, domain) {
184 return sendMessage(browser, "ss-test:purgeDomainData", domain);
185 }