Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* Any copyright is dedicated to the Public Domain.
"use strict";
// Test that the storage panel is able to display multiple cookies with the same
// name (and different paths).
Services.scriptloader.loadSubScript(
this
);
const l10n = new Localization(["devtools/client/storage.ftl"], true);
const sessionString = l10n.formatValueSync("storage-expires-session");
const TESTDATA = {
{
name: "name",
value: "value1",
expires: 0,
path: "/",
host: "test1.example.org",
hostOnly: true,
isSecure: false,
},
{
name: "name",
value: "value2",
expires: 0,
path: "/path2/",
host: "test1.example.org",
hostOnly: true,
isSecure: false,
},
{
name: "name",
value: "value3",
expires: 0,
path: "/path3/",
host: "test1.example.org",
hostOnly: true,
isSecure: false,
},
],
};
add_task(async function () {
const { commands } = await openTabAndSetupStorage(
MAIN_DOMAIN + "storage-cookies-same-name.html"
);
const { resourceCommand } = commands;
const { TYPES } = resourceCommand;
const data = {};
await resourceCommand.watchResources(
[TYPES.COOKIE, TYPES.LOCAL_STORAGE, TYPES.SESSION_STORAGE],
{
async onAvailable(resources) {
for (const resource of resources) {
const { resourceType } = resource;
if (!data[resourceType]) {
data[resourceType] = { hosts: {}, dataByHost: {} };
}
for (const host in resource.hosts) {
if (!data[resourceType].hosts[host]) {
data[resourceType].hosts[host] = [];
}
// For indexed DB, we have some values, the database names. Other are empty arrays.
const hostValues = resource.hosts[host];
data[resourceType].hosts[host].push(...hostValues);
data[resourceType].dataByHost[host] =
await resource.getStoreObjects(host, null, { sessionString });
}
}
},
}
);
ok(data.cookies, "Cookies storage actor is present");
await testCookies(data.cookies);
await clearStorage();
// Forcing GC/CC to get rid of docshells and windows created by this test.
forceCollections();
await commands.destroy();
forceCollections();
});
function testCookies({ hosts, dataByHost }) {
const numHosts = Object.keys(hosts).length;
is(numHosts, 1, "Correct number of host entries for cookies");
return testCookiesObjects(0, hosts, dataByHost);
}
var testCookiesObjects = async function (index, hosts, dataByHost) {
const host = Object.keys(hosts)[index];
const data = dataByHost[host];
is(
data.total,
TESTDATA[host].length,
"Number of cookies in host " + host + " matches"
);
for (const item of data.data) {
let found = false;
for (const toMatch of TESTDATA[host]) {
if (
item.name === toMatch.name &&
item.host === toMatch.host &&
item.path === toMatch.path
) {
found = true;
ok(true, "Found cookie " + item.name + " in response");
is(item.value.str, toMatch.value, "The value matches.");
is(item.expires, toMatch.expires, "The expiry time matches.");
is(item.path, toMatch.path, "The path matches.");
is(item.host, toMatch.host, "The host matches.");
is(item.isSecure, toMatch.isSecure, "The isSecure value matches.");
is(item.hostOnly, toMatch.hostOnly, "The hostOnly value matches.");
break;
}
}
ok(found, "cookie " + item.name + " should exist in response");
}
ok(!!TESTDATA[host], "Host is present in the list : " + host);
if (index == Object.keys(hosts).length - 1) {
return;
}
await testCookiesObjects(++index, hosts, dataByHost);
};