mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-04 14:58:37 +09:00
parent
0665a343a5
commit
a5b4f6e003
27 changed files with 829 additions and 169 deletions
|
|
@ -15,6 +15,12 @@ const {isWindowIncluded} = require("devtools/shared/layout/utils");
|
|||
const specs = require("devtools/shared/specs/storage");
|
||||
const { Task } = require("devtools/shared/task");
|
||||
|
||||
// GUID to be used as a separator in compound keys. This must match the same
|
||||
// constant in devtools/client/storage/ui.js,
|
||||
// devtools/client/storage/test/head.js and
|
||||
// devtools/server/tests/browser/head.js
|
||||
const SEPARATOR_GUID = "{9d414cc5-8319-0a04-0586-c0a6ae01670a}";
|
||||
|
||||
loader.lazyImporter(this, "OS", "resource://gre/modules/osfile.jsm");
|
||||
loader.lazyImporter(this, "Sqlite", "resource://gre/modules/Sqlite.jsm");
|
||||
|
||||
|
|
@ -460,11 +466,13 @@ StorageActors.createActor({
|
|||
}
|
||||
|
||||
return {
|
||||
uniqueKey: `${cookie.name}${SEPARATOR_GUID}${cookie.host}` +
|
||||
`${SEPARATOR_GUID}${cookie.path}`,
|
||||
name: cookie.name,
|
||||
path: cookie.path || "",
|
||||
host: cookie.host || "",
|
||||
path: cookie.path || "",
|
||||
|
||||
// because expires is in seconds
|
||||
// because creationTime is in micro seconds
|
||||
expires: (cookie.expires || 0) * 1000,
|
||||
|
||||
// because it is in micro seconds
|
||||
|
|
@ -488,7 +496,10 @@ StorageActors.createActor({
|
|||
|
||||
for (let cookie of cookies) {
|
||||
if (this.isCookieAtHost(cookie, host)) {
|
||||
this.hostVsStores.get(host).set(cookie.name, cookie);
|
||||
let uniqueKey = `${cookie.name}${SEPARATOR_GUID}${cookie.host}` +
|
||||
`${SEPARATOR_GUID}${cookie.path}`;
|
||||
|
||||
this.hostVsStores.get(host).set(uniqueKey, cookie);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
@ -521,8 +532,11 @@ StorageActors.createActor({
|
|||
case "changed":
|
||||
if (hosts.length) {
|
||||
for (let host of hosts) {
|
||||
this.hostVsStores.get(host).set(subject.name, subject);
|
||||
data[host] = [subject.name];
|
||||
let uniqueKey = `${subject.name}${SEPARATOR_GUID}${subject.host}` +
|
||||
`${SEPARATOR_GUID}${subject.path}`;
|
||||
|
||||
this.hostVsStores.get(host).set(uniqueKey, subject);
|
||||
data[host] = [uniqueKey];
|
||||
}
|
||||
this.storageActor.update(action, "cookies", data);
|
||||
}
|
||||
|
|
@ -531,8 +545,11 @@ StorageActors.createActor({
|
|||
case "deleted":
|
||||
if (hosts.length) {
|
||||
for (let host of hosts) {
|
||||
this.hostVsStores.get(host).delete(subject.name);
|
||||
data[host] = [subject.name];
|
||||
let uniqueKey = `${subject.name}${SEPARATOR_GUID}${subject.host}` +
|
||||
`${SEPARATOR_GUID}${subject.path}`;
|
||||
|
||||
this.hostVsStores.get(host).delete(uniqueKey);
|
||||
data[host] = [uniqueKey];
|
||||
}
|
||||
this.storageActor.update("deleted", "cookies", data);
|
||||
}
|
||||
|
|
@ -543,8 +560,11 @@ StorageActors.createActor({
|
|||
for (let host of hosts) {
|
||||
let stores = [];
|
||||
for (let cookie of subject) {
|
||||
this.hostVsStores.get(host).delete(cookie.name);
|
||||
stores.push(cookie.name);
|
||||
let uniqueKey = `${cookie.name}${SEPARATOR_GUID}${cookie.host}` +
|
||||
`${SEPARATOR_GUID}${cookie.path}`;
|
||||
|
||||
this.hostVsStores.get(host).delete(uniqueKey);
|
||||
stores.push(uniqueKey);
|
||||
}
|
||||
data[host] = stores;
|
||||
}
|
||||
|
|
@ -566,15 +586,17 @@ StorageActors.createActor({
|
|||
|
||||
getFields: Task.async(function* () {
|
||||
return [
|
||||
{ name: "name", editable: 1},
|
||||
{ name: "path", editable: 1},
|
||||
{ name: "host", editable: 1},
|
||||
{ name: "expires", editable: 1},
|
||||
{ name: "lastAccessed", editable: 0},
|
||||
{ name: "value", editable: 1},
|
||||
{ name: "isDomain", editable: 0},
|
||||
{ name: "isSecure", editable: 1},
|
||||
{ name: "isHttpOnly", editable: 1}
|
||||
{ name: "uniqueKey", editable: false, private: true },
|
||||
{ name: "name", editable: true, hidden: false },
|
||||
{ name: "host", editable: true, hidden: false },
|
||||
{ name: "path", editable: true, hidden: false },
|
||||
{ name: "expires", editable: true, hidden: false },
|
||||
{ name: "lastAccessed", editable: false, hidden: false },
|
||||
{ name: "creationTime", editable: false, hidden: true },
|
||||
{ name: "value", editable: true, hidden: false },
|
||||
{ name: "isDomain", editable: false, hidden: true },
|
||||
{ name: "isSecure", editable: true, hidden: true },
|
||||
{ name: "isHttpOnly", editable: true, hidden: false }
|
||||
];
|
||||
}),
|
||||
|
||||
|
|
@ -696,7 +718,7 @@ var cookieHelpers = {
|
|||
* {
|
||||
* host: "http://www.mozilla.org",
|
||||
* field: "value",
|
||||
* key: "name",
|
||||
* editCookie: "name",
|
||||
* oldValue: "%7BHello%7D",
|
||||
* newValue: "%7BHelloo%7D",
|
||||
* items: {
|
||||
|
|
@ -720,10 +742,13 @@ var cookieHelpers = {
|
|||
let origPath = field === "path" ? oldValue : data.items.path;
|
||||
let cookie = null;
|
||||
|
||||
let enumerator = Services.cookies.getCookiesFromHost(origHost, data.originAttributes || {});
|
||||
let enumerator =
|
||||
Services.cookies.getCookiesFromHost(origHost, data.originAttributes || {});
|
||||
while (enumerator.hasMoreElements()) {
|
||||
let nsiCookie = enumerator.getNext().QueryInterface(Ci.nsICookie2);
|
||||
if (nsiCookie.name === origName && nsiCookie.host === origHost) {
|
||||
if (nsiCookie.name === origName &&
|
||||
nsiCookie.host === origHost &&
|
||||
nsiCookie.path === origPath) {
|
||||
cookie = {
|
||||
host: nsiCookie.host,
|
||||
path: nsiCookie.path,
|
||||
|
|
@ -743,7 +768,7 @@ var cookieHelpers = {
|
|||
return;
|
||||
}
|
||||
|
||||
// If the date is expired set it for 1 minute in the future.
|
||||
// If the date is expired set it for 10 seconds in the future.
|
||||
let now = new Date();
|
||||
if (!cookie.isSession && (cookie.expires * 1000) <= now) {
|
||||
let tenSecondsFromNow = (now.getTime() + 10 * 1000) / 1000;
|
||||
|
|
@ -797,6 +822,15 @@ var cookieHelpers = {
|
|||
},
|
||||
|
||||
_removeCookies(host, opts = {}) {
|
||||
// We use a uniqueId to emulate compound keys for cookies. We need to
|
||||
// extract the cookie name to remove the correct cookie.
|
||||
if (opts.name) {
|
||||
let split = opts.name.split(SEPARATOR_GUID);
|
||||
|
||||
opts.name = split[0];
|
||||
opts.path = split[2];
|
||||
}
|
||||
|
||||
function hostMatches(cookieHost, matchHost) {
|
||||
if (cookieHost == null) {
|
||||
return matchHost == null;
|
||||
|
|
@ -807,12 +841,15 @@ var cookieHelpers = {
|
|||
return cookieHost == host;
|
||||
}
|
||||
|
||||
let enumerator = Services.cookies.getCookiesFromHost(host, opts.originAttributes || {});
|
||||
let enumerator =
|
||||
Services.cookies.getCookiesFromHost(host, opts.originAttributes || {});
|
||||
|
||||
while (enumerator.hasMoreElements()) {
|
||||
let cookie = enumerator.getNext().QueryInterface(Ci.nsICookie2);
|
||||
if (hostMatches(cookie.host, host) &&
|
||||
(!opts.name || cookie.name === opts.name) &&
|
||||
(!opts.domain || cookie.host === opts.domain)) {
|
||||
(!opts.domain || cookie.host === opts.domain) &&
|
||||
(!opts.path || cookie.path === opts.path)) {
|
||||
Services.cookies.remove(
|
||||
cookie.host,
|
||||
cookie.name,
|
||||
|
|
@ -1024,8 +1061,8 @@ function getObjectForLocalOrSessionStorage(type) {
|
|||
|
||||
getFields: Task.async(function* () {
|
||||
return [
|
||||
{ name: "name", editable: 1},
|
||||
{ name: "value", editable: 1}
|
||||
{ name: "name", editable: true },
|
||||
{ name: "value", editable: true }
|
||||
];
|
||||
}),
|
||||
|
||||
|
|
@ -1205,8 +1242,8 @@ StorageActors.createActor({
|
|||
|
||||
getFields: Task.async(function* () {
|
||||
return [
|
||||
{ name: "url", editable: 0 },
|
||||
{ name: "status", editable: 0 }
|
||||
{ name: "url", editable: false },
|
||||
{ name: "status", editable: false }
|
||||
];
|
||||
}),
|
||||
|
||||
|
|
@ -1725,26 +1762,26 @@ StorageActors.createActor({
|
|||
// Detail of database
|
||||
case "database":
|
||||
return [
|
||||
{ name: "objectStore", editable: 0 },
|
||||
{ name: "keyPath", editable: 0 },
|
||||
{ name: "autoIncrement", editable: 0 },
|
||||
{ name: "indexes", editable: 0 },
|
||||
{ name: "objectStore", editable: false },
|
||||
{ name: "keyPath", editable: false },
|
||||
{ name: "autoIncrement", editable: false },
|
||||
{ name: "indexes", editable: false },
|
||||
];
|
||||
|
||||
// Detail of object store
|
||||
case "object store":
|
||||
return [
|
||||
{ name: "name", editable: 0 },
|
||||
{ name: "value", editable: 0 }
|
||||
{ name: "name", editable: false },
|
||||
{ name: "value", editable: false }
|
||||
];
|
||||
|
||||
// Detail of indexedDB for one origin
|
||||
default:
|
||||
return [
|
||||
{ name: "db", editable: 0 },
|
||||
{ name: "origin", editable: 0 },
|
||||
{ name: "version", editable: 0 },
|
||||
{ name: "objectStores", editable: 0 },
|
||||
{ name: "db", editable: false },
|
||||
{ name: "origin", editable: false },
|
||||
{ name: "version", editable: false },
|
||||
{ name: "objectStores", editable: false },
|
||||
];
|
||||
}
|
||||
})
|
||||
|
|
@ -2480,6 +2517,7 @@ let StorageActor = protocol.ActorClassWithSpec(specs.storageSpec, {
|
|||
// added or changed update
|
||||
this.removeNamesFromUpdateList("added", storeType, data);
|
||||
this.removeNamesFromUpdateList("changed", storeType, data);
|
||||
|
||||
for (let host in data) {
|
||||
if (data[host].length == 0 && this.boundUpdate.added &&
|
||||
this.boundUpdate.added[storeType] &&
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ support-files =
|
|||
doc_perf.html
|
||||
navigate-first.html
|
||||
navigate-second.html
|
||||
storage-cookies-same-name.html
|
||||
storage-dynamic-windows.html
|
||||
storage-listings.html
|
||||
storage-unsecured-iframe.html
|
||||
|
|
@ -80,6 +81,7 @@ skip-if = e10s # Bug 1183605 - devtools/server/tests/browser/ tests are still di
|
|||
#[browser_perf-front-profiler-01.js] bug 1077464
|
||||
#[browser_perf-front-profiler-05.js] bug 1077464
|
||||
#[browser_perf-front-profiler-06.js]
|
||||
[browser_storage_cookies-duplicate-names.js]
|
||||
[browser_storage_dynamic_windows.js]
|
||||
[browser_storage_listings.js]
|
||||
[browser_storage_updates.js]
|
||||
|
|
|
|||
|
|
@ -0,0 +1,105 @@
|
|||
/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
"use strict";
|
||||
|
||||
// Test that the storage panel is able to display multiple cookies with the same
|
||||
// name (and different paths).
|
||||
|
||||
const {StorageFront} = require("devtools/shared/fronts/storage");
|
||||
Services.scriptloader.loadSubScript("chrome://mochitests/content/browser/devtools/server/tests/browser/storage-helpers.js", this);
|
||||
|
||||
const TESTDATA = {
|
||||
"test1.example.org": [
|
||||
{
|
||||
name: "name",
|
||||
value: "value1",
|
||||
expires: 0,
|
||||
path: "/",
|
||||
host: "test1.example.org",
|
||||
isDomain: false,
|
||||
isSecure: false,
|
||||
},
|
||||
{
|
||||
name: "name",
|
||||
value: "value2",
|
||||
expires: 0,
|
||||
path: "/path2/",
|
||||
host: "test1.example.org",
|
||||
isDomain: false,
|
||||
isSecure: false,
|
||||
},
|
||||
{
|
||||
name: "name",
|
||||
value: "value3",
|
||||
expires: 0,
|
||||
path: "/path3/",
|
||||
host: "test1.example.org",
|
||||
isDomain: false,
|
||||
isSecure: false,
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
add_task(function* () {
|
||||
yield openTabAndSetupStorage(MAIN_DOMAIN + "storage-cookies-same-name.html");
|
||||
|
||||
initDebuggerServer();
|
||||
let client = new DebuggerClient(DebuggerServer.connectPipe());
|
||||
let form = yield connectDebuggerClient(client);
|
||||
let front = StorageFront(client, form);
|
||||
let data = yield front.listStores();
|
||||
|
||||
ok(data.cookies, "Cookies storage actor is present");
|
||||
|
||||
yield testCookies(data.cookies);
|
||||
yield clearStorage();
|
||||
|
||||
// Forcing GC/CC to get rid of docshells and windows created by this test.
|
||||
forceCollections();
|
||||
yield client.close();
|
||||
forceCollections();
|
||||
DebuggerServer.destroy();
|
||||
forceCollections();
|
||||
});
|
||||
|
||||
function testCookies(cookiesActor) {
|
||||
let numHosts = Object.keys(cookiesActor.hosts).length;
|
||||
is(numHosts, 1, "Correct number of host entries for cookies");
|
||||
return testCookiesObjects(0, cookiesActor.hosts, cookiesActor);
|
||||
}
|
||||
|
||||
var testCookiesObjects = Task.async(function* (index, hosts, cookiesActor) {
|
||||
let host = Object.keys(hosts)[index];
|
||||
let matchItems = data => {
|
||||
is(data.total, TESTDATA[host].length,
|
||||
"Number of cookies in host " + host + " matches");
|
||||
for (let item of data.data) {
|
||||
let found = false;
|
||||
for (let 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.isDomain, toMatch.isDomain, "The isDomain value matches.");
|
||||
break;
|
||||
}
|
||||
}
|
||||
ok(found, "cookie " + item.name + " should exist in response");
|
||||
}
|
||||
};
|
||||
|
||||
ok(!!TESTDATA[host], "Host is present in the list : " + host);
|
||||
matchItems(yield cookiesActor.getStoreObjects(host));
|
||||
if (index == Object.keys(hosts).length - 1) {
|
||||
return;
|
||||
}
|
||||
yield testCookiesObjects(++index, hosts, cookiesActor);
|
||||
});
|
||||
|
|
@ -66,6 +66,7 @@ function markOutMatched(toBeEmptied, data, deleted) {
|
|||
info("Testing for " + storageType);
|
||||
for (let host in data[storageType]) {
|
||||
ok(toBeEmptied[storageType][host], "Host " + host + " found");
|
||||
|
||||
if (!deleted) {
|
||||
for (let item of data[storageType][host]) {
|
||||
let index = toBeEmptied[storageType][host].indexOf(item);
|
||||
|
|
@ -87,50 +88,6 @@ function markOutMatched(toBeEmptied, data, deleted) {
|
|||
}
|
||||
}
|
||||
|
||||
// function testReload(front) {
|
||||
// info("Testing if reload works properly");
|
||||
|
||||
// let shouldBeEmptyFirst = Cu.cloneInto(beforeReload, {});
|
||||
// let shouldBeEmptyLast = Cu.cloneInto(beforeReload, {});
|
||||
// return new Promise(resolve => {
|
||||
|
||||
// let onStoresUpdate = data => {
|
||||
// info("in stores update of testReload");
|
||||
// // This might be second time stores update is happening, in which case,
|
||||
// // data.deleted will be null.
|
||||
// // OR.. This might be the first time on a super slow machine where both
|
||||
// // data.deleted and data.added is missing in the first update.
|
||||
// if (data.deleted) {
|
||||
// markOutMatched(shouldBeEmptyFirst, data.deleted, true);
|
||||
// }
|
||||
|
||||
// if (!Object.keys(shouldBeEmptyFirst).length) {
|
||||
// info("shouldBeEmptyFirst is empty now");
|
||||
// }
|
||||
|
||||
// // stores-update call might not have data.added for the first time on
|
||||
// // slow machines, in which case, data.added will be null
|
||||
// if (data.added) {
|
||||
// markOutMatched(shouldBeEmptyLast, data.added);
|
||||
// }
|
||||
|
||||
// if (!Object.keys(shouldBeEmptyLast).length) {
|
||||
// info("Everything to be received is received.");
|
||||
// endTestReloaded();
|
||||
// }
|
||||
// };
|
||||
|
||||
// let endTestReloaded = () => {
|
||||
// front.off("stores-update", onStoresUpdate);
|
||||
// resolve();
|
||||
// };
|
||||
|
||||
// front.on("stores-update", onStoresUpdate);
|
||||
|
||||
// content.location.reload();
|
||||
// });
|
||||
// }
|
||||
|
||||
function testAddIframe(front) {
|
||||
info("Testing if new iframe addition works properly");
|
||||
return new Promise(resolve => {
|
||||
|
|
@ -142,7 +99,10 @@ function testAddIframe(front) {
|
|||
"https://sectest1.example.org": ["iframe-s-ss1"]
|
||||
},
|
||||
cookies: {
|
||||
"sectest1.example.org": ["sc1"]
|
||||
"sectest1.example.org": [
|
||||
getCookieId("sc1", "sectest1.example.org",
|
||||
"/browser/devtools/server/tests/browser/")
|
||||
]
|
||||
},
|
||||
indexedDB: {
|
||||
// empty because indexed db creation happens after the page load, so at
|
||||
|
|
@ -150,7 +110,7 @@ function testAddIframe(front) {
|
|||
"https://sectest1.example.org": []
|
||||
},
|
||||
Cache: {
|
||||
"https://sectest1.example.org":[]
|
||||
"https://sectest1.example.org": []
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -19,15 +19,6 @@ const storeMap = {
|
|||
isDomain: false,
|
||||
isSecure: false,
|
||||
},
|
||||
{
|
||||
name: "cs2",
|
||||
value: "sessionCookie",
|
||||
path: "/",
|
||||
host: ".example.org",
|
||||
expires: 0,
|
||||
isDomain: true,
|
||||
isSecure: false,
|
||||
},
|
||||
{
|
||||
name: "c3",
|
||||
value: "foobar-2",
|
||||
|
|
@ -337,7 +328,8 @@ function* testStores(data) {
|
|||
}
|
||||
|
||||
function testCookies(cookiesActor) {
|
||||
is(Object.keys(cookiesActor.hosts).length, 2, "Correct number of host entries for cookies");
|
||||
is(Object.keys(cookiesActor.hosts).length, 2,
|
||||
"Correct number of host entries for cookies");
|
||||
return testCookiesObjects(0, cookiesActor.hosts, cookiesActor);
|
||||
}
|
||||
|
||||
|
|
@ -346,9 +338,9 @@ var testCookiesObjects = Task.async(function* (index, hosts, cookiesActor) {
|
|||
let matchItems = data => {
|
||||
let cookiesLength = 0;
|
||||
for (let secureCookie of storeMap.cookies[host]) {
|
||||
if (secureCookie.isSecure) {
|
||||
++cookiesLength;
|
||||
}
|
||||
if (secureCookie.isSecure) {
|
||||
++cookiesLength;
|
||||
}
|
||||
}
|
||||
// Any secure cookies did not get stored in the database.
|
||||
is(data.total, storeMap.cookies[host].length - cookiesLength,
|
||||
|
|
|
|||
|
|
@ -27,7 +27,12 @@ const TESTS = [
|
|||
expected: {
|
||||
added: {
|
||||
cookies: {
|
||||
"test1.example.org": ["c1", "c2"]
|
||||
"test1.example.org": [
|
||||
getCookieId("c1", "test1.example.org",
|
||||
"/browser/devtools/server/tests/browser/"),
|
||||
getCookieId("c2", "test1.example.org",
|
||||
"/browser/devtools/server/tests/browser/")
|
||||
]
|
||||
},
|
||||
localStorage: {
|
||||
"http://test1.example.org": ["l1"]
|
||||
|
|
@ -48,7 +53,10 @@ const TESTS = [
|
|||
expected: {
|
||||
changed: {
|
||||
cookies: {
|
||||
"test1.example.org": ["c1"]
|
||||
"test1.example.org": [
|
||||
getCookieId("c1", "test1.example.org",
|
||||
"/browser/devtools/server/tests/browser/"),
|
||||
]
|
||||
}
|
||||
},
|
||||
added: {
|
||||
|
|
@ -74,7 +82,10 @@ const TESTS = [
|
|||
expected: {
|
||||
deleted: {
|
||||
cookies: {
|
||||
"test1.example.org": ["c2"]
|
||||
"test1.example.org": [
|
||||
getCookieId("c2", "test1.example.org",
|
||||
"/browser/devtools/server/tests/browser/"),
|
||||
]
|
||||
},
|
||||
localStorage: {
|
||||
"http://test1.example.org": ["l1"]
|
||||
|
|
@ -112,7 +123,10 @@ const TESTS = [
|
|||
expected: {
|
||||
added: {
|
||||
cookies: {
|
||||
"test1.example.org": ["c3"]
|
||||
"test1.example.org": [
|
||||
getCookieId("c3", "test1.example.org",
|
||||
"/browser/devtools/server/tests/browser/"),
|
||||
]
|
||||
},
|
||||
sessionStorage: {
|
||||
"http://test1.example.org": ["s1", "s2"]
|
||||
|
|
@ -125,7 +139,10 @@ const TESTS = [
|
|||
},
|
||||
deleted: {
|
||||
cookies: {
|
||||
"test1.example.org": ["c1"]
|
||||
"test1.example.org": [
|
||||
getCookieId("c1", "test1.example.org",
|
||||
"/browser/devtools/server/tests/browser/"),
|
||||
]
|
||||
},
|
||||
localStorage: {
|
||||
"http://test1.example.org": ["l2"]
|
||||
|
|
@ -158,7 +175,10 @@ const TESTS = [
|
|||
expected: {
|
||||
deleted: {
|
||||
cookies: {
|
||||
"test1.example.org": ["c3"]
|
||||
"test1.example.org": [
|
||||
getCookieId("c3", "test1.example.org",
|
||||
"/browser/devtools/server/tests/browser/"),
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,6 +2,10 @@
|
|||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
/* eslint no-unused-vars: [2, {"vars": "local"}] */
|
||||
|
||||
var Cc = Components.classes;
|
||||
var Ci = Components.interfaces;
|
||||
var Cu = Components.utils;
|
||||
|
|
@ -19,6 +23,11 @@ const MAIN_DOMAIN = "http://test1.example.org/" + PATH;
|
|||
const ALT_DOMAIN = "http://sectest1.example.org/" + PATH;
|
||||
const ALT_DOMAIN_SECURED = "https://sectest1.example.org:443/" + PATH;
|
||||
|
||||
// GUID to be used as a separator in compound keys. This must match the same
|
||||
// constant in devtools/server/actors/storage.js,
|
||||
// devtools/client/storage/ui.js and devtools/client/storage/test/head.js
|
||||
const SEPARATOR_GUID = "{9d414cc5-8319-0a04-0586-c0a6ae01670a}";
|
||||
|
||||
// All tests are asynchronous.
|
||||
waitForExplicitFinish();
|
||||
|
||||
|
|
@ -94,7 +103,6 @@ function once(target, eventName, useCapture = false) {
|
|||
info("Waiting for event: '" + eventName + "' on " + target + ".");
|
||||
|
||||
return new Promise(resolve => {
|
||||
|
||||
for (let [add, remove] of [
|
||||
["addEventListener", "removeEventListener"],
|
||||
["addListener", "removeListener"],
|
||||
|
|
@ -137,6 +145,8 @@ function getMockTabActor(win) {
|
|||
}
|
||||
|
||||
registerCleanupFunction(function tearDown() {
|
||||
Services.cookies.removeAll();
|
||||
|
||||
while (gBrowser.tabs.length > 1) {
|
||||
gBrowser.removeCurrentTab();
|
||||
}
|
||||
|
|
@ -148,8 +158,11 @@ function idleWait(time) {
|
|||
|
||||
function busyWait(time) {
|
||||
let start = Date.now();
|
||||
// eslint-disable-next-line
|
||||
let stack;
|
||||
while (Date.now() - start < time) { stack = Components.stack; }
|
||||
while (Date.now() - start < time) {
|
||||
stack = Components.stack;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -172,11 +185,12 @@ function waitUntil(predicate, interval = 10) {
|
|||
}
|
||||
|
||||
function waitForMarkerType(front, types, predicate,
|
||||
unpackFun = (name, data) => data.markers,
|
||||
eventName = "timeline-data")
|
||||
{
|
||||
unpackFun = (name, data) => data.markers,
|
||||
eventName = "timeline-data") {
|
||||
types = [].concat(types);
|
||||
predicate = predicate || function () { return true; };
|
||||
predicate = predicate || function () {
|
||||
return true;
|
||||
};
|
||||
let filteredMarkers = [];
|
||||
let { promise, resolve } = defer();
|
||||
|
||||
|
|
@ -190,9 +204,11 @@ function waitForMarkerType(front, types, predicate,
|
|||
let markers = unpackFun(name, data);
|
||||
info("Got markers: " + JSON.stringify(markers, null, 2));
|
||||
|
||||
filteredMarkers = filteredMarkers.concat(markers.filter(m => types.indexOf(m.name) !== -1));
|
||||
filteredMarkers = filteredMarkers.concat(
|
||||
markers.filter(m => types.indexOf(m.name) !== -1));
|
||||
|
||||
if (types.every(t => filteredMarkers.some(m => m.name === t)) && predicate(filteredMarkers)) {
|
||||
if (types.every(t => filteredMarkers.some(m => m.name === t)) &&
|
||||
predicate(filteredMarkers)) {
|
||||
front.off(eventName, handler);
|
||||
resolve(filteredMarkers);
|
||||
}
|
||||
|
|
@ -201,3 +217,7 @@ function waitForMarkerType(front, types, predicate,
|
|||
|
||||
return promise;
|
||||
}
|
||||
|
||||
function getCookieId(name, domain, path) {
|
||||
return `${name}${SEPARATOR_GUID}${domain}${SEPARATOR_GUID}${path}`;
|
||||
}
|
||||
|
|
|
|||
28
devtools/server/tests/browser/storage-cookies-same-name.html
Normal file
28
devtools/server/tests/browser/storage-cookies-same-name.html
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Storage inspector cookies with duplicate names</title>
|
||||
</head>
|
||||
<body onload="createCookies()">
|
||||
<script type="application/javascript;version=1.7">
|
||||
"use strict";
|
||||
function createCookies() {
|
||||
document.cookie = "name=value1;path=/;";
|
||||
document.cookie = "name=value2;path=/path2/;";
|
||||
document.cookie = "name=value3;path=/path3/;";
|
||||
}
|
||||
|
||||
window.removeCookie = function (name) {
|
||||
document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT";
|
||||
};
|
||||
|
||||
window.clearCookies = function () {
|
||||
let cookies = document.cookie;
|
||||
for (let cookie of cookies.split(";")) {
|
||||
removeCookie(cookie.split("=")[0]);
|
||||
}
|
||||
};
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
Loading…
Add table
Add a link
Reference in a new issue