1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
/* import-globals-from head.js */
/* eslint-disable mozilla/no-comparison-or-assignment-inside-ok */
const principalInfos = [
{ url: "http://example.com", attrs: {} },
{ url: "http://origin.test", attrs: {} },
{ url: "http://prefix.test", attrs: {} },
{ url: "http://prefix.test", attrs: { userContextId: 10 } },
{ url: "http://pattern.test", attrs: { userContextId: 15 } },
{ url: "http://pattern.test:8080", attrs: { userContextId: 15 } },
{ url: "https://pattern.test", attrs: { userContextId: 15 } },
];
const surrogate = String.fromCharCode(0xdc00);
const replacement = String.fromCharCode(0xfffd);
const beginning = "beginning";
const ending = "ending";
const complexValue = beginning + surrogate + surrogate + ending;
const corruptedValue = beginning + replacement + replacement + ending;
function enableNextGenLocalStorage() {
info("Setting pref");
Services.prefs.setBoolPref(
"dom.storage.enable_unsupported_legacy_implementation",
false
);
}
function disableNextGenLocalStorage() {
info("Setting pref");
Services.prefs.setBoolPref(
"dom.storage.enable_unsupported_legacy_implementation",
true
);
}
function storeData() {
for (let i = 0; i < principalInfos.length; i++) {
let principalInfo = principalInfos[i];
let principal = getPrincipal(principalInfo.url, principalInfo.attrs);
info("Getting storage");
let storage = getLocalStorage(principal);
info("Adding data");
storage.setItem("key0", "value0");
storage.clear();
storage.setItem("key1", "value1");
storage.removeItem("key1");
storage.setItem("key2", "value2");
storage.setItem("complexKey", complexValue);
info("Closing storage");
storage.close();
}
}
function exportShadowDatabase(name) {
info("Verifying shadow database");
let profileDir = Services.dirsvc.get("ProfD", Ci.nsIFile);
let shadowDatabase = profileDir.clone();
shadowDatabase.append("webappsstore.sqlite");
let exists = shadowDatabase.exists();
ok(exists, "Shadow database does exist");
info("Copying shadow database");
let currentDir = Services.dirsvc.get("CurWorkD", Ci.nsIFile);
shadowDatabase.copyTo(currentDir, name);
}
function importShadowDatabase(name) {
info("Verifying shadow database");
let currentDir = Services.dirsvc.get("CurWorkD", Ci.nsIFile);
let shadowDatabase = currentDir.clone();
shadowDatabase.append(name);
let exists = shadowDatabase.exists();
if (!exists) {
return false;
}
info("Copying shadow database");
let profileDir = Services.dirsvc.get("ProfD", Ci.nsIFile);
shadowDatabase.copyTo(profileDir, "webappsstore.sqlite");
return true;
}
function verifyData(clearedOrigins, migrated = false) {
for (let i = 0; i < principalInfos.length; i++) {
let principalInfo = principalInfos[i];
let principal = getPrincipal(principalInfo.url, principalInfo.attrs);
info("Getting storage");
let storage = getLocalStorage(principal);
info("Verifying data");
if (clearedOrigins.includes(i)) {
ok(storage.getItem("key2") == null, "Correct value");
ok(storage.getItem("complexKey") == null, "Correct value");
} else {
ok(storage.getItem("key0") == null, "Correct value");
ok(storage.getItem("key1") == null, "Correct value");
is(storage.getItem("key2"), "value2", "Correct value");
is(
storage.getItem("complexKey"),
migrated ? corruptedValue : complexValue,
"Correct value"
);
}
info("Closing storage");
storage.close();
}
}
|