Attachment #8935039: part 8 - tests for bug #1252998

View | Details | Raw Unified | Return to bug 1252998
Collapse All | Expand All

(-)a/browser/base/content/test/sanitize/browser.ini (+3 lines)
Line     Link Here 
 Lines 1-10    Link Here 
1
[DEFAULT]
1
[DEFAULT]
2
support-files =
2
support-files =
3
  dummy_page.html
3
  dummy_page.html
4
  dummy.js
4
  head.js
5
  head.js
6
  sanitize.html
5
7
6
[browser_purgehistory_clears_sh.js]
8
[browser_purgehistory_clears_sh.js]
9
[browser_sanitize-offlineData.js]
7
[browser_sanitize-passwordDisabledHosts.js]
10
[browser_sanitize-passwordDisabledHosts.js]
8
[browser_sanitize-sitepermissions.js]
11
[browser_sanitize-sitepermissions.js]
9
[browser_sanitize-timespans.js]
12
[browser_sanitize-timespans.js]
10
[browser_sanitizeDialog.js]
13
[browser_sanitizeDialog.js]
(-)a/browser/base/content/test/sanitize/browser_sanitize-offlineData.js (+195 lines)
Line     Link Here 
Line 0    Link Here 
1
// Bug 380852 - Delete permission manager entries in Clear Recent History
2
3
const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
4
5
let tempScope = {};
6
Cc["@mozilla.org/moz/jssubscript-loader;1"].getService(Ci.mozIJSSubScriptLoader)
7
                                           .loadSubScript("chrome://browser/content/sanitize.js", tempScope);
8
let Sanitizer = tempScope.Sanitizer;
9
10
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
11
12
XPCOMUtils.defineLazyServiceGetter(this, "sas",
13
                                   "@mozilla.org/storage/activity-service;1",
14
                                   "nsIStorageActivityService");
15
XPCOMUtils.defineLazyServiceGetter(this, "swm",
16
                                   "@mozilla.org/serviceworkers/manager;1",
17
                                   "nsIServiceWorkerManager");
18
XPCOMUtils.defineLazyServiceGetter(this, "quotaManagerService",
19
                                   "@mozilla.org/dom/quota-manager-service;1",
20
                                   "nsIQuotaManagerService");
21
22
const oneHour = 3600000000;
23
const fiveHours = oneHour * 5;
24
25
26
function waitForUnregister(host) {
27
  return new Promise(resolve => {
28
    let listener = {
29
      onUnregister: registration => {
30
        if (registration.principal.URI.host != host) {
31
          return;
32
        }
33
        swm.removeListener(listener);
34
        resolve(registration);
35
      }
36
    };
37
    swm.addListener(listener);
38
  });
39
}
40
41
async function createData(host) {
42
  let pageURL = getRootDirectory(gTestPath).replace("chrome://mochitests/content", "http://" + host) + "sanitize.html";
43
44
  return BrowserTestUtils.withNewTab(pageURL, async function(browser) {
45
    await ContentTask.spawn(browser, null, () => {
46
      return new content.window.Promise(resolve => {
47
        let id = content.window.setInterval(() => {
48
          if ("foobar" in content.window.localStorage) {
49
            content.window.clearInterval(id);
50
            resolve(true);
51
          }
52
        }, 1000);
53
      });
54
    });
55
  });
56
}
57
58
function moveOriginInTime(principals, endDate, host) {
59
  for (let i = 0; i < principals.length; ++i) {
60
    let principal = principals.queryElementAt(i, Components.interfaces.nsIPrincipal);
61
    if (principal.URI.host == host) {
62
      sas.moveOriginInTime(principal, endDate - fiveHours);
63
      return true;
64
    }
65
  }
66
  return false;
67
}
68
69
async function getData(host) {
70
  let dummyURL = getRootDirectory(gTestPath).replace("chrome://mochitests/content", "http://" + host) + "dummy_page.html";
71
72
  // LocalStorage + IndexedDB
73
  let data = await BrowserTestUtils.withNewTab(dummyURL, async function(browser) {
74
    return ContentTask.spawn(browser, null, () => {
75
      return new content.window.Promise(resolve => {
76
        let obj = {
77
          localStorage: "foobar" in content.window.localStorage,
78
          indexedDB: true,
79
          serviceWorker: false,
80
        };
81
82
        let request = content.window.indexedDB.open("sanitizer_test", 1);
83
        request.onupgradeneeded = event => {
84
          obj.indexedDB = false;
85
        };
86
        request.onsuccess = event => {
87
          resolve(obj);
88
        };
89
      });
90
    });
91
  });
92
93
  // ServiceWorkers
94
  let serviceWorkers = swm.getAllRegistrations();
95
  for (let i = 0; i < serviceWorkers.length; i++) {
96
    let sw = serviceWorkers.queryElementAt(i, Ci.nsIServiceWorkerRegistrationInfo);
97
    if (sw.principal.URI.host == host) {
98
      data.serviceWorker = true;
99
      break;
100
    }
101
  }
102
103
  return data;
104
}
105
106
add_task(async function testWithRange() {
107
  await SpecialPowers.pushPrefEnv({"set": [
108
    ["dom.serviceWorkers.enabled", true],
109
    ["dom.serviceWorkers.exemptFromPerDomainMax", true],
110
    ["dom.serviceWorkers.testing.enabled", true]
111
  ]});
112
113
  let s = new Sanitizer();
114
  s.ignoreTimespan = false;
115
  s.prefDomain = "privacy.cpd.";
116
117
  await SpecialPowers.pushPrefEnv({"set": [
118
    [s.prefDomain + "history", false],
119
    [s.prefDomain + "downloads", false],
120
    [s.prefDomain + "cache", false],
121
    [s.prefDomain + "cookies", false],
122
    [s.prefDomain + "formdata", false],
123
    [s.prefDomain + "offlineApps", true],
124
    [s.prefDomain + "passwords", false],
125
    [s.prefDomain + "sessions", false],
126
    [s.prefDomain + "siteSettings", false],
127
  ]});
128
129
  s.sanitize();
130
131
  await createData("example.org");
132
  await createData("example.com");
133
134
  let endDate = Date.now() * 1000;
135
  let principals = sas.getActiveOrigins(endDate - oneHour, endDate);
136
  ok(!!principals, "We have an active origin.");
137
  ok(principals.length >= 2, "We have an active origin.");
138
139
  let found = 0;
140
  for (let i = 0; i < principals.length; ++i) {
141
    let principal = principals.queryElementAt(i, Components.interfaces.nsIPrincipal);
142
    if (principal.URI.host == "example.org" ||
143
        principal.URI.host == "example.com") {
144
      found++;
145
    }
146
  }
147
148
  is(found, 2, "Our origins are active.");
149
150
  let dataPre = await getData("example.org");
151
  ok(dataPre.localStorage, "We have localStorage data");
152
  ok(dataPre.indexedDB, "We have indexedDB data");
153
  ok(dataPre.serviceWorker, "We have serviceWorker data");
154
155
  dataPre = await getData("example.com");
156
  ok(dataPre.localStorage, "We have localStorage data");
157
  ok(dataPre.indexedDB, "We have indexedDB data");
158
  ok(dataPre.serviceWorker, "We have serviceWorker data");
159
160
  // Let's move example.com in the past.
161
  ok(moveOriginInTime(principals, endDate, "example.com"), "Operation completed!");
162
163
  let p = waitForUnregister("example.org");
164
165
  // Clear it
166
  await s.sanitize();
167
  await p;
168
169
  let dataPost = await getData("example.org");
170
  ok(!dataPost.localStorage, "We don't have localStorage data");
171
  ok(!dataPost.indexedDB, "We don't have indexedDB data");
172
  ok(!dataPost.serviceWorker, "We don't have serviceWorker data");
173
174
  dataPost = await getData("example.com");
175
  ok(dataPost.localStorage, "We still have localStorage data");
176
  ok(dataPost.indexedDB, "We still have indexedDB data");
177
  ok(dataPost.serviceWorker, "We still have serviceWorker data");
178
179
  // We have to move example.com in the past because how we check IDB triggers
180
  // a storage activity.
181
  ok(moveOriginInTime(principals, endDate, "example.com"), "Operation completed!");
182
183
  // Let's call the clean up again.
184
  await s.sanitize();
185
186
  dataPost = await getData("example.com");
187
  ok(dataPost.localStorage, "We still have localStorage data");
188
  ok(dataPost.indexedDB, "We still have indexedDB data");
189
  ok(dataPost.serviceWorker, "We still have serviceWorker data");
190
191
  dataPost = await getData("example.org");
192
  ok(!dataPost.localStorage, "We don't have localStorage data");
193
  ok(!dataPost.indexedDB, "We don't have indexedDB data");
194
  ok(!dataPost.serviceWorker, "We don't have serviceWorker data");
195
});
(-)a/browser/base/content/test/sanitize/sanitize.html (+41 lines)
Line     Link Here 
Line 0    Link Here 
1
<html>
2
<head>
3
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8"></meta>
4
</head>
5
<body>
6
  <script>
7
8
// indexedDB
9
let p = new Promise(resolve => {
10
  let request = indexedDB.open("sanitizer_test", 1);
11
  request.onupgradeneeded = event => {
12
    let db = event.target.result;
13
    event.target.onsuccess = resolve;
14
    db.createObjectStore("foo", { autoIncrement: true });
15
    db.createObjectStore("bar", { autoIncrement: true });
16
  };
17
});
18
19
// ServiceWorker
20
p.then(() => {
21
  return navigator.serviceWorker.register("dummy.js")
22
                .then(r => {
23
    return new Promise(resolve => {
24
      let worker = r.installing;
25
      worker.addEventListener("statechange", () => {
26
        if (worker.state === "installed") {
27
          resolve(true);
28
        }
29
      });
30
    });
31
  });
32
})
33
34
// localStorage
35
.then(() => {
36
  localStorage.foobar = "hello world!";
37
});
38
39
  </script>
40
</body>
41
</html>

Return to bug 1252998