Open Bug 251273 Opened 20 years ago Updated 2 years ago

Better attribute persistence

Categories

(Core :: XUL, defect)

defect

Tracking

()

People

(Reporter: bugs, Unassigned)

References

(Depends on 3 open bugs)

Details

In order to do a number of features and fix certain bugs (see bug 215489 for
example) we need some more control over how attributes are saved and restored
from localstore. Here's a table showing different events/methods and what we
think should happen:

Event              | Function               | DS Operation
-------------------+------------------------+-------------------
Document Load      | Attrs Restored FROM DS | READ
Insertion          | Attrs Restored FROM DS | READ
setAttr("persist") | Attrs Saved    TO   DS | WRITE
setAttr(attr)      | Attr  Saved    TO   DS | WRITE
.persist(id, attr) | Attr  Saved    TO   DS | WRITE
.restore(id, attr) | Attr  Restored FROM DS | READ

It was metioned persist/restore could take 'null' or empty string as the second
parameter and use that as an indication to save/restore all attributes. 

We may not need .restore, but its functionality is mentioned here, in case it is
ever needed.
congratulations on your purchase of bug 251273, when used correctly it will give
you many hours of enjoyment. 
Assignee: nobody → firefox
(In reply to comment #0)
> Event              | Function               | DS Operation
> -------------------+------------------------+-------------------
> Document Load      | Attrs Restored FROM DS | READ
> setAttr(attr)      | Attr  Saved    TO   DS | WRITE
> .persist(id, attr) | Attr  Saved    TO   DS | WRITE

The above three currently exist.

> Insertion          | Attrs Restored FROM DS | READ
> setAttr("persist") | Attrs Saved    TO   DS | WRITE

These two should be made to work.

> .restore(id, attr) | Attr  Restored FROM DS | READ

This may be nice to have, but I can't think of a use case.
Btw, there's a bug in setAttr(attr) where the attribute name will match if it's
a substring of an ID in the persist attribute's value, e.g.

  <element id="foo" persist="abc" abc="10" b="0"/>

  getElementById("foo").setAttribute("b", "1");

This will cause attribute "b" to get persisted.
Brendan said we need numbered issues. Let's try this:

Issue I: Persisted attributes aren't restored for dynamically inserted content.

Issue II: There are two bugs in setAttr(attr). a) Attributes whose names are
substrings of persisted attributes also get persisted. b) setting the "persist"
attribute should persist all attributes mentioned in case of addition.

Issue III: Another thing we were discussing was whether or not to filter when
restoring from localstore.

Say you have v1.0 of your doc and you persist e.g. the "hidden" attribute of
some element. Then in v1.5 you don't want to let that element be hidden anymore.
If it was hidden before the user upgraded, now it'll still be hidden, even
though "hidden" isn't listed in your "persist" attribute any longer. So you have
to add code to your onload method (probably from a timeout, even) to deal with
this upgrade scenario. And there's no way to remove it from the localstore.
Suckage. Wouldn't it be nice if you could specify which attributes you want
restored from localstore?

There are several things we could do to solve this problem.

1) Break backward compatibility and just filter on what's in the persist attribute.

   a) This means we now do have a need for .restore(id, attr) since we'd need a
way to restore things that were persisted with .persist() and aren't in
persist="..."

   b) Or we add a restore="..." attribute that lists the extra/dynamic
attributes we want restored.

2) Keep backward compatibility by only filtering when some other attribute exists.

   a) restorefilter="true". This additionally requires (1a) or (1b) to restore
extra/dynamic attributes.

   b) restore="attr1,attr2". We could make this the full list, or, to avoid
duplication, specify that it'll automatically include the attributes listed in
persist="...", so in most cases it'd end up restore="", and occassionally
restore="dynamicAttr".
II.a from comment 4 is reported as bug 231333.

Issue III is reported in bug 231334.

Another (major imo) issue is bug 15232, which makes things like <button hidden="true" persist="hidden"/> not work.
Depends on: 231333, 231334
Depends on: 15232, 115296
Assignee: bross2 → nobody
QA Contact: xptoolkit.xul
Component: XP Toolkit/Widgets: XUL → XUL
QA Contact: xptoolkit.xul → xptoolkit.widgets
Severity: normal → S3
You need to log in before you can comment on or make changes to this bug.