summaryrefslogtreecommitdiffstats
path: root/browser/components/places/tests/unit/test_clearHistory_shutdown.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/places/tests/unit/test_clearHistory_shutdown.js')
-rw-r--r--browser/components/places/tests/unit/test_clearHistory_shutdown.js181
1 files changed, 181 insertions, 0 deletions
diff --git a/browser/components/places/tests/unit/test_clearHistory_shutdown.js b/browser/components/places/tests/unit/test_clearHistory_shutdown.js
new file mode 100644
index 000000000..0c1d78801
--- /dev/null
+++ b/browser/components/places/tests/unit/test_clearHistory_shutdown.js
@@ -0,0 +1,181 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim:set ts=2 sw=2 sts=2 et: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/**
+ * Tests that requesting clear history at shutdown will really clear history.
+ */
+
+const URIS = [
+ "http://a.example1.com/"
+, "http://b.example1.com/"
+, "http://b.example2.com/"
+, "http://c.example3.com/"
+];
+
+const TOPIC_CONNECTION_CLOSED = "places-connection-closed";
+
+var EXPECTED_NOTIFICATIONS = [
+ "places-shutdown"
+, "places-will-close-connection"
+, "places-expiration-finished"
+, "places-connection-closed"
+];
+
+const UNEXPECTED_NOTIFICATIONS = [
+ "xpcom-shutdown"
+];
+
+const FTP_URL = "ftp://localhost/clearHistoryOnShutdown/";
+
+// Send the profile-after-change notification to the form history component to ensure
+// that it has been initialized.
+var formHistoryStartup = Cc["@mozilla.org/satchel/form-history-startup;1"].
+ getService(Ci.nsIObserver);
+formHistoryStartup.observe(null, "profile-after-change", null);
+XPCOMUtils.defineLazyModuleGetter(this, "FormHistory",
+ "resource://gre/modules/FormHistory.jsm");
+
+var timeInMicroseconds = Date.now() * 1000;
+
+function run_test() {
+ run_next_test();
+}
+
+add_task(function* test_execute() {
+ do_print("Initialize browserglue before Places");
+
+ // Avoid default bookmarks import.
+ let glue = Cc["@mozilla.org/browser/browserglue;1"].
+ getService(Ci.nsIObserver);
+ glue.observe(null, "initial-migration-will-import-default-bookmarks", null);
+ glue.observe(null, "test-initialize-sanitizer", null);
+
+
+ Services.prefs.setBoolPref("privacy.clearOnShutdown.cache", true);
+ Services.prefs.setBoolPref("privacy.clearOnShutdown.cookies", true);
+ Services.prefs.setBoolPref("privacy.clearOnShutdown.offlineApps", true);
+ Services.prefs.setBoolPref("privacy.clearOnShutdown.history", true);
+ Services.prefs.setBoolPref("privacy.clearOnShutdown.downloads", true);
+ Services.prefs.setBoolPref("privacy.clearOnShutdown.cookies", true);
+ Services.prefs.setBoolPref("privacy.clearOnShutdown.formData", true);
+ Services.prefs.setBoolPref("privacy.clearOnShutdown.sessions", true);
+ Services.prefs.setBoolPref("privacy.clearOnShutdown.siteSettings", true);
+
+ Services.prefs.setBoolPref("privacy.sanitize.sanitizeOnShutdown", true);
+
+ do_print("Add visits.");
+ for (let aUrl of URIS) {
+ yield PlacesTestUtils.addVisits({
+ uri: uri(aUrl), visitDate: timeInMicroseconds++,
+ transition: PlacesUtils.history.TRANSITION_TYPED
+ });
+ }
+ do_print("Add cache.");
+ yield storeCache(FTP_URL, "testData");
+ do_print("Add form history.");
+ yield addFormHistory();
+ Assert.equal((yield getFormHistoryCount()), 1, "Added form history");
+
+ do_print("Simulate and wait shutdown.");
+ yield shutdownPlaces();
+
+ Assert.equal((yield getFormHistoryCount()), 0, "Form history cleared");
+
+ let stmt = DBConn(true).createStatement(
+ "SELECT id FROM moz_places WHERE url = :page_url "
+ );
+
+ try {
+ URIS.forEach(function(aUrl) {
+ stmt.params.page_url = aUrl;
+ do_check_false(stmt.executeStep());
+ stmt.reset();
+ });
+ } finally {
+ stmt.finalize();
+ }
+
+ do_print("Check cache");
+ // Check cache.
+ yield checkCache(FTP_URL);
+});
+
+function addFormHistory() {
+ return new Promise(resolve => {
+ let now = Date.now() * 1000;
+ FormHistory.update({ op: "add",
+ fieldname: "testfield",
+ value: "test",
+ timesUsed: 1,
+ firstUsed: now,
+ lastUsed: now
+ },
+ { handleCompletion(reason) { resolve(); } });
+ });
+}
+
+function getFormHistoryCount() {
+ return new Promise((resolve, reject) => {
+ let count = -1;
+ FormHistory.count({ fieldname: "testfield" },
+ { handleResult(result) { count = result; },
+ handleCompletion(reason) { resolve(count); }
+ });
+ });
+}
+
+function storeCache(aURL, aContent) {
+ let cache = Services.cache2;
+ let storage = cache.diskCacheStorage(LoadContextInfo.default, false);
+
+ return new Promise(resolve => {
+ let storeCacheListener = {
+ onCacheEntryCheck: function (entry, appcache) {
+ return Ci.nsICacheEntryOpenCallback.ENTRY_WANTED;
+ },
+
+ onCacheEntryAvailable: function (entry, isnew, appcache, status) {
+ do_check_eq(status, Cr.NS_OK);
+
+ entry.setMetaDataElement("servertype", "0");
+ var os = entry.openOutputStream(0);
+
+ var written = os.write(aContent, aContent.length);
+ if (written != aContent.length) {
+ do_throw("os.write has not written all data!\n" +
+ " Expected: " + written + "\n" +
+ " Actual: " + aContent.length + "\n");
+ }
+ os.close();
+ entry.close();
+ resolve();
+ }
+ };
+
+ storage.asyncOpenURI(Services.io.newURI(aURL, null, null), "",
+ Ci.nsICacheStorage.OPEN_NORMALLY,
+ storeCacheListener);
+ });
+}
+
+
+function checkCache(aURL) {
+ let cache = Services.cache2;
+ let storage = cache.diskCacheStorage(LoadContextInfo.default, false);
+
+ return new Promise(resolve => {
+ let checkCacheListener = {
+ onCacheEntryAvailable: function (entry, isnew, appcache, status) {
+ do_check_eq(status, Cr.NS_ERROR_CACHE_KEY_NOT_FOUND);
+ resolve();
+ }
+ };
+
+ storage.asyncOpenURI(Services.io.newURI(aURL, null, null), "",
+ Ci.nsICacheStorage.OPEN_READONLY,
+ checkCacheListener);
+ });
+}