|
Packit |
f0b94e |
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
|
|
Packit |
f0b94e |
/* Any copyright is dedicated to the Public Domain.
|
|
Packit |
f0b94e |
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
"use strict";
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
const {StorageFront} = require("devtools/shared/fronts/storage");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
const TESTS = [
|
|
Packit |
f0b94e |
// index 0
|
|
Packit |
f0b94e |
{
|
|
Packit |
f0b94e |
action: function (win) {
|
|
Packit |
f0b94e |
info('win.addCookie("c1", "foobar1")');
|
|
Packit |
f0b94e |
win.addCookie("c1", "foobar1");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
info('win.addCookie("c2", "foobar2")');
|
|
Packit |
f0b94e |
win.addCookie("c2", "foobar2");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
info('win.localStorage.setItem("l1", "foobar1")');
|
|
Packit |
f0b94e |
win.localStorage.setItem("l1", "foobar1");
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
expected: {
|
|
Packit |
f0b94e |
added: {
|
|
Packit |
f0b94e |
cookies: {
|
|
Packit |
f0b94e |
"http://test1.example.org": [
|
|
Packit |
f0b94e |
getCookieId("c1", "test1.example.org",
|
|
Packit |
f0b94e |
"/browser/devtools/server/tests/browser/"),
|
|
Packit |
f0b94e |
getCookieId("c2", "test1.example.org",
|
|
Packit |
f0b94e |
"/browser/devtools/server/tests/browser/")
|
|
Packit |
f0b94e |
]
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
localStorage: {
|
|
Packit |
f0b94e |
"http://test1.example.org": ["l1"]
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
// index 1
|
|
Packit |
f0b94e |
{
|
|
Packit |
f0b94e |
action: function (win) {
|
|
Packit |
f0b94e |
info('win.addCookie("c1", "new_foobar1")');
|
|
Packit |
f0b94e |
win.addCookie("c1", "new_foobar1");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
info('win.localStorage.setItem("l2", "foobar2")');
|
|
Packit |
f0b94e |
win.localStorage.setItem("l2", "foobar2");
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
expected: {
|
|
Packit |
f0b94e |
changed: {
|
|
Packit |
f0b94e |
cookies: {
|
|
Packit |
f0b94e |
"http://test1.example.org": [
|
|
Packit |
f0b94e |
getCookieId("c1", "test1.example.org",
|
|
Packit |
f0b94e |
"/browser/devtools/server/tests/browser/"),
|
|
Packit |
f0b94e |
]
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
added: {
|
|
Packit |
f0b94e |
localStorage: {
|
|
Packit |
f0b94e |
"http://test1.example.org": ["l2"]
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
// index 2
|
|
Packit |
f0b94e |
{
|
|
Packit |
f0b94e |
action: function (win) {
|
|
Packit |
f0b94e |
info('win.removeCookie("c2")');
|
|
Packit |
f0b94e |
win.removeCookie("c2");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
info('win.localStorage.removeItem("l1")');
|
|
Packit |
f0b94e |
win.localStorage.removeItem("l1");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
info('win.localStorage.setItem("l3", "foobar3")');
|
|
Packit |
f0b94e |
win.localStorage.setItem("l3", "foobar3");
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
expected: {
|
|
Packit |
f0b94e |
deleted: {
|
|
Packit |
f0b94e |
cookies: {
|
|
Packit |
f0b94e |
"http://test1.example.org": [
|
|
Packit |
f0b94e |
getCookieId("c2", "test1.example.org",
|
|
Packit |
f0b94e |
"/browser/devtools/server/tests/browser/"),
|
|
Packit |
f0b94e |
]
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
localStorage: {
|
|
Packit |
f0b94e |
"http://test1.example.org": ["l1"]
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
added: {
|
|
Packit |
f0b94e |
localStorage: {
|
|
Packit |
f0b94e |
"http://test1.example.org": ["l3"]
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
// index 3
|
|
Packit |
f0b94e |
{
|
|
Packit |
f0b94e |
action: function (win) {
|
|
Packit |
f0b94e |
info('win.removeCookie("c1")');
|
|
Packit |
f0b94e |
win.removeCookie("c1");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
info('win.addCookie("c3", "foobar3")');
|
|
Packit |
f0b94e |
win.addCookie("c3", "foobar3");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
info('win.localStorage.removeItem("l2")');
|
|
Packit |
f0b94e |
win.localStorage.removeItem("l2");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
info('win.sessionStorage.setItem("s1", "foobar1")');
|
|
Packit |
f0b94e |
win.sessionStorage.setItem("s1", "foobar1");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
info('win.sessionStorage.setItem("s2", "foobar2")');
|
|
Packit |
f0b94e |
win.sessionStorage.setItem("s2", "foobar2");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
info('win.localStorage.setItem("l3", "new_foobar3")');
|
|
Packit |
f0b94e |
win.localStorage.setItem("l3", "new_foobar3");
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
expected: {
|
|
Packit |
f0b94e |
added: {
|
|
Packit |
f0b94e |
cookies: {
|
|
Packit |
f0b94e |
"http://test1.example.org": [
|
|
Packit |
f0b94e |
getCookieId("c3", "test1.example.org",
|
|
Packit |
f0b94e |
"/browser/devtools/server/tests/browser/"),
|
|
Packit |
f0b94e |
]
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
sessionStorage: {
|
|
Packit |
f0b94e |
"http://test1.example.org": ["s1", "s2"]
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
changed: {
|
|
Packit |
f0b94e |
localStorage: {
|
|
Packit |
f0b94e |
"http://test1.example.org": ["l3"]
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
deleted: {
|
|
Packit |
f0b94e |
cookies: {
|
|
Packit |
f0b94e |
"http://test1.example.org": [
|
|
Packit |
f0b94e |
getCookieId("c1", "test1.example.org",
|
|
Packit |
f0b94e |
"/browser/devtools/server/tests/browser/"),
|
|
Packit |
f0b94e |
]
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
localStorage: {
|
|
Packit |
f0b94e |
"http://test1.example.org": ["l2"]
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
// index 4
|
|
Packit |
f0b94e |
{
|
|
Packit |
f0b94e |
action: function (win) {
|
|
Packit |
f0b94e |
info('win.sessionStorage.removeItem("s1")');
|
|
Packit |
f0b94e |
win.sessionStorage.removeItem("s1");
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
expected: {
|
|
Packit |
f0b94e |
deleted: {
|
|
Packit |
f0b94e |
sessionStorage: {
|
|
Packit |
f0b94e |
"http://test1.example.org": ["s1"]
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
// index 5
|
|
Packit |
f0b94e |
{
|
|
Packit |
f0b94e |
action: function (win) {
|
|
Packit |
f0b94e |
info("win.clearCookies()");
|
|
Packit |
f0b94e |
win.clearCookies();
|
|
Packit |
f0b94e |
},
|
|
Packit |
f0b94e |
expected: {
|
|
Packit |
f0b94e |
deleted: {
|
|
Packit |
f0b94e |
cookies: {
|
|
Packit |
f0b94e |
"http://test1.example.org": [
|
|
Packit |
f0b94e |
getCookieId("c3", "test1.example.org",
|
|
Packit |
f0b94e |
"/browser/devtools/server/tests/browser/"),
|
|
Packit |
f0b94e |
]
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
];
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
function markOutMatched(toBeEmptied, data) {
|
|
Packit |
f0b94e |
if (!Object.keys(toBeEmptied).length) {
|
|
Packit |
f0b94e |
info("Object empty");
|
|
Packit |
f0b94e |
return;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
ok(Object.keys(data).length, "At least one storage type should be present");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
for (let storageType in toBeEmptied) {
|
|
Packit |
f0b94e |
if (!data[storageType]) {
|
|
Packit |
f0b94e |
continue;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
info("Testing for " + storageType);
|
|
Packit |
f0b94e |
for (let host in data[storageType]) {
|
|
Packit |
f0b94e |
ok(toBeEmptied[storageType][host], "Host " + host + " found");
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
for (let item of data[storageType][host]) {
|
|
Packit |
f0b94e |
let index = toBeEmptied[storageType][host].indexOf(item);
|
|
Packit |
f0b94e |
ok(index > -1, "Item found - " + item);
|
|
Packit |
f0b94e |
if (index > -1) {
|
|
Packit |
f0b94e |
toBeEmptied[storageType][host].splice(index, 1);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
if (!toBeEmptied[storageType][host].length) {
|
|
Packit |
f0b94e |
delete toBeEmptied[storageType][host];
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
if (!Object.keys(toBeEmptied[storageType]).length) {
|
|
Packit |
f0b94e |
delete toBeEmptied[storageType];
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
function onStoresUpdate(expected, {added, changed, deleted}, index) {
|
|
Packit |
f0b94e |
info("inside stores update for index " + index);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
// Here, added, changed and deleted might be null even if they are required as
|
|
Packit |
f0b94e |
// per expected. This is fine as they might come in the next stores-update
|
|
Packit |
f0b94e |
// call or have already come in the previous one.
|
|
Packit |
f0b94e |
if (added) {
|
|
Packit |
f0b94e |
info("matching added object for index " + index);
|
|
Packit |
f0b94e |
markOutMatched(expected.added, added);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
if (changed) {
|
|
Packit |
f0b94e |
info("matching changed object for index " + index);
|
|
Packit |
f0b94e |
markOutMatched(expected.changed, changed);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
if (deleted) {
|
|
Packit |
f0b94e |
info("matching deleted object for index " + index);
|
|
Packit |
f0b94e |
markOutMatched(expected.deleted, deleted);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
if ((!expected.added || !Object.keys(expected.added).length) &&
|
|
Packit |
f0b94e |
(!expected.changed || !Object.keys(expected.changed).length) &&
|
|
Packit |
f0b94e |
(!expected.deleted || !Object.keys(expected.deleted).length)) {
|
|
Packit |
f0b94e |
info("Everything expected has been received for index " + index);
|
|
Packit |
f0b94e |
} else {
|
|
Packit |
f0b94e |
info("Still some updates pending for index " + index);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
function runTest({action, expected}, front, win, index) {
|
|
Packit |
f0b94e |
return new Promise(resolve => {
|
|
Packit |
f0b94e |
front.once("stores-update", function (addedChangedDeleted) {
|
|
Packit |
f0b94e |
onStoresUpdate(expected, addedChangedDeleted, index);
|
|
Packit |
f0b94e |
resolve();
|
|
Packit |
f0b94e |
});
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
info("Running test at index " + index);
|
|
Packit |
f0b94e |
action(win);
|
|
Packit |
f0b94e |
});
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
function testClearLocalAndSessionStores(front, win) {
|
|
Packit |
f0b94e |
return new Promise(resolve => {
|
|
Packit |
f0b94e |
// We need to wait until we have received stores-cleared for both local and
|
|
Packit |
f0b94e |
// session storage.
|
|
Packit |
f0b94e |
let localStorage = false;
|
|
Packit |
f0b94e |
let sessionStorage = false;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
front.on("stores-cleared", function onStoresCleared(data) {
|
|
Packit |
f0b94e |
storesCleared(data);
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
if (data.localStorage) {
|
|
Packit |
f0b94e |
localStorage = true;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
if (data.sessionStorage) {
|
|
Packit |
f0b94e |
sessionStorage = true;
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
if (localStorage && sessionStorage) {
|
|
Packit |
f0b94e |
front.off("stores-cleared", onStoresCleared);
|
|
Packit |
f0b94e |
resolve();
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
});
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
win.clearLocalAndSessionStores();
|
|
Packit |
f0b94e |
});
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
function storesCleared(data) {
|
|
Packit |
f0b94e |
if (data.sessionStorage || data.localStorage) {
|
|
Packit |
f0b94e |
let hosts = data.sessionStorage || data.localStorage;
|
|
Packit |
f0b94e |
info("Stores cleared required for session storage");
|
|
Packit |
f0b94e |
is(hosts.length, 1, "number of hosts is 1");
|
|
Packit |
f0b94e |
is(hosts[0], "http://test1.example.org",
|
|
Packit |
f0b94e |
"host matches for " + Object.keys(data)[0]);
|
|
Packit |
f0b94e |
} else {
|
|
Packit |
f0b94e |
ok(false, "Stores cleared should only be for local and session storage");
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
async function finishTests(client) {
|
|
Packit |
f0b94e |
await client.close();
|
|
Packit |
f0b94e |
DebuggerServer.destroy();
|
|
Packit |
f0b94e |
finish();
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
add_task(async function () {
|
|
Packit |
f0b94e |
let browser = await addTab(MAIN_DOMAIN + "storage-updates.html");
|
|
Packit |
f0b94e |
// eslint-disable-next-line mozilla/no-cpows-in-tests
|
|
Packit |
f0b94e |
let doc = browser.contentDocumentAsCPOW;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
initDebuggerServer();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
let client = new DebuggerClient(DebuggerServer.connectPipe());
|
|
Packit |
f0b94e |
let form = await connectDebuggerClient(client);
|
|
Packit |
f0b94e |
let front = StorageFront(client, form);
|
|
Packit |
f0b94e |
let win = doc.defaultView.wrappedJSObject;
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
await front.listStores();
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
for (let i = 0; i < TESTS.length; i++) {
|
|
Packit |
f0b94e |
let test = TESTS[i];
|
|
Packit |
f0b94e |
await runTest(test, front, win, i);
|
|
Packit |
f0b94e |
}
|
|
Packit |
f0b94e |
|
|
Packit |
f0b94e |
await testClearLocalAndSessionStores(front, win);
|
|
Packit |
f0b94e |
await finishTests(client);
|
|
Packit |
f0b94e |
});
|