330 lines
8.9 KiB
JavaScript
330 lines
8.9 KiB
JavaScript
/**
|
|
* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/
|
|
*/
|
|
|
|
add_task(async function testSteps() {
|
|
const url = "http://example.com";
|
|
|
|
info("Setting pref");
|
|
|
|
Services.prefs.setBoolPref("dom.storage.snapshot_reusing", false);
|
|
|
|
const items = [
|
|
{ key: "key01", value: "value01" },
|
|
{ key: "key02", value: "value02" },
|
|
{ key: "key03", value: "value03" },
|
|
{ key: "key04", value: "value04" },
|
|
{ key: "key05", value: "value05" },
|
|
{ key: "key06", value: "value06" },
|
|
{ key: "key07", value: "value07" },
|
|
{ key: "key08", value: "value08" },
|
|
{ key: "key09", value: "value09" },
|
|
{ key: "key10", value: "value10" },
|
|
];
|
|
|
|
let sizeOfOneKey;
|
|
let sizeOfOneValue;
|
|
let sizeOfOneItem;
|
|
let sizeOfKeys = 0;
|
|
let sizeOfItems = 0;
|
|
|
|
for (let i = 0; i < items.length; i++) {
|
|
let item = items[i];
|
|
let sizeOfKey = item.key.length;
|
|
let sizeOfValue = item.value.length;
|
|
let sizeOfItem = sizeOfKey + sizeOfValue;
|
|
if (i == 0) {
|
|
sizeOfOneKey = sizeOfKey;
|
|
sizeOfOneValue = sizeOfValue;
|
|
sizeOfOneItem = sizeOfItem;
|
|
}
|
|
sizeOfKeys += sizeOfKey;
|
|
sizeOfItems += sizeOfItem;
|
|
}
|
|
|
|
info("Size of one key is " + sizeOfOneKey);
|
|
info("Size of one value is " + sizeOfOneValue);
|
|
info("Size of one item is " + sizeOfOneItem);
|
|
info("Size of keys is " + sizeOfKeys);
|
|
info("Size of items is " + sizeOfItems);
|
|
|
|
const prefillValues = [
|
|
// Zero prefill (prefill disabled)
|
|
0,
|
|
// Less than one key length prefill
|
|
sizeOfOneKey - 1,
|
|
// Greater than one key length and less than one item length prefill
|
|
sizeOfOneKey + 1,
|
|
// Precisely one item length prefill
|
|
sizeOfOneItem,
|
|
// Precisely two times one item length prefill
|
|
2 * sizeOfOneItem,
|
|
// Precisely three times one item length prefill
|
|
3 * sizeOfOneItem,
|
|
// Precisely four times one item length prefill
|
|
4 * sizeOfOneItem,
|
|
// Precisely size of keys prefill
|
|
sizeOfKeys,
|
|
// Less than size of keys plus one value length prefill
|
|
sizeOfKeys + sizeOfOneValue - 1,
|
|
// Precisely size of keys plus one value length prefill
|
|
sizeOfKeys + sizeOfOneValue,
|
|
// Greater than size of keys plus one value length and less than size of
|
|
// keys plus two times one value length prefill
|
|
sizeOfKeys + sizeOfOneValue + 1,
|
|
// Precisely size of keys plus two times one value length prefill
|
|
sizeOfKeys + 2 * sizeOfOneValue,
|
|
// Precisely size of keys plus three times one value length prefill
|
|
sizeOfKeys + 3 * sizeOfOneValue,
|
|
// Precisely size of keys plus four times one value length prefill
|
|
sizeOfKeys + 4 * sizeOfOneValue,
|
|
// Precisely size of keys plus five times one value length prefill
|
|
sizeOfKeys + 5 * sizeOfOneValue,
|
|
// Precisely size of keys plus six times one value length prefill
|
|
sizeOfKeys + 6 * sizeOfOneValue,
|
|
// Precisely size of keys plus seven times one value length prefill
|
|
sizeOfKeys + 7 * sizeOfOneValue,
|
|
// Precisely size of keys plus eight times one value length prefill
|
|
sizeOfKeys + 8 * sizeOfOneValue,
|
|
// Precisely size of keys plus nine times one value length prefill
|
|
sizeOfKeys + 9 * sizeOfOneValue,
|
|
// Precisely size of items prefill
|
|
sizeOfItems,
|
|
// Unlimited prefill
|
|
-1,
|
|
];
|
|
|
|
for (let prefillValue of prefillValues) {
|
|
info("Setting prefill value to " + prefillValue);
|
|
|
|
Services.prefs.setIntPref("dom.storage.snapshot_prefill", prefillValue);
|
|
|
|
const gradualPrefillValues = [
|
|
// Zero gradual prefill
|
|
0,
|
|
// Less than one key length gradual prefill
|
|
sizeOfOneKey - 1,
|
|
// Greater than one key length and less than one item length gradual
|
|
// prefill
|
|
sizeOfOneKey + 1,
|
|
// Precisely one item length gradual prefill
|
|
sizeOfOneItem,
|
|
// Precisely two times one item length gradual prefill
|
|
2 * sizeOfOneItem,
|
|
// Precisely three times one item length gradual prefill
|
|
3 * sizeOfOneItem,
|
|
// Precisely four times one item length gradual prefill
|
|
4 * sizeOfOneItem,
|
|
// Precisely five times one item length gradual prefill
|
|
5 * sizeOfOneItem,
|
|
// Precisely six times one item length gradual prefill
|
|
6 * sizeOfOneItem,
|
|
// Precisely seven times one item length gradual prefill
|
|
7 * sizeOfOneItem,
|
|
// Precisely eight times one item length gradual prefill
|
|
8 * sizeOfOneItem,
|
|
// Precisely nine times one item length gradual prefill
|
|
9 * sizeOfOneItem,
|
|
// Precisely size of items prefill
|
|
sizeOfItems,
|
|
// Unlimited gradual prefill
|
|
-1,
|
|
];
|
|
|
|
for (let gradualPrefillValue of gradualPrefillValues) {
|
|
info("Setting gradual prefill value to " + gradualPrefillValue);
|
|
|
|
Services.prefs.setIntPref(
|
|
"dom.storage.snapshot_gradual_prefill",
|
|
gradualPrefillValue
|
|
);
|
|
|
|
info("Getting storage");
|
|
|
|
let storage = getLocalStorage(getPrincipal(url));
|
|
|
|
// 1st snapshot
|
|
|
|
info("Adding data");
|
|
|
|
for (let item of items) {
|
|
storage.setItem(item.key, item.value);
|
|
}
|
|
|
|
info("Saving key order");
|
|
|
|
// This forces GetKeys to be called internally.
|
|
let savedKeys = Object.keys(storage);
|
|
|
|
// GetKey should match GetKeys
|
|
for (let i = 0; i < savedKeys.length; i++) {
|
|
is(storage.key(i), savedKeys[i], "Correct key");
|
|
}
|
|
|
|
info("Returning to event loop");
|
|
|
|
// Returning to event loop forces the internal snapshot to finish.
|
|
await returnToEventLoop();
|
|
|
|
// 2nd snapshot
|
|
|
|
info("Verifying length");
|
|
|
|
is(storage.length, items.length, "Correct length");
|
|
|
|
info("Verifying key order");
|
|
|
|
let keys = Object.keys(storage);
|
|
|
|
is(keys.length, savedKeys.length);
|
|
|
|
for (let i = 0; i < keys.length; i++) {
|
|
is(keys[i], savedKeys[i], "Correct key");
|
|
}
|
|
|
|
info("Verifying values");
|
|
|
|
for (let item of items) {
|
|
is(storage.getItem(item.key), item.value, "Correct value");
|
|
}
|
|
|
|
info("Returning to event loop");
|
|
|
|
await returnToEventLoop();
|
|
|
|
// 3rd snapshot
|
|
|
|
// Force key2 to load.
|
|
storage.getItem("key02");
|
|
|
|
// Fill out write infos a bit.
|
|
storage.removeItem("key05");
|
|
storage.setItem("key05", "value05");
|
|
storage.removeItem("key05");
|
|
storage.setItem("key11", "value11");
|
|
storage.setItem("key05", "value05");
|
|
|
|
items.push({ key: "key11", value: "value11" });
|
|
|
|
info("Verifying length");
|
|
|
|
is(storage.length, items.length, "Correct length");
|
|
|
|
// This forces to get all keys from the parent and then apply write infos
|
|
// on already cached values.
|
|
savedKeys = Object.keys(storage);
|
|
|
|
info("Verifying values");
|
|
|
|
for (let item of items) {
|
|
is(storage.getItem(item.key), item.value, "Correct value");
|
|
}
|
|
|
|
storage.removeItem("key11");
|
|
|
|
items.pop();
|
|
|
|
info("Returning to event loop");
|
|
|
|
await returnToEventLoop();
|
|
|
|
// 4th snapshot
|
|
|
|
// Force loading of all items.
|
|
info("Verifying length");
|
|
|
|
is(storage.length, items.length, "Correct length");
|
|
|
|
info("Verifying values");
|
|
|
|
for (let item of items) {
|
|
is(storage.getItem(item.key), item.value, "Correct value");
|
|
}
|
|
|
|
is(storage.getItem("key11"), null, "Correct value");
|
|
|
|
info("Returning to event loop");
|
|
|
|
await returnToEventLoop();
|
|
|
|
// 5th snapshot
|
|
|
|
// Force loading of all keys.
|
|
info("Saving key order");
|
|
|
|
savedKeys = Object.keys(storage);
|
|
|
|
// Force loading of all items.
|
|
info("Verifying length");
|
|
|
|
is(storage.length, items.length, "Correct length");
|
|
|
|
info("Verifying values");
|
|
|
|
for (let item of items) {
|
|
is(storage.getItem(item.key), item.value, "Correct value");
|
|
}
|
|
|
|
is(storage.getItem("key11"), null, "Correct value");
|
|
|
|
info("Returning to event loop");
|
|
|
|
await returnToEventLoop();
|
|
|
|
// 6th snapshot
|
|
info("Verifying unknown item");
|
|
|
|
is(storage.getItem("key11"), null, "Correct value");
|
|
|
|
info("Verifying unknown item again");
|
|
|
|
is(storage.getItem("key11"), null, "Correct value");
|
|
|
|
info("Returning to event loop");
|
|
|
|
await returnToEventLoop();
|
|
|
|
// 7th snapshot
|
|
|
|
// Save actual key order.
|
|
info("Saving key order");
|
|
|
|
savedKeys = Object.keys(storage);
|
|
|
|
await returnToEventLoop();
|
|
|
|
// 8th snapshot
|
|
|
|
// Force loading of all items, but in reverse order.
|
|
info("Getting values");
|
|
|
|
for (let i = items.length - 1; i >= 0; i--) {
|
|
let item = items[i];
|
|
storage.getItem(item.key);
|
|
}
|
|
|
|
info("Verifying key order");
|
|
|
|
keys = Object.keys(storage);
|
|
|
|
is(keys.length, savedKeys.length);
|
|
|
|
for (let i = 0; i < keys.length; i++) {
|
|
is(keys[i], savedKeys[i], "Correct key");
|
|
}
|
|
|
|
await returnToEventLoop();
|
|
|
|
// 9th snapshot
|
|
|
|
info("Clearing");
|
|
|
|
storage.clear();
|
|
|
|
info("Returning to event loop");
|
|
|
|
await returnToEventLoop();
|
|
}
|
|
}
|
|
});
|