Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* Any copyright is dedicated to the Public Domain.
// Ensure that storage updates are detected and that the correct information is
// contained inside the storage actors.
"use strict";
Services.scriptloader.loadSubScript(
this
);
const l10n = new Localization(["devtools/client/storage.ftl"], true);
const sessionString = l10n.formatValueSync("storage-expires-session");
const TESTS = [
// index 0
{
async action() {
await addCookie("c1", "foobar1");
await addCookie("c2", "foobar2");
await localStorageSetItem("l1", "foobar1");
},
snapshot: {
cookies: [
{
name: "c1",
value: "foobar1",
},
{
name: "c2",
value: "foobar2",
},
],
"local-storage": [
{
name: "l1",
value: "foobar1",
},
],
},
},
// index 1
{
async action() {
await addCookie("c1", "new_foobar1");
await localStorageSetItem("l2", "foobar2");
},
snapshot: {
cookies: [
{
name: "c1",
value: "new_foobar1",
},
{
name: "c2",
value: "foobar2",
},
],
"local-storage": [
{
name: "l1",
value: "foobar1",
},
{
name: "l2",
value: "foobar2",
},
],
},
},
// index 2
{
async action() {
await removeCookie("c2");
await localStorageRemoveItem("l1");
await localStorageSetItem("l3", "foobar3");
},
snapshot: {
cookies: [
{
name: "c1",
value: "new_foobar1",
},
],
"local-storage": [
{
name: "l2",
value: "foobar2",
},
{
name: "l3",
value: "foobar3",
},
],
},
},
// index 3
{
async action() {
await removeCookie("c1");
await addCookie("c3", "foobar3");
await localStorageRemoveItem("l2");
await sessionStorageSetItem("s1", "foobar1");
await sessionStorageSetItem("s2", "foobar2");
await localStorageSetItem("l3", "new_foobar3");
},
snapshot: {
cookies: [
{
name: "c3",
value: "foobar3",
},
],
"local-storage": [
{
name: "l3",
value: "new_foobar3",
},
],
"session-storage": [
{
name: "s1",
value: "foobar1",
},
{
name: "s2",
value: "foobar2",
},
],
},
},
// index 4
{
async action() {
await sessionStorageRemoveItem("s1");
},
snapshot: {
cookies: [
{
name: "c3",
value: "foobar3",
},
],
"local-storage": [
{
name: "l3",
value: "new_foobar3",
},
],
"session-storage": [
{
name: "s2",
value: "foobar2",
},
],
},
},
// index 5
{
async action() {
await clearCookies();
},
snapshot: {
cookies: [],
"local-storage": [
{
name: "l3",
value: "new_foobar3",
},
],
"session-storage": [
{
name: "s2",
value: "foobar2",
},
],
},
},
// index 6
{
async action() {
await clearLocalAndSessionStores();
},
snapshot: {
cookies: [],
"local-storage": [],
"session-storage": [],
},
},
];
add_task(async function () {
const { commands } = await openTabAndSetupStorage(
MAIN_DOMAIN + "storage-updates.html"
);
for (let i = 0; i < TESTS.length; i++) {
const test = TESTS[i];
await runTest(test, commands, i);
}
await commands.destroy();
});
async function runTest({ action, snapshot }, commands, index) {
info("Running test at index " + index);
await action();
await checkStores(commands, snapshot);
}
async function checkStores(commands, snapshot) {
const { resourceCommand } = commands;
const { TYPES } = resourceCommand;
const actual = {};
await resourceCommand.watchResources(
[TYPES.COOKIE, TYPES.LOCAL_STORAGE, TYPES.SESSION_STORAGE],
{
async onAvailable(resources) {
for (const resource of resources) {
actual[resource.resourceType] = await resource.getStoreObjects(
TEST_DOMAIN,
null,
{
sessionString,
}
);
}
},
}
);
for (const [type, entries] of Object.entries(snapshot)) {
const store = actual[type].data;
is(
store.length,
entries.length,
`The number of entries in ${type} is correct`
);
for (const entry of entries) {
checkStoreValue(entry.name, entry.value, store);
}
}
}
function checkStoreValue(name, value, store) {
for (const entry of store) {
if (entry.name === name) {
ok(true, `There is an entry for "${name}"`);
// entry.value is a longStringActor so we need to read it's value using
// entry.value.str.
is(entry.value.str, value, `Value for ${name} is correct`);
return;
}
}
ok(false, `There is an entry for "${name}"`);
}
async function addCookie(name, value) {
info(`addCookie("${name}", "${value}")`);
await SpecialPowers.spawn(
gBrowser.selectedBrowser,
[[name, value]],
([iName, iValue]) => {
content.wrappedJSObject.window.addCookie(iName, iValue);
}
);
}
async function removeCookie(name) {
info(`removeCookie("${name}")`);
await SpecialPowers.spawn(gBrowser.selectedBrowser, [name], iName => {
content.wrappedJSObject.window.removeCookie(iName);
});
}
async function localStorageSetItem(name, value) {
info(`localStorageSetItem("${name}", "${value}")`);
await SpecialPowers.spawn(
gBrowser.selectedBrowser,
[[name, value]],
([iName, iValue]) => {
content.window.localStorage.setItem(iName, iValue);
}
);
}
async function localStorageRemoveItem(name) {
info(`localStorageRemoveItem("${name}")`);
await SpecialPowers.spawn(gBrowser.selectedBrowser, [name], iName => {
content.window.localStorage.removeItem(iName);
});
}
async function sessionStorageSetItem(name, value) {
info(`sessionStorageSetItem("${name}", "${value}")`);
await SpecialPowers.spawn(
gBrowser.selectedBrowser,
[[name, value]],
([iName, iValue]) => {
content.window.sessionStorage.setItem(iName, iValue);
}
);
}
async function sessionStorageRemoveItem(name) {
info(`sessionStorageRemoveItem("${name}")`);
await SpecialPowers.spawn(gBrowser.selectedBrowser, [name], iName => {
content.window.sessionStorage.removeItem(iName);
});
}
async function clearCookies() {
info(`clearCookies()`);
await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => {
content.wrappedJSObject.window.clearCookies();
});
}
async function clearLocalAndSessionStores() {
info(`clearLocalAndSessionStores()`);
await SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => {
content.wrappedJSObject.window.clearLocalAndSessionStores();
});
}