- From: Darin Fisher <darin@chromium.org>
- Date: Wed, 28 Apr 2010 12:45:24 -0700
- To: Michael Nordman <michaeln@google.com>
- Cc: Jonas Sicking <jonas@sicking.cc>, Web Applications Working Group WG <public-webapps@w3.org>
- Message-ID: <q2zbd8f24d21004281245x58e38a93n615b5124da8d4385@mail.gmail.com>
On Wed, Apr 28, 2010 at 11:57 AM, Michael Nordman <michaeln@google.com>wrote: > > > On Wed, Apr 28, 2010 at 11:21 AM, Jonas Sicking <jonas@sicking.cc> wrote: > >> Ugh, sent this originally to just Darin. Resending to the list. >> >> On Wed, Apr 28, 2010 at 10:11 AM, Darin Fisher <darin@chromium.org> >> wrote: >> > On Tue, Apr 27, 2010 at 2:04 PM, Jonas Sicking <jonas@sicking.cc> >> wrote: >> >> >> >> On Tue, Apr 27, 2010 at 1:59 PM, Darin Fisher <darin@chromium.org> >> wrote: >> >> > On Tue, Apr 27, 2010 at 1:33 PM, Jonas Sicking <jonas@sicking.cc> >> wrote: >> >> >> >> >> >> On Tue, Apr 27, 2010 at 1:26 PM, Darin Fisher <darin@chromium.org> >> >> >> wrote: >> >> >> >> It would be nice to be able to allow streaming such that every >> time >> >> >> >> a >> >> >> >> progress event is fired only the newly downloaded data is >> available. >> >> >> >> The UA is then free to throw away that data once the event is >> done >> >> >> >> firing. This would be useful in the cases when the page is able >> to >> >> >> >> do >> >> >> >> incremental parsing of the resulting document. >> >> >> >> >> >> >> >> If we add a 'load mode' flag on XMLHttpRequest, which can't be >> >> >> >> modified after send() is called, then streaming to a Blob could >> >> >> >> simply >> >> >> >> be another enum value for such a flag. >> >> >> >> >> >> >> >> There is still the problem of how the actual blob works. I.e. >> does >> >> >> >> .responseBlob return a new blob every time more data is returned? >> Or >> >> >> >> should the same Blob be constantly modifying? If modifying, what >> >> >> >> happens to any in-progress reads when the file is modified? Or do >> >> >> >> you >> >> >> >> just make the Blob available once the whole resource has been >> >> >> >> downloaded? >> >> >> >> >> >> >> > >> >> >> > >> >> >> > This is why I suggested using FileWriter. FileWriter already has >> to >> >> >> > deal with >> >> >> > most of the problems you mentioned above, >> >> >> >> >> >> Actually, as far as I can tell FileWriter is write-only so it >> doesn't >> >> >> deal with any of the problems above. >> >> > >> >> > When you use createWriter, you are creating a FileWriter to an >> existing >> >> > File. >> >> > The user could attempt to create a FileReader to the very same File >> >> > while >> >> > a FileWriter is open to it. >> >> > It is true that for <input type=saveas> there is no way to get at the >> >> > underlying >> >> > File object. That is perhaps a good thing for the use case of >> >> > downloading >> >> > to >> >> > a location specified by the user. >> >> >> >> Ah. But as far as I can tell (and remember), it's still fairly >> >> undefined what happens when the OS file under a File/Blob object is >> >> mutated. >> >> >> >> / Jonas >> > >> > Agreed. I don't see it as a big problem. Do you? The application >> > developer is >> > in control. They get to specify the output file (via FileWriter) that >> XHR >> > sends its >> > output to, and they get to know when XHR is done writing. So, the >> > application >> > developer can avoid reading from the file until XHR is done writing. >> >> Well, it seems like a bigger deal here since the file is being >> constantly modified as we're downloading data into it, no? So for >> example if you grab a File object after the first progress event, what >> does that File object contain after the second? Does it contain the >> whole file, including the newly downloaded data? Or does it contain >> only the data after the first progress event? Or is the File object >> now invalid and can't be used? >> > > What gears did about that was to provide a 'snapshot' of the > downloaded data each time responseBlob was called, with > the 'snapshot' being consistent with the progress events > having been seen by the caller. The 'snapshot' would remain > valid until discarded by the caller. Each snapshot just provided > a view onto the same data which maybe was in memory or > maybe had spilled over to disk unbeknownst to the caller. > > >> >> I'm also still unsure that a FileWriter is what you want generally. If >> you're just downloading temporary data, but data that happens to be so >> large that you don't want to keep it in memory, you don't want to >> bother the user asking for a location for that temporary file. Nor do >> you want that file to be around once the user leaves the page. >> > > I think the point about not requiring the caller to manage the 'file' are > important. > > >> Sure, if the use case is actually downloading and saving a file for >> the user to use, rather than for the page to use, then a FileWriter >> seems like it would work. I.e. if you want something like >> "Content-Disposition: attachment", but where you can specify request >> headers. Is that the use case? >> > > Mods to xhr to access the response more opaquely is a fairly general > feature request. One specific use case is to download a resource via xhr > and then save the results in a sandboxed file system. So "for the page to > use". > ^^^ That is the use case I'm primarily interested in. I think it would be beneficial if downloading to disk was not rate-limited by routing chunks through JS. I don't care as much about downloading to a user specified location, but I think that's an interesting use case as well. XHR gives the app more flexibility (custom headers, cross-origin, etc.), and FileWriter allows the app to "save as" URLs that do not have a C-D header that forces a download. > > The notion of having a streaming interface on xhr is interesting. That with > a > BlobBuilder capability could work. If a streaming xhr mode provided new > data in the form of 'blobs' where each blob was just the newly received > data, > the caller could use a BlobBuilder instance to concatenate the set of > received > data blobs. And then take blobBuilder.getBlob() and do what they will with > it. xhr.ondatareceived = function (data) { builder.appendBlob(data); } > > ^^^ I like that proposal for streaming. -Darin
Received on Wednesday, 28 April 2010 19:45:55 UTC