- From: Jonas Sicking <jonas@sicking.cc>
- Date: Mon, 15 Jul 2013 15:57:14 -0700
- To: Eric U <ericu@google.com>
- Cc: Webapps WG <public-webapps@w3.org>
On Mon, Jul 15, 2013 at 2:42 PM, Eric U <ericu@google.com> wrote:
> 75% bikeshedding, 25% lessons learned:
>
> It seems inconsistent to have the API for recursion done differently
> in two different parts of the API: you've got two functions for
> enumerate/enumerateDeep but remove takes a parameter to be recursive.
> I don't have a strong preference between them, but I think you should
> only use one style.
Good point. I'll change it to remove and removeDeep for now. That also
avoids the "what is default" question.
Out of curiosity, has it been a problem for you that the
DirectoryEntry API doesn't have a non-recursive remove option?
Granted, you do have the ability to grab a sub-Entry and call .remove
on it. We didn't have that option since we didn't want to create an
equivalent of FileEntry.
> What's the purpose of DestinationDict? It seems redundant.
There's basically three potential ways to specify a copy/move destination:
Specify a new name within the current directory.
Specify a new directory but keep the current name.
Specify a new directory as well as a new name within that directory.
We obviously don't have to support them all, for example you could
imagine requiring a two-step process in some cases. But we decided to
try to support all three as a single operation for now.
Coming up with a syntax for this is somewhat tricky. In C++ you'd
simply have three overloads that take the different combinations, but
that doesn't feel very "javascripty".
Another is to use optional arguments like:
move(..., Directory? destDir, optional DOMString destName);
would work. That means that the three options would look like:
dir.move("srcfile", null, "newName");
dir.move("srcfile", destDir);
dir.move("srcfile", destDir, "newName");
Unfortunately the first one there looks pretty iffy. So instead we
went with a union which results in syntax like:
dir.move("srcfile", "newName");
dir.move("srcfile", destDir);
dir.move("srcfile", { dir: destDir. name: "newName" });
Another solution might be to only use dictionaries. Resulting in
dir.move("srcfile", { name: "newName" });
dir.move("srcfile", { dir: destDir });
dir.move("srcfile", { dir: destDir. name: "newName" });
I think I'd prefer to defer to TC39 about which option is best here.
I'll point this out explicitly when emailing public-script-coord.
> You have MakeFileOptions.overwriteIfExists for createFile, but
> CreateMode { createIfNeeded | dontcreate } for openWrite; it feels
> like those should share a set of flags. The options should probably
> be {createIfNeeded, dontCreate, failIfExists}, where failIfExists
> implies createIfNeeded and is the standard POSIX paradigm
> [O_CREAT|O_EXCL]. It's useful for coordination between multiple pages
> in the same origin, or the same page loaded twice.
So you're basically proposing (modulo naming):
createFile("name", { mode: "createIfNeeded" });
Creates the file if it doesn't exist. Overwrites it if it does.
createFile("name", { mode: "dontCreate" });
Error if the file doesn't exist. Overwrites it if it does.
createFile("name", { mode: "failIfExists" });
Creates the file if it doesn't exist. Error it if it does.
openWrite("name", "createIfNeeded");
Creates and opens the file if it doesn't exist. Opens it if it does.
openWrite("name", "dontCreate");
Error if the file doesn't exist. Opens it if it does.
openWrite("name", "failIfExists");
Creates and opens the file if it doesn't exist. Error it if it does.
Is this correct? While I agree it's consistent, the number of
combinations here is a bit mind boggling. It took me quite a while to
write all of these out and make sure they are correct. The
createFile("dontCreate") combination is especially confusing.
> If you don't allow ".." to traverse directories, please define using
> it as a path segment as an error, to allow for future expansion and to
> catch bugs for folks who didn't read the spec.
Definitely.
> openForWrite or openForWriting, while longer, would be clearer than
> openWrite. Heck, why not just "write"?
I tried out just "write" for a while, but it seemed strange that
myDir.write() actually started writing to a file.
> We've had folks ask for progress events on long move and copy calls.
> Think about network drive latencies, big SD cards being brought into
> the browser world, etc. It's especially important if you think you'll
> ever use this API outside the sandbox, and cheap to add now even if
> you won't. If you don't have it, people hack around it by
> reimplementing copy using write and createDirectory, and it's tedious
> and error-prone. In your case, you'll probably want them for
> createFile as well, since you can pass in a gigantic Blob or
> ArrayBuffer there.
Hmm.. Good points. For directory copy/move operations we couldn't
provide a total size, but we could still provide progress in the form
of total number number of bytes copied so far, as well as "currently
copying/moving file with name X".
/ Jonas
Received on Monday, 15 July 2013 22:58:11 UTC