On May 20, 2008, at 2:00 PM, Ian Hickson wrote:

On Mon, 19 May 2008, Maciej Stachowiak wrote:
On May 19, 2008, at 4:54 PM, Robert O'Callahan wrote:

If "storage.keyName = 'value';" can create a new storage item
(persistently), won't authors expect "delete storage.keyName;" to
remove it (persistently), as a matter of consistency?

If overloading "delete" is too quirky or too hard to implement, then
it seems none of the other shorthands should be allowed either.

Many objects in the DOM implement custom name getters (for instance
NodeList) and a few even implement custom name setters
(CSSStyleDeclaration, at least the way it is done in WebKit) but no one
has clamored for a custom deleter or expected delete to work "as a
matter of consistency" or been confused that "style.opacity = 0" is
allowed but "delete style.opacity" is not. So I would say the available
evidence argues against your conclusions.

The difference is that "style.opacity = 0" doesn't remove "opacity" from
the "style" object but "storage.removeItem('opacity')" _does_ remove
"opacity" from the "storage" object.

Yes, the analogy to storage.removeItem() would be style.removeProperty(). You can't do "delete style.opacity" instead of "style.removeProperty('opacity')" and as far as I can tell, no one has ever asked to be able to use delete on style, or been especially confused that they couldn't.

Originally, I wanted Storage objects to be indistinguishable from Object objects in JS, and native hash or collection objects in other bindings.
Conceptually, that's what these objects are -- native name/value pair
collections that happen to be mapped to non-volatile storage (or somewhat-
volatile storage, in the case of sessionStorage).

Normal objects don't fire DOM events when you change their properties (I imagine the same may be true of native hash objects in at least some languages), so the indistinguishability only goes so far.

I'd also like the "delete" operator to work on DOMStringMap (for the
dataset object -- calling 'delete' on that has the side-effect of removing
the underlying attribute) and UndoManager (where the side-effect is to
remove the entry and renumber the following entries, so maybe that's not
such a good idea after all), for what it's worth. If we want to decide
that we're not supporting this, we should decide that before
implementations of those come about.

Those both sound suboptimal to me. UndoManager because it remove more than the one item, and DOMStringMap because (a) you can't delete from NamedNodeMap to remove an attribute so it would be inconsistent and (b) removing an attribute causes a mutation event to fire and thus runs arbitrary code (creating the same problem of 'delete' running arbitrary code as Storage).

For DOMStringMap, my intention was to not provide methods at all, and only
provide the JS-native mechanisms.

A bold choice, but I would not recommend it as the sole available mechanism.

Regards,
Maciej



Reply via email to