michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: // names for cache devices michael@0: const kDiskDevice = "disk"; michael@0: const kMemoryDevice = "memory"; michael@0: const kOfflineDevice = "appcache"; michael@0: michael@0: const kCacheA = "http://cache/A"; michael@0: const kCacheA2 = "http://cache/A2"; michael@0: const kCacheB = "http://cache/B"; michael@0: const kCacheC = "http://cache/C"; michael@0: const kTestContent = "test content"; michael@0: michael@0: function make_input_stream_scriptable(input) { michael@0: var wrapper = Cc["@mozilla.org/scriptableinputstream;1"]. michael@0: createInstance(Ci.nsIScriptableInputStream); michael@0: wrapper.init(input); michael@0: return wrapper; michael@0: } michael@0: michael@0: const entries = [ michael@0: // key content device should exist after leaving PB michael@0: [kCacheA, kTestContent, kMemoryDevice, true], michael@0: [kCacheA2, kTestContent, kDiskDevice, false], michael@0: [kCacheB, kTestContent, kDiskDevice, true], michael@0: [kCacheC, kTestContent, kOfflineDevice, true] michael@0: ] michael@0: michael@0: var store_idx; michael@0: var store_cb = null; michael@0: var appCache = null; michael@0: michael@0: function store_entries(cb) michael@0: { michael@0: if (cb) { michael@0: store_cb = cb; michael@0: store_idx = 0; michael@0: } michael@0: michael@0: if (store_idx == entries.length) { michael@0: do_execute_soon(store_cb); michael@0: return; michael@0: } michael@0: michael@0: asyncOpenCacheEntry(entries[store_idx][0], michael@0: entries[store_idx][2], michael@0: Ci.nsICacheStorage.OPEN_TRUNCATE, michael@0: LoadContextInfo.custom(!entries[store_idx][3]), michael@0: store_data, michael@0: appCache); michael@0: } michael@0: michael@0: var store_data = function(status, entry) { michael@0: do_check_eq(status, Cr.NS_OK); michael@0: var os = entry.openOutputStream(0); michael@0: michael@0: var written = os.write(entries[store_idx][1], entries[store_idx][1].length); michael@0: if (written != entries[store_idx][1].length) { michael@0: do_throw("os.write has not written all data!\n" + michael@0: " Expected: " + entries[store_idx][1].length + "\n" + michael@0: " Actual: " + written + "\n"); michael@0: } michael@0: os.close(); michael@0: entry.close(); michael@0: store_idx++; michael@0: do_execute_soon(store_entries); michael@0: }; michael@0: michael@0: var check_idx; michael@0: var check_cb = null; michael@0: var check_pb_exited; michael@0: function check_entries(cb, pbExited) michael@0: { michael@0: if (cb) { michael@0: check_cb = cb; michael@0: check_idx = 0; michael@0: check_pb_exited = pbExited; michael@0: } michael@0: michael@0: if (check_idx == entries.length) { michael@0: do_execute_soon(check_cb); michael@0: return; michael@0: } michael@0: michael@0: asyncOpenCacheEntry(entries[check_idx][0], michael@0: entries[check_idx][2], michael@0: Ci.nsICacheStorage.OPEN_READONLY, michael@0: LoadContextInfo.custom(!entries[check_idx][3]), michael@0: check_data, michael@0: appCache); michael@0: } michael@0: michael@0: var check_data = function (status, entry) { michael@0: var cont = function() { michael@0: check_idx++; michael@0: do_execute_soon(check_entries); michael@0: } michael@0: michael@0: if (!check_pb_exited || entries[check_idx][3]) { michael@0: do_check_eq(status, Cr.NS_OK); michael@0: var is = entry.openInputStream(0); michael@0: pumpReadStream(is, function(read) { michael@0: entry.close(); michael@0: do_check_eq(read, entries[check_idx][1]); michael@0: cont(); michael@0: }); michael@0: } else { michael@0: do_check_eq(status, Cr.NS_ERROR_CACHE_KEY_NOT_FOUND); michael@0: cont(); michael@0: } michael@0: }; michael@0: michael@0: function run_test() { michael@0: // Simulate a profile dir for xpcshell michael@0: do_get_profile(); michael@0: michael@0: appCache = Cc["@mozilla.org/network/application-cache-service;1"]. michael@0: getService(Ci.nsIApplicationCacheService). michael@0: getApplicationCache("fake-client-id|fake-group-id"); michael@0: michael@0: // Start off with an empty cache michael@0: evict_cache_entries(); michael@0: michael@0: // Store cache-A, cache-A2, cache-B and cache-C michael@0: store_entries(run_test2); michael@0: michael@0: do_test_pending(); michael@0: } michael@0: michael@0: function run_test2() { michael@0: // Check if cache-A, cache-A2, cache-B and cache-C are available michael@0: check_entries(run_test3, false); michael@0: } michael@0: michael@0: function run_test3() { michael@0: // Simulate all private browsing instances being closed michael@0: var obsvc = Cc["@mozilla.org/observer-service;1"]. michael@0: getService(Ci.nsIObserverService); michael@0: obsvc.notifyObservers(null, "last-pb-context-exited", null); michael@0: michael@0: // Make sure the memory device is not empty michael@0: get_device_entry_count(kMemoryDevice, null, function(count) { michael@0: do_check_eq(count, 1); michael@0: // Check if cache-A is gone, and cache-B and cache-C are still available michael@0: check_entries(do_test_finished, true); michael@0: }); michael@0: }