Attachment #8967661: part 7 - 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-11    Link Here 
1
[DEFAULT]
1
[DEFAULT]
2
support-files=
2
support-files=
3
  head.js
3
  head.js
4
  dummy.js
4
  dummy_page.html
5
  dummy_page.html
6
  sanitize.html
5
7
6
[browser_purgehistory_clears_sh.js]
8
[browser_purgehistory_clears_sh.js]
7
[browser_sanitize-formhistory.js]
9
[browser_sanitize-formhistory.js]
10
[browser_sanitize-offlineData.js]
8
[browser_sanitize-passwordDisabledHosts.js]
11
[browser_sanitize-passwordDisabledHosts.js]
9
[browser_sanitize-sitepermissions.js]
12
[browser_sanitize-sitepermissions.js]
10
[browser_sanitize-timespans.js]
13
[browser_sanitize-timespans.js]
11
[browser_sanitizeDialog.js]
14
[browser_sanitizeDialog.js]
(-)a/browser/base/content/test/sanitize/browser_sanitize-offlineData.js (+189 lines)
Line     Link Here 
Line 0    Link Here 
1
// Bug 380852 - Delete permission manager entries in Clear Recent History
2
3
ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
4
const {Sanitizer} = ChromeUtils.import("resource:///modules/Sanitizer.jsm", {});
5
6
XPCOMUtils.defineLazyServiceGetter(this, "sas",
7
                                   "@mozilla.org/storage/activity-service;1",
8
                                   "nsIStorageActivityService");
9
XPCOMUtils.defineLazyServiceGetter(this, "swm",
10
                                   "@mozilla.org/serviceworkers/manager;1",
11
                                   "nsIServiceWorkerManager");
12
XPCOMUtils.defineLazyServiceGetter(this, "quotaManagerService",
13
                                   "@mozilla.org/dom/quota-manager-service;1",
14
                                   "nsIQuotaManagerService");
15
16
const oneHour = 3600000000;
17
const fiveHours = oneHour * 5;
18
19
const itemsToClear = [ "cookies", "offlineApps" ];
20
21
function waitForUnregister(host) {
22
  return new Promise(resolve => {
23
    let listener = {
24
      onUnregister: registration => {
25
        if (registration.principal.URI.host != host) {
26
          return;
27
        }
28
        let swm = Cc["@mozilla.org/serviceworkers/manager;1"]
29
                    .getService(Ci.nsIServiceWorkerManager);
30
        swm.removeListener(listener);
31
        resolve(registration);
32
      }
33
    };
34
    swm.addListener(listener);
35
  });
36
}
37
38
async function createData(host) {
39
  let pageURL = getRootDirectory(gTestPath).replace("chrome://mochitests/content", "http://" + host) + "sanitize.html";
40
41
  return BrowserTestUtils.withNewTab(pageURL, async function(browser) {
42
    await ContentTask.spawn(browser, null, () => {
43
      return new content.window.Promise(resolve => {
44
        let id = content.window.setInterval(() => {
45
          if ("foobar" in content.window.localStorage) {
46
            content.window.clearInterval(id);
47
            resolve(true);
48
          }
49
        }, 1000);
50
      });
51
    });
52
  });
53
}
54
55
function moveOriginInTime(principals, endDate, host) {
56
  for (let i = 0; i < principals.length; ++i) {
57
    let principal = principals.queryElementAt(i, Ci.nsIPrincipal);
58
    if (principal.URI.host == host) {
59
      sas.moveOriginInTime(principal, endDate - fiveHours);
60
      return true;
61
    }
62
  }
63
  return false;
64
}
65
66
async function getData(host) {
67
  let dummyURL = getRootDirectory(gTestPath).replace("chrome://mochitests/content", "http://" + host) + "dummy_page.html";
68
69
  // LocalStorage + IndexedDB
70
  let data = await BrowserTestUtils.withNewTab(dummyURL, async function(browser) {
71
    return ContentTask.spawn(browser, null, () => {
72
      return new content.window.Promise(resolve => {
73
        let obj = {
74
          localStorage: "foobar" in content.window.localStorage,
75
          indexedDB: true,
76
          serviceWorker: false,
77
        };
78
79
        let request = content.window.indexedDB.open("sanitizer_test", 1);
80
        request.onupgradeneeded = event => {
81
          obj.indexedDB = false;
82
        };
83
        request.onsuccess = event => {
84
          resolve(obj);
85
        };
86
      });
87
    });
88
  });
89
90
  // ServiceWorkers
91
  let serviceWorkers = swm.getAllRegistrations();
92
  for (let i = 0; i < serviceWorkers.length; i++) {
93
    let sw = serviceWorkers.queryElementAt(i, Ci.nsIServiceWorkerRegistrationInfo);
94
    if (sw.principal.URI.host == host) {
95
      data.serviceWorker = true;
96
      break;
97
    }
98
  }
99
100
  return data;
101
}
102
103
add_task(async function testWithRange() {
104
  await SpecialPowers.pushPrefEnv({"set": [
105
    ["dom.serviceWorkers.enabled", true],
106
    ["dom.serviceWorkers.exemptFromPerDomainMax", true],
107
    ["dom.serviceWorkers.testing.enabled", true]
108
  ]});
109
110
  // The service may have picked up activity from prior tests in this run.
111
  // Clear it.
112
  sas.testOnlyReset();
113
114
  let endDate = Date.now() * 1000;
115
  let principals = sas.getActiveOrigins(endDate - oneHour, endDate);
116
  is(principals.length, 0, "starting from clear activity state");
117
118
  info("sanitize: " + itemsToClear.join(", "));
119
  await Sanitizer.sanitize(itemsToClear, {ignoreTimespan: false});
120
121
  await createData("example.org");
122
  await createData("example.com");
123
124
  endDate = Date.now() * 1000;
125
  principals = sas.getActiveOrigins(endDate - oneHour, endDate);
126
  ok(!!principals, "We have an active origin.");
127
  ok(principals.length >= 2, "We have an active origin.");
128
129
  let found = 0;
130
  for (let i = 0; i < principals.length; ++i) {
131
    let principal = principals.queryElementAt(i, Ci.nsIPrincipal);
132
    if (principal.URI.host == "example.org" ||
133
        principal.URI.host == "example.com") {
134
      found++;
135
    }
136
  }
137
138
  is(found, 2, "Our origins are active.");
139
140
  let dataPre = await getData("example.org");
141
  ok(dataPre.localStorage, "We have localStorage data");
142
  ok(dataPre.indexedDB, "We have indexedDB data");
143
  ok(dataPre.serviceWorker, "We have serviceWorker data");
144
145
  dataPre = await getData("example.com");
146
  ok(dataPre.localStorage, "We have localStorage data");
147
  ok(dataPre.indexedDB, "We have indexedDB data");
148
  ok(dataPre.serviceWorker, "We have serviceWorker data");
149
150
  // Let's move example.com in the past.
151
  ok(moveOriginInTime(principals, endDate, "example.com"), "Operation completed!");
152
153
  let p = waitForUnregister("example.org");
154
155
  // Clear it
156
  info("sanitize: " + itemsToClear.join(", "));
157
  await Sanitizer.sanitize(itemsToClear, {ignoreTimespan: false});
158
  await p;
159
160
  let dataPost = await getData("example.org");
161
  ok(!dataPost.localStorage, "We don't have localStorage data");
162
  ok(!dataPost.indexedDB, "We don't have indexedDB data");
163
  ok(!dataPost.serviceWorker, "We don't have serviceWorker data");
164
165
  dataPost = await getData("example.com");
166
  ok(dataPost.localStorage, "We still have localStorage data");
167
  ok(dataPost.indexedDB, "We still have indexedDB data");
168
  ok(dataPost.serviceWorker, "We still have serviceWorker data");
169
170
  // We have to move example.com in the past because how we check IDB triggers
171
  // a storage activity.
172
  ok(moveOriginInTime(principals, endDate, "example.com"), "Operation completed!");
173
174
  // Let's call the clean up again.
175
  info("sanitize again to ensure clearing doesn't expand the activity scope");
176
  await Sanitizer.sanitize(itemsToClear, {ignoreTimespan: false});
177
178
  dataPost = await getData("example.com");
179
  ok(dataPost.localStorage, "We still have localStorage data");
180
  ok(dataPost.indexedDB, "We still have indexedDB data");
181
  ok(dataPost.serviceWorker, "We still have serviceWorker data");
182
183
  dataPost = await getData("example.org");
184
  ok(!dataPost.localStorage, "We don't have localStorage data");
185
  ok(!dataPost.indexedDB, "We don't have indexedDB data");
186
  ok(!dataPost.serviceWorker, "We don't have serviceWorker data");
187
188
  sas.testOnlyReset();
189
});
(-)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>
(-)a/dom/interfaces/storage/nsIStorageActivityService.idl (+3 lines)
Line     Link Here 
 Lines 27-39   interface nsIStorageActivityService : ns Link Here 
27
  // Firefox was started.  All codebase principals are logged, which includes
27
  // Firefox was started.  All codebase principals are logged, which includes
28
  // non-system principals like "moz-extension://ID", "moz-safe-about:home",
28
  // non-system principals like "moz-extension://ID", "moz-safe-about:home",
29
  // "about:newtab", so principals may need to be filtered before being used.
29
  // "about:newtab", so principals may need to be filtered before being used.
30
  nsIArray getActiveOrigins(in PRTime from, in PRTime to);
30
  nsIArray getActiveOrigins(in PRTime from, in PRTime to);
31
31
32
  // NOTE: This method is meant to be used for testing only.
32
  // NOTE: This method is meant to be used for testing only.
33
  // The activity of |origin| is moved to the specified timestamp |when|.
33
  // The activity of |origin| is moved to the specified timestamp |when|.
34
  void moveOriginInTime(in nsIPrincipal origin, in PRTime when);
34
  void moveOriginInTime(in nsIPrincipal origin, in PRTime when);
35
36
  // TEST-ONLY method to support clearing all previously known activity.
37
  void testOnlyReset();
35
};
38
};
36
39
37
%{ C++
40
%{ C++
38
#define STORAGE_ACTIVITY_SERVICE_CONTRACTID "@mozilla.org/storage/activity-service;1"
41
#define STORAGE_ACTIVITY_SERVICE_CONTRACTID "@mozilla.org/storage/activity-service;1"
39
%}
42
%}
(-)a/dom/storage/StorageActivityService.cpp (+7 lines)
Line     Link Here 
 Lines 291-306   StorageActivityService::MoveOriginInTime Link Here 
291
  if (NS_WARN_IF(NS_FAILED(rv))) {
291
  if (NS_WARN_IF(NS_FAILED(rv))) {
292
    return rv;
292
    return rv;
293
  }
293
  }
294
294
295
  mActivities.Put(origin, aWhen / PR_USEC_PER_SEC);
295
  mActivities.Put(origin, aWhen / PR_USEC_PER_SEC);
296
  return NS_OK;
296
  return NS_OK;
297
}
297
}
298
298
299
NS_IMETHODIMP
300
StorageActivityService::TestOnlyReset()
301
{
302
  mActivities.Clear();
303
  return NS_OK;
304
}
305
299
NS_INTERFACE_MAP_BEGIN(StorageActivityService)
306
NS_INTERFACE_MAP_BEGIN(StorageActivityService)
300
  NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIStorageActivityService)
307
  NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIStorageActivityService)
301
  NS_INTERFACE_MAP_ENTRY(nsIStorageActivityService)
308
  NS_INTERFACE_MAP_ENTRY(nsIStorageActivityService)
302
  NS_INTERFACE_MAP_ENTRY(nsIObserver)
309
  NS_INTERFACE_MAP_ENTRY(nsIObserver)
303
  NS_INTERFACE_MAP_ENTRY(nsITimerCallback)
310
  NS_INTERFACE_MAP_ENTRY(nsITimerCallback)
304
  NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
311
  NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
305
NS_INTERFACE_MAP_END
312
NS_INTERFACE_MAP_END
306
313

Return to bug 1252998