|
|
|
|
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 |
}); |