On Jun 18, 2008, at 10:38 PM, Ian Hickson wrote:
It would be useful to get feedback from other implementors on this.
[...]
The API is designed in such a way that UAs can implement a lazy
commit
on the back end, but this should not be exposed to the author --
there
is no reason for the author to need to know whether the data is in
RAM, flash storage, disk storage, remote tape storage, or whatever.
There is clearly an advantage to expose this concept to authors --
just
like they need to know network can be slow so better use async XHR
rather than sync XHR -- storage operation can be very slow. Sync DOM
Storage operation is a potential hang point,
The idea is that the storage is asynchronous (and under the control
of the
UA), but that the API appears synchronous. That is, as soon as one
script
sets a storage item to a particular value, the setter will return
with no
latency, and all attempts from any frames to read that same storage
item
will give the new value back. It doesn't have to be stored to disk
immediately, however. Since this is a simple name/value text-only
API, it
is trivially cached in memory.
What's the use case for the event saying when the item actually hits
the
disk? Also, what would that actually mean? The "disk" could be up in
the
cloud (e.g. the user could have mounted an Amazon S3 service account
as a
local disk), in which case the Web browser really has no idea when the
bytes have hit the raw iron.
In WebKit we have implemented DOM Storage with a synchronous API, but
ahead-of-time read and lazy writeback, using something roughly like
the strategy Hixie describes. We don't have an event for when the data
has actually been written out to disk because we could not see a use
for it. We guarantee to store it unless the browser crashes, and we
show the new value to anyone accessing the storage, so it doesn't make
a differece.
Storage.begin()
Storage.commit()
In particular, these methods and the associated events should not be
provided to authors. The SQL database API is already capable of
handlign this. Authors who wish to have transactions are almost
certainly going to want other features too, such as types, database
schemas, etc.
If you insist on keeping these features, please do mark them as
Microsoft-proprietary by prefixing them with "ms" or some such, as
in,
"msBegin()", "msCommit()", etc, so that authors can clearly see that
these APIs are non-standard, and so that we don't have any conflicts
with future extensions to the API.
I have to disagree that customers who wants begin()/commit() should
use
SQL API. If the argument holds, why not simply get rid of DOM
Storage
feature completely since customer can just use SQL API?
This was considered, but there seemed to be a need for a middle ground
between cookies and a full SQL-like database. Also, the DOM Storage
sessionStorage feature has no analogy in the SQL Database API.
The features that distinguish the DOM Storage API from the SQL
Database
API are that the API appears synchronous, allowing much simpler
interaction between frames; that the API supports a sessionStorage
feature; and that the DOM Storage mechanism is significantly simpler
and
thus provides a much lower barrier to entry.
In WebKit we have both the Database Storage and DOM Storage APIs, and
we see them as complementary. Authors are interested in both for
different use cases. I do not think it makes sense to add transaction
support to the DOM Storage API.
This request come from one of our top customers when we discuss about
adoption of DOM Storage feature. They really want to make sure their
state is consistent without going through a lot of extra efforts.
Could you elaborate on the use cases?
It would also be interesting to hear from other browser vendors on
their
opinions on this.
I would recommend the Database Storage to anyone with a need for
strong transactional consistency guarantees. That being said, it
should not be possible for other windows to observe a different state
since script execution has to happen serially, so there should already
be weak consistency.
For instance, to cache an email, you would want to cache complete
headers (e.g. From, To, Subject, Sent) and body instead of only
part of
them.
For e-mail storage, you really want to use a database mechanism, not
the
name/value pairs. Using the DOM Storage API for e-mails is like
using a
paper bag as a shipping crate.
I agree on this one. I would not recommend using DOM Storage for
structured data with multiple interesting fields.
Regards,
Maciej