browser/components/sessionstore/test/browser_sessionStorage.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

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 }

mercurial