375 lines
10 KiB
JavaScript
375 lines
10 KiB
JavaScript
/**
|
|
* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/
|
|
*/
|
|
|
|
// This test must be first, since we need the actor not to be created already.
|
|
exported_symbols.testGetDirectoryTwice = async function () {
|
|
const promise1 = navigator.storage.getDirectory();
|
|
const promise2 = navigator.storage.getDirectory();
|
|
|
|
await Promise.all([promise1, promise2]);
|
|
|
|
Assert.ok(true, "Should not have thrown");
|
|
};
|
|
|
|
exported_symbols.testGetDirectoryDoesNotThrow = async function () {
|
|
await navigator.storage.getDirectory();
|
|
|
|
Assert.ok(true, "Should not have thrown");
|
|
};
|
|
|
|
exported_symbols.testGetDirectoryKindIsDirectory = async function () {
|
|
const root = await navigator.storage.getDirectory();
|
|
|
|
Assert.equal(root.kind, "directory");
|
|
};
|
|
|
|
exported_symbols.testDirectoryHandleStringConversion = async function () {
|
|
const root = await navigator.storage.getDirectory();
|
|
|
|
Assert.equal(
|
|
"" + root,
|
|
"[object FileSystemDirectoryHandle]",
|
|
"Is directoryHandle convertible to string?"
|
|
);
|
|
};
|
|
|
|
exported_symbols.testNewDirectoryHandleFromPrototype = async function () {
|
|
const root = await navigator.storage.getDirectory();
|
|
|
|
try {
|
|
Object.create(root.prototype);
|
|
Assert.ok(false, "Should have thrown");
|
|
} catch (ex) {
|
|
Assert.ok(true, "Should have thrown");
|
|
Assert.ok(ex instanceof TypeError, "Threw the right error type");
|
|
}
|
|
};
|
|
|
|
exported_symbols.testIsSameEntryRoot = async function () {
|
|
const root = await navigator.storage.getDirectory();
|
|
try {
|
|
await root.move(root);
|
|
Assert.ok(false, "root should not be movable");
|
|
} catch (ex) {
|
|
Assert.ok(true, "root isn't movable");
|
|
}
|
|
};
|
|
|
|
exported_symbols.testDirectoryHandleSupportsKeysIterator = async function () {
|
|
const root = await navigator.storage.getDirectory();
|
|
|
|
const it = await root.keys();
|
|
Assert.ok(!!it, "Does root support keys iterator?");
|
|
};
|
|
|
|
exported_symbols.testKeysIteratorNextIsCallable = async function () {
|
|
const root = await navigator.storage.getDirectory();
|
|
|
|
const it = await root.keys();
|
|
Assert.ok(!!it, "Does root support keys iterator?");
|
|
|
|
const item = await it.next();
|
|
Assert.ok(!!item, "Should return an item");
|
|
};
|
|
|
|
exported_symbols.testDirectoryHandleSupportsValuesIterator = async function () {
|
|
const root = await navigator.storage.getDirectory();
|
|
|
|
const it = await root.values();
|
|
Assert.ok(!!it, "Does root support values iterator?");
|
|
};
|
|
|
|
exported_symbols.testValuesIteratorNextIsCallable = async function () {
|
|
const root = await navigator.storage.getDirectory();
|
|
|
|
const it = await root.values();
|
|
Assert.ok(!!it, "Does root support values iterator?");
|
|
|
|
const item = await it.next();
|
|
Assert.ok(!!item, "Should return an item");
|
|
};
|
|
|
|
exported_symbols.testDirectoryHandleSupportsEntriesIterator =
|
|
async function () {
|
|
const root = await navigator.storage.getDirectory();
|
|
|
|
const it = await root.entries();
|
|
Assert.ok(!!it, "Does root support entries iterator?");
|
|
};
|
|
|
|
exported_symbols.testEntriesIteratorNextIsCallable = async function () {
|
|
const root = await navigator.storage.getDirectory();
|
|
|
|
const it = await root.entries();
|
|
Assert.ok(!!it, "Does root support entries iterator?");
|
|
|
|
const item = await it.next();
|
|
Assert.ok(!!item, "Should return an item");
|
|
};
|
|
|
|
exported_symbols.testGetFileHandleIsCallable = async function () {
|
|
const root = await navigator.storage.getDirectory();
|
|
const allowCreate = { create: true };
|
|
|
|
const item = await root.getFileHandle("fileName", allowCreate);
|
|
Assert.ok(!!item, "Should return an item");
|
|
|
|
await root.removeEntry("fileName");
|
|
};
|
|
|
|
exported_symbols.testGetDirectoryHandleIsCallable = async function () {
|
|
const root = await navigator.storage.getDirectory();
|
|
const allowCreate = { create: true };
|
|
|
|
const item = await root.getDirectoryHandle("dirName", allowCreate);
|
|
Assert.ok(!!item, "Should return an item");
|
|
|
|
await root.removeEntry("dirName");
|
|
};
|
|
|
|
exported_symbols.testRemoveEntryIsCallable = async function () {
|
|
const root = await navigator.storage.getDirectory();
|
|
const removeOptions = { recursive: true };
|
|
const allowCreate = { create: true };
|
|
|
|
// Ensure file and directory items exists
|
|
await root.getFileHandle("fileName", allowCreate);
|
|
await root.getDirectoryHandle("dirName", allowCreate);
|
|
await root.removeEntry("fileName", removeOptions);
|
|
await root.removeEntry("dirName", removeOptions);
|
|
try {
|
|
await root.removeEntry("doesNotExist", removeOptions);
|
|
Assert.ok(false, "Should have thrown");
|
|
} catch (ex) {
|
|
Assert.ok(true, "Should have thrown");
|
|
Assert.equal(
|
|
ex.message,
|
|
"Entry not found",
|
|
"Threw the right error message"
|
|
);
|
|
}
|
|
};
|
|
|
|
exported_symbols.testResolveIsCallable = async function () {
|
|
const root = await navigator.storage.getDirectory();
|
|
const allowCreate = { create: true };
|
|
const item = await root.getFileHandle("fileName", allowCreate);
|
|
|
|
let path = await root.resolve(item);
|
|
Assert.equal(path.length, 1);
|
|
Assert.equal(path[0], "fileName", "Resolve got the right path");
|
|
|
|
await root.removeEntry("fileName");
|
|
};
|
|
|
|
exported_symbols.testFileType = async function () {
|
|
const root = await navigator.storage.getDirectory();
|
|
const allowCreate = { create: true };
|
|
const nameStem = "testFileType";
|
|
const empty = "";
|
|
|
|
const extensions = [
|
|
"txt",
|
|
"jS",
|
|
"JSON",
|
|
"css",
|
|
"html",
|
|
"htm",
|
|
"xhtml",
|
|
"xml",
|
|
"xhtml+xml",
|
|
"png",
|
|
"apng",
|
|
"jPg",
|
|
"Jpeg",
|
|
"pdF",
|
|
"out",
|
|
"sh",
|
|
"ExE",
|
|
"psid",
|
|
"EXE ",
|
|
" EXE",
|
|
"EX\uff65",
|
|
"\udbff\udbff\udbff",
|
|
// XXX: Invalid surrogate combos like "\udc00\udc00\udc00" may map to the same names impacting cleanup.
|
|
"js\udbff",
|
|
"\udc00js",
|
|
"???",
|
|
"\root",
|
|
empty,
|
|
"AXS",
|
|
"dll",
|
|
"ocx",
|
|
"1",
|
|
"ps1",
|
|
"cmd",
|
|
"xpi",
|
|
"swf",
|
|
];
|
|
|
|
const expectedTypes = [
|
|
"text/plain",
|
|
"application/javascript",
|
|
"application/json",
|
|
"text/css",
|
|
"text/html",
|
|
"text/html",
|
|
"application/xhtml+xml",
|
|
"text/xml",
|
|
empty,
|
|
"image/png",
|
|
"image/apng",
|
|
"image/jpeg",
|
|
"image/jpeg",
|
|
"application/pdf",
|
|
empty,
|
|
"application/x-sh",
|
|
"application/octet-stream",
|
|
empty,
|
|
empty,
|
|
empty,
|
|
empty,
|
|
empty,
|
|
empty,
|
|
empty,
|
|
empty,
|
|
empty,
|
|
empty,
|
|
"application/olescript",
|
|
"application/x-msdownload",
|
|
"application/octet-stream",
|
|
empty,
|
|
empty,
|
|
"text/plain",
|
|
"application/x-xpinstall",
|
|
"application/x-shockwave-flash",
|
|
];
|
|
|
|
Assert.equal(extensions.length, expectedTypes.length);
|
|
|
|
await Promise.all(
|
|
extensions.map(async (ext, i) => {
|
|
const fileName = nameStem + "." + ext;
|
|
const fileHandle = await root.getFileHandle(fileName, allowCreate);
|
|
const fileObject = await fileHandle.getFile();
|
|
Assert.equal(fileObject.name, fileHandle.name);
|
|
Assert.equal(fileObject.type, expectedTypes[i]);
|
|
await root.removeEntry(fileName);
|
|
})
|
|
);
|
|
};
|
|
|
|
exported_symbols.testContentTypeChangesOnFileMove = async function () {
|
|
const allowCreate = { create: true };
|
|
const root = await navigator.storage.getDirectory();
|
|
const oldName = "testFile.txt";
|
|
const oldType = "text/plain";
|
|
const subdir = await root.getDirectoryHandle("subdir", allowCreate);
|
|
|
|
const fileHandle = await root.getFileHandle(oldName, allowCreate);
|
|
|
|
async function checkMove(newName, newType) {
|
|
Assert.equal(fileHandle.name, newName, "Has filename changed?");
|
|
{
|
|
const fileObject = await fileHandle.getFile();
|
|
Assert.equal(fileObject.name, newName, "Is the fileobject renamed?");
|
|
Assert.equal(fileObject.type, newType, "Is the fileobject type updated?");
|
|
}
|
|
}
|
|
|
|
async function restoreTest() {
|
|
await fileHandle.move(root, oldName);
|
|
await checkMove(oldName, oldType);
|
|
}
|
|
|
|
// No name change
|
|
await checkMove(oldName, oldType);
|
|
await fileHandle.move(subdir);
|
|
await checkMove(oldName, oldType);
|
|
await restoreTest();
|
|
|
|
// With name change
|
|
|
|
async function testMoveWithParams(testName, testType) {
|
|
async function testFileMoveCall(...combo) {
|
|
await fileHandle.move(...combo);
|
|
await checkMove(testName, testType);
|
|
await restoreTest();
|
|
}
|
|
|
|
await testFileMoveCall(subdir, testName);
|
|
await testFileMoveCall(root, testName);
|
|
await testFileMoveCall(testName);
|
|
}
|
|
|
|
const testParams = {
|
|
"testFile.json": "application/json",
|
|
testFile: oldType,
|
|
"testFile.äüö": "",
|
|
};
|
|
|
|
for (const [aName, aType] of Object.entries(testParams)) {
|
|
await testMoveWithParams(aName, aType);
|
|
}
|
|
};
|
|
|
|
exported_symbols.testContentTypeChangesOnDirMove = async function () {
|
|
const allowCreate = { create: true };
|
|
const root = await navigator.storage.getDirectory();
|
|
const oldName = "testFile.txt";
|
|
const oldType = "text/plain";
|
|
const subDirOrig = await root.getDirectoryHandle("subDirOrig", allowCreate);
|
|
const subDirOther = await root.getDirectoryHandle("subDirOther", allowCreate);
|
|
const subSubDir = await subDirOrig.getDirectoryHandle(
|
|
"subSubDir",
|
|
allowCreate
|
|
);
|
|
|
|
const testName = "testFile.json";
|
|
const testType = "application/json";
|
|
|
|
async function checkMove(newName, newType) {
|
|
const fileHandle = await subSubDir.getFileHandle(newName, allowCreate);
|
|
|
|
Assert.equal(fileHandle.name, newName, "Has filename changed?");
|
|
{
|
|
const fileObject = await fileHandle.getFile();
|
|
Assert.equal(fileObject.name, newName, "Is the fileobject renamed?");
|
|
Assert.equal(fileObject.type, newType, "Is the fileobject type updated?");
|
|
}
|
|
}
|
|
|
|
async function restoreTest() {
|
|
await subSubDir.move(subDirOrig, "subSubDir");
|
|
await checkMove(oldName, oldType);
|
|
}
|
|
|
|
await checkMove(oldName, oldType);
|
|
|
|
// No name change
|
|
await subSubDir.move(subDirOther, "other");
|
|
await checkMove(oldName, oldType);
|
|
await restoreTest();
|
|
|
|
// With name change
|
|
|
|
async function testDirMoveCall(...combo) {
|
|
await subSubDir.move(...combo);
|
|
await checkMove(testName, testType);
|
|
await restoreTest();
|
|
}
|
|
|
|
await testDirMoveCall(subDirOther);
|
|
await testDirMoveCall(subDirOther, testName);
|
|
await testDirMoveCall(subDirOrig, testName);
|
|
await testDirMoveCall(subDirOrig);
|
|
};
|
|
|
|
for (const [key, value] of Object.entries(exported_symbols)) {
|
|
Object.defineProperty(value, "name", {
|
|
value: key,
|
|
writable: false,
|
|
});
|
|
}
|