Tue, 06 Jan 2015 21:39:09 +0100
Conditionally force memory storage according to privacy.thirdparty.isolate;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.
1 <!DOCTYPE HTML>
2 <html>
3 <!--
4 https://bugzilla.mozilla.org/show_bug.cgi?id=786301
5 -->
6 <head>
7 <meta charset="utf-8">
8 <title>Tests that uninstalling app removes the localStorage data</title>
9 <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
10 <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?>
11 </head>
12 <body>
13 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=786296">Mozilla Bug 786301</a>
14 <p id="display"></p>
15 <div id="content">
16 <iframe src="http://example.com/tests/error404"></iframe>
17 </div>
18 <pre id="test">
19 <script type="application/javascript;version=1.7">
21 /** Test for Bug 786301 **/
23 /*
24 * This test will check that localStorage data are correctly deleted when an app
25 * is uninstalled.
26 * Here is the big picture of what the test does:
27 * 1. Setup permissions and preferences.
28 * 2. Install a dummy application and embed it in an iframe.
29 * 3. Load a mozbrowser iframe from this application.
30 * 4. Fill storages for the app and the mozbrowser iframe.
31 * 5. Uninstall the application.
32 *
33 * Expected result: all localStorage data from the app and mozbrowser have been
34 * deleted but sessionStorage stays untouched such as non-app/browser data.
35 *
36 * This test is asynchronous and methods are called in a reading order.
37 * Each method has a deeper explanation of what it does
38 */
40 const Ci = Components.interfaces;
41 const Cc = Components.classes;
42 const Cu = Components.utils;
44 SimpleTest.waitForExplicitFinish();
46 var permManager = Cc["@mozilla.org/permissionmanager;1"]
47 .getService(Ci.nsIPermissionManager);
48 var appsService = Cc['@mozilla.org/AppsService;1']
49 .getService(Ci.nsIAppsService);
51 /**
52 * Initialize the |storage| that has been given with "foo" => "bar".
53 * Checks that the storage wasn't initialized and checks that the initialization
54 * was successful.
55 */
56 function setupStorage(storage) {
57 is(storage.getItem("foo"), null, "no data");
59 storage.setItem("foo", "bar");
60 is(storage.getItem("foo"), "bar", "data written");
61 }
63 permManager.addFromPrincipal(window.document.nodePrincipal, "webapps-manage",
64 Ci.nsIPermissionManager.ALLOW_ACTION);
65 permManager.addFromPrincipal(window.document.nodePrincipal, "browser",
66 Ci.nsIPermissionManager.ALLOW_ACTION);
68 SimpleTest.registerCleanupFunction(() => {
69 gWitnessStorage.localStorage.clear();
70 gWitnessStorage.sessionStorage.clear();
72 permManager.removeFromPrincipal(window.document.nodePrincipal, "webapps-manage",
73 Ci.nsIPermissionManager.ALLOW_ACTION);
74 permManager.removeFromPrincipal(window.document.nodePrincipal, "browser",
75 Ci.nsIPermissionManager.ALLOW_ACTION);
76 });
78 // URL of the manifest of the app we want to install.
79 const gManifestURL = "http://www.example.com/chrome/dom/tests/mochitest/webapps/apps/basic.webapp";
80 // ID of the installed app.
81 var gTestAppId = 0;
82 // Cookies currently in the system.
83 var gCurrentCookiesCount = 0;
84 // Storages from a non-app to make sure we do not remove cookies from everywhere.
85 var gWitnessStorage = {};
86 // Storages for the app.
87 var gAppStorage = {};
88 // Storage for a mozbrowser inside the app.
89 var gBrowserStorage = {};
91 function runTest() {
92 /*
93 * We are setuping the witness storage (non-app) and will install the
94 * application.
95 * When the application is installed, we will insert it in an iframe and wait
96 * for the load event. to be fired.
97 */
99 gWitnessStorage.localStorage = window.frames[0].localStorage;
100 gWitnessStorage.sessionStorage = window.frames[0].sessionStorage;
102 setupStorage(gWitnessStorage.localStorage);
103 setupStorage(gWitnessStorage.sessionStorage);
105 navigator.mozApps.install(gManifestURL, null).onsuccess = function() {
106 gTestAppId = appsService.getAppLocalIdByManifestURL(gManifestURL);
108 var frame = document.createElement('iframe');
109 frame.setAttribute('mozbrowser', '');
110 frame.setAttribute('mozapp', gManifestURL);
111 frame.src = 'http://example.com/tests/error404';
112 frame.name = 'app';
114 frame.addEventListener('load', appFrameLoadEvent);
116 document.body.appendChild(frame);
117 };
118 }
120 function appFrameLoadEvent() {
121 /*
122 * The app frame has been loaded. We can now add permissions for the app to
123 * create browsers and we will load a page in this browser and wait for the
124 * load event.
125 */
126 permManager.addFromPrincipal(window.frames[1].document.nodePrincipal, "browser",
127 Ci.nsIPermissionManager.ALLOW_ACTION);
129 var frame = document.createElement('iframe');
130 frame.setAttribute('mozbrowser', '');
131 frame.src = 'http://example.com/tests/error404_2';
133 frame.addEventListener('load', browserLoadEvent);
135 document.getElementsByName('app')[0].contentDocument.body.appendChild(frame);
136 }
138 function browserLoadEvent() {
139 /*
140 * The browser inside the app has loaded.
141 * We can now setup the app and browser storages and uninstall the app.
142 */
144 gAppStorage.localStorage = window.frames[1].localStorage;
145 gAppStorage.sessionStorage = window.frames[1].sessionStorage;
147 gBrowserStorage.localStorage = window.frames[1].frames[0].localStorage;
148 gBrowserStorage.sessionStorage = window.frames[1].frames[0].sessionStorage;
150 setupStorage(gAppStorage.localStorage);
151 setupStorage(gAppStorage.sessionStorage);
152 setupStorage(gBrowserStorage.localStorage);
153 setupStorage(gBrowserStorage.sessionStorage);
155 navigator.mozApps.mgmt.getNotInstalled().onsuccess = function() {
156 for (i in this.result) {
157 var app = this.result[i];
158 if (app.manifestURL == gManifestURL) {
159 navigator.mozApps.mgmt.uninstall(app).onsuccess = function() {
160 /*
161 * Now that the app is uninstalled, we should not find any more
162 * localStorage data from the app or its browsers. However,
163 * sessionStorage is expected to stay.
164 * The witness storage (non-app) should not have changed.
165 */
166 is(gAppStorage.localStorage.getItem("foo"), null, "localstorage data have been deleted");
167 is(gBrowserStorage.localStorage.getItem("foo"), null, "localstorage data have been deleted");
169 is(gAppStorage.sessionStorage.getItem("foo"), "bar", "sessionstorage data have not been deleted");
170 is(gBrowserStorage.sessionStorage.getItem("foo"), "bar", "sessionstorage data have not been deleted");
172 is(gWitnessStorage.localStorage.getItem("foo"), "bar", "data are still there");
173 is(gWitnessStorage.sessionStorage.getItem("foo"), "bar", "data are still there");
175 SimpleTest.finish();
177 return;
178 };
179 }
180 }
181 };
182 }
184 addLoadEvent(() =>
185 SpecialPowers.pushPrefEnv({set: [['dom.mozBrowserFramesEnabled', true]]}, () =>
186 SpecialPowers.autoConfirmAppInstall(runTest)
187 )
188 );
190 </script>
191 </pre>
192 </body>
193 </html>