I haven't had time to study Ian's proposal properly yet, sorry. But some easy comments:<br><br>On 9/20/07, <b class="gmail_sendername">Maciej Stachowiak</b> <<a href="mailto:mjs@apple.com">mjs@apple.com</a>> wrote:
<div><span class="gmail_quote"></span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">> Upgrader:<br>> Create a hidden browsing context.
<br>> Load the upgrader in it.<br><br>I don't like this whole upgrader idea. Parsing HTML and CSS and<br>executing JavaScript seems like an inefficient way to do an app<br>update. I think it is reasonable to require a manifest file for
<br>multipage apps, and writing an HTML/CSS/JS upgrader that can cover all<br>pages of a multipage app does not seem significantly easier than<br>creating a manifest file. The implicit manifest idea seems handy as a<br>quick way to handle one-page apps but it does not seem reasonable for
<br>the multipage case, and this would obviate the need for an upgrader.</blockquote><div><br>I totally agree with this.<br></div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
> Just before onload, fire an 'upgrading' event to every instance of a<br>>  top-level page using a cache with the same identifier.<br><br>Whether or not there are upgraders though, I think events should<br>
dispatch when a manifest-based upgrade either completes or fails (and<br>perhaps also when the upgrade starts).</blockquote><div><br>Agree... <br></div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
> The event has a handle to the Window object of the hidden browsing<br>>  context.<br>> After every 'upgrading' event has been fired, the 'load' event must be<br>>  fired on the upgrader.<br>> After that happens, if any of the aforementioned instances are still
<br>>  using old versions of the cache, then the user agent may inform user<br>>  they can reload to update.<br><br>I think it would be preferable to let the apps upgrade themselves<br>instead. They could choose to use 
location.reload() if they are not<br>holding any interesting state, or they could offer to save the user's<br>state before doing this, or they could make some alternate call that<br>requests all new resource loads for this instance should come from the
<br>freshly upgraded cache, which would let it perform an upgrade manually<br>preserving current state if feasible.</blockquote><div><br>Agree. <br></div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
> The Upgrader can do such things as updating the database schema<br>> between<br>> versions, and when there are multiple instances running, it allows<br>> them to<br>> negotiate who will do that work instead of it happening several times.
<br><br>I would suggest instead that the instance that triggered the upgrade<br>be given a special event so that it can do this and could optionally<br>present in-page UI while doing so. This seems simpler than adding a<br>
hidden browsing context. Changing the schema may require pausing other<br>instances, however, if there is no way to lock the database.</blockquote><div><br>Agree. <br></div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
> Modal alerts (window.alert, .prompt, etc) in the background page can<br>> either raise an exception, be ignored, drop a message to a console, or<br>> possibly display a message over the top of the foreground app's
<br>> browsing<br>> context.<br><br>To avoid such complexities it would be better to avoid the idea of a<br>hidden upgrader. And in-page UI could be more tasteful than prompts or<br>alerts.</blockquote><div><br>Agree. 
<br></div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">I'm not sure if an API to introspect what is currently in the cache is<br>
needed. I can't think of a use case off hand. But both the Google<br>Gears LocalServer API and the Mozilla offline API have this.</blockquote><div><br>Two different use cases:<br>-- If you can programmatically force URIs into the offline cache, then you want to be able to enumerate the resources in the offline cache, otherwise there is no way to reliably remove unneeded resources (especially if there was an older, buggy version of the app that may have loaded resources from unexpected URIs).
<br>-- Several Web app authors have asked for the ability to test whether a resource is cached, for their online apps. For example, when you're zooming in and out of a map, the application could choose which tile(s) to use for the animation by scaling them up or down. This would also be convenient for offline use, where a resource might not necessarily be in the offline cache but you could use it if it happened to be available.
<br></div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">A la the Google Gears API, I also think a feature is needed to do<br>something useful with <input type="file"> when offline, to save a
<br>resource for later upload to the server. Preferably this should not<br>require round-tripping the data through an ECMAScript string or number<br>array, or it will be too inefficient to work for large files.</blockquote>
<div><br>Actually we have an experimental API for this now. See here:<br><a href="http://mxr.mozilla.org/seamonkey/source/dom/public/idl/html/nsIDOMNSHTMLInputElement.idl#55">http://mxr.mozilla.org/seamonkey/source/dom/public/idl/html/nsIDOMNSHTMLInputElement.idl#55
</a><br><a href="http://mxr.mozilla.org/seamonkey/source/content/base/public/nsIDOMFileList.idl">http://mxr.mozilla.org/seamonkey/source/content/base/public/nsIDOMFileList.idl</a><br><a href="http://mxr.mozilla.org/seamonkey/source/content/base/public/nsIDOMFile.idl">
http://mxr.mozilla.org/seamonkey/source/content/base/public/nsIDOMFile.idl</a><br>The core is:<br><pre lang="en"><span class="line">  readonly attribute DOMString fileName;<br>  readonly attribute unsigned long long fileSize;
<br><br>  DOMString getAsText(in DOMString encoding);<br>                                  // raises(FileException) on retrieval<br>  DOMString getAsDataURL();<br>                                  // raises(FileException) on retrieval
<br>  DOMString getAsBinary();<br>                                  // raises(FileException) on retrieval</span><br></pre>These should be self-explanatory.<br></div><br>I guess this isn't great for really huge files, but multi-megabyte files should be OK on most machines, and it avoids having to deal with a client-writable "cache". It obviously has some interesting uses for online apps as well.
<br><br>Any thoughts on that?<br><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">I also don't see how apps that require login will be able to work
<br>offline. Do you need to make sure to check the appropriate "remember<br>me on this computer" checkbox (perhaps not desirable for the security-<br>conscious, and not available on all apps in any case)? Do you get to
<br>access the app when offline without having to go through login at all<br>(which seems like a security issue)?</blockquote><div><br>If your app is available offline then the data is stored locally, and there is no way to secure that data against a determined someone who has access to the user's browser profile, other than by encrypting all the application's private data with some password that the user has to provide. I'd rather have the OS encrypt the entire file system and protect that with the user's logon password, or if that's no good, the browser could encrypt its user profile data. Against casual data theft, the app can request a password, hash it, and check it against a stored password hash.
<br></div></div><br clear="all">Rob<br>-- <br>"Two men owed money to a certain moneylender. One owed him five hundred denarii, and the other fifty. Neither of them had the money to pay him back, so he canceled the debts of both. Now which of them will love him more?" Simon replied, "I suppose the one who had the bigger debt canceled." "You have judged correctly," Jesus said. [Luke 7:41-43]