dom/tests/mochitest/localstorage/test_clear_browser_data.html

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:3106aea43220
1 <!DOCTYPE HTML>
2 <html>
3 <!--
4 https://bugzilla.mozilla.org/show_bug.cgi?id=795134
5 -->
6 <head>
7 <meta charset="utf-8">
8 <title>Tests that clearing mozbrowser private data 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=795134">Mozilla Bug 795134</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">
20
21 /** Test for Bug 795134 **/
22
23 /*
24 * This test will check that localStorage data are correctly deleted when it is
25 * requested that a mozbrowser private data are deleted.
26 *
27 * Here is the big picture of what the test does:
28 * 1. Setup permissions and preferences.
29 * 2. Install a dummy application and embed it in an iframe.
30 * 3. Load a mozbrowser iframe from this application.
31 * 4. Fill storages for the app and the mozbrowser iframe.
32 * 5. Uninstall the application.
33 *
34 * Expected result: all localStorage data from the mozbrowser have been deleted
35 * but sessionStorage stays untouched such as all non-browser data.
36 *
37 * This test is asynchronous and methods are called in a reading order.
38 * Each method has a deeper explanation of what it does
39 */
40
41 const Ci = Components.interfaces;
42 const Cc = Components.classes;
43 const Cu = Components.utils;
44
45 SimpleTest.waitForExplicitFinish();
46
47 var permManager = Cc["@mozilla.org/permissionmanager;1"]
48 .getService(Ci.nsIPermissionManager);
49 var appsService = Cc['@mozilla.org/AppsService;1']
50 .getService(Ci.nsIAppsService);
51
52 /**
53 * Initialize the |storage| that has been given with "foo" => "bar".
54 * Checks that the storage wasn't initialized and checks that the initialization
55 * was successful.
56 */
57 function setupStorage(storage) {
58 is(storage.getItem("foo"), null, "no data");
59
60 storage.setItem("foo", "bar");
61 is(storage.getItem("foo"), "bar", "data written");
62 }
63
64 permManager.addFromPrincipal(window.document.nodePrincipal, "webapps-manage",
65 Ci.nsIPermissionManager.ALLOW_ACTION);
66 permManager.addFromPrincipal(window.document.nodePrincipal, "browser",
67 Ci.nsIPermissionManager.ALLOW_ACTION);
68
69 SimpleTest.registerCleanupFunction(() => {
70 gWitnessStorage.localStorage.clear();
71 gWitnessStorage.sessionStorage.clear();
72
73 permManager.removeFromPrincipal(window.document.nodePrincipal, "webapps-manage",
74 Ci.nsIPermissionManager.ALLOW_ACTION);
75 permManager.removeFromPrincipal(window.document.nodePrincipal, "browser",
76 Ci.nsIPermissionManager.ALLOW_ACTION);
77 });
78
79 // We want to simulate that all apps are launchable, for testing purpose.
80 SpecialPowers.setAllAppsLaunchable(true);
81
82 // URL of the manifest of the app we want to install.
83 const gManifestURL = "http://www.example.com/chrome/dom/tests/mochitest/webapps/apps/basic.webapp";
84 // ID of the installed app.
85 var gTestAppId = 0;
86 // Cookies currently in the system.
87 var gCurrentCookiesCount = 0;
88 // Storages from a non-app to make sure we do not remove cookies from everywhere.
89 var gWitnessStorage = {};
90 // Storages for the app.
91 var gAppStorage = {};
92 // Storage for a mozbrowser inside the app.
93 var gBrowserStorage = {};
94
95 function runTest() {
96 /*
97 * We are setuping the witness storage (non-app) and will install the
98 * application.
99 * When the application is installed, we will insert it in an iframe and wait
100 * for the load event. to be fired.
101 */
102
103 gWitnessStorage.localStorage = window.frames[0].localStorage;
104 gWitnessStorage.sessionStorage = window.frames[0].sessionStorage;
105
106 setupStorage(gWitnessStorage.localStorage);
107 setupStorage(gWitnessStorage.sessionStorage);
108
109 navigator.mozApps.install(gManifestURL, null).onsuccess = function() {
110 gTestAppId = appsService.getAppLocalIdByManifestURL(gManifestURL);
111
112 var frame = document.createElement('iframe');
113 frame.setAttribute('mozbrowser', '');
114 frame.setAttribute('mozapp', gManifestURL);
115 frame.src = 'http://www.example.com/chrome/dom/tests/mochitest/localstorage/frame_clear_browser_data.html';
116 frame.name = 'app';
117
118 frame.addEventListener('load', appFrameLoadEvent);
119
120 document.body.appendChild(frame);
121 };
122 }
123
124 function appFrameLoadEvent() {
125 /*
126 * The app frame has been loaded. We can now add permissions for the app to
127 * create browsers and we will load a page in this browser and wait for the
128 * load event.
129 */
130 permManager.addFromPrincipal(window.frames[1].document.nodePrincipal, "browser",
131 Ci.nsIPermissionManager.ALLOW_ACTION);
132
133 var frame = document.createElement('iframe');
134 frame.setAttribute('mozbrowser', '');
135 frame.src = 'http://example.com/tests/error404_2';
136
137 frame.addEventListener('load', browserLoadEvent);
138
139 document.getElementsByName('app')[0].contentDocument.body.appendChild(frame);
140 }
141
142 function browserLoadEvent() {
143 /*
144 * The browser inside the app has loaded.
145 * We can now setup the app and browser storages and request the browser data
146 * to be cleared.
147 */
148
149 gAppStorage.localStorage = window.frames[1].localStorage;
150 gAppStorage.sessionStorage = window.frames[1].sessionStorage;
151
152 gBrowserStorage.localStorage = window.frames[1].frames[0].localStorage;
153 gBrowserStorage.sessionStorage = window.frames[1].frames[0].sessionStorage;
154
155 setupStorage(gAppStorage.localStorage);
156 setupStorage(gAppStorage.sessionStorage);
157 setupStorage(gBrowserStorage.localStorage);
158 setupStorage(gBrowserStorage.sessionStorage);
159
160 frames[1].postMessage("clear", "*");
161
162 waitForClearBrowserData();
163 };
164
165 function waitForClearBrowserData() {
166 SimpleTest.executeSoon(function() {
167 if (frames[1].document.getElementsByTagName('done').length == 0) {
168 waitForClearBrowserData();
169 } else {
170 checks();
171 }
172 });
173 }
174 function checks() {
175 navigator.mozApps.mgmt.getAll().onsuccess = function() {
176 for (i in this.result) {
177 var app = this.result[i];
178 if (app.manifestURL == gManifestURL) {
179 is(gBrowserStorage.localStorage.getItem("foo"), null, "localstorage data have been deleted");
180 is(gBrowserStorage.sessionStorage.getItem("foo"), "bar", "sessionstorage data have not been deleted");
181
182 is(gAppStorage.localStorage.getItem("foo"), "bar", "data are still there");
183 is(gAppStorage.sessionStorage.getItem("foo"), "bar", "data are still there");
184
185 is(gWitnessStorage.localStorage.getItem("foo"), "bar", "data are still there");
186 is(gWitnessStorage.sessionStorage.getItem("foo"), "bar", "data are still there");
187
188 // Now we uninstall the app and make sure everything is clean.
189 navigator.mozApps.mgmt.uninstall(app).onsuccess = function() {
190 SimpleTest.finish();
191 };
192 }
193 }
194 };
195 }
196
197 addLoadEvent(() =>
198 SpecialPowers.pushPrefEnv({set: [['dom.mozBrowserFramesEnabled', true]]}, () =>
199 SpecialPowers.autoConfirmAppInstall(runTest)
200 )
201 );
202
203 </script>
204 </pre>
205 </body>
206 </html>

mercurial