Closed
Bug 289361
Opened 19 years ago
Closed 19 years ago
Fix .checked initialization in checkbox ctor
Categories
(Toolkit :: UI Widgets, defect)
Tracking
()
RESOLVED
FIXED
People
(Reporter: bzbarsky, Assigned: bugs)
Details
(Keywords: fixed1.8, Whiteboard: [ETA 8/19])
Attachments
(4 files, 2 obsolete files)
352 bytes,
application/vnd.mozilla.xul+xml
|
Details | |
770 bytes,
application/vnd.mozilla.xul+xml
|
Details | |
6.55 KB,
patch
|
Details | Diff | Splinter Review | |
6.55 KB,
patch
|
mconnor
:
first-review+
brendan
:
approval1.8b4+
|
Details | Diff | Splinter Review |
Note that I can't find a component for bugs in toolkit's bindings, so this one will have to do. Bug 274712 changed toolkit checkboxes to have a "value" property that shadows (badly; for example the code in the constructor looks wrong) the "checked" property. It's not clear to me exactly why this was added. If the idea is that XUL widgets that want to participate in the preferences architecture need to expose some property for that architecture to read/write, then perhaps the property would be more appropriately called "prefValue"? And in this case it would be quite nice to actually document this little bit of API somewhere. Preferably both in the preference code and in our toolkit api documentation on Mozilla.org. If the property was added for some other reason, I'd be curious to know the reason. Here's hoping to hear from Ben. Requesting blocking, given that if this ends up as part of our toolkit in a release we won't be able to remove or change it without major pain in the future...
Reporter | ||
Comment 1•19 years ago
|
||
Of course it looks like I can't request blocking for the relevant milestone (1.1) here... :( Could we please fix the bugzilla Toolkit product to be usable? Please?
Flags: blocking1.8b2?
Comment 2•19 years ago
|
||
(poke timeless for bug 286830 and bug 287789 ;) )
Comment 3•19 years ago
|
||
Note: same applies to the colorpicker widget: http://bonsai.mozilla.org/cvsblame.cgi?file=mozilla/toolkit/content/widgets/colorpicker.xml#453
Reporter | ||
Comment 4•19 years ago
|
||
True (though the colorpicker doesn't have the constructor bizarreness checkbox does).
Assignee | ||
Comment 5•19 years ago
|
||
The rationale was to have a single property value that can be used to initialize a widget. "value" is used for pretty much all others for this purpose.
Reporter | ||
Comment 6•19 years ago
|
||
One problem is that for checkboxes in other markup languages (HTML comes to mind) the "value" property already exists and means something quite different. A second problem is the actual code (again, the code in the constructor looks bogus to me). Third problem is complete lack of documentation for this api change. I'm not really in the position of defining the toolkit api, but I'm assuming that bryner/bsmedberg/darin/ben/neil will sort out what the api they want to expose here is.
Comment 7•19 years ago
|
||
So we could consider this a freebie for Ben and move on, from now on following mconnor's write-up for toolkit changes, which requires review. But I'm tired of special pleading like that. Plus, since the rationale (pretty obvious, but good to hear in advance of the change, and get consensus) is now written down, it's worth a brief discussion. I made checkboxes and radiobuttons have a boolean checked property in 1995 when creating the DOM ("Level 0", thanks for labeling it without specifying it, w3c losers), not a value property, for two reasons: 1. As bz notes, and as the w3c codified in http://www.w3.org/TR/REC-DOM-Level-1/level-one-html.html#ID-011100101, value is the string content of the VALUE attribute associated with the input's NAME attribute's content, that's sent to the server when the form is submitted. 2. Because JS has dynamic types, a property's name is the one strong way to distinguish something that's boolean- from something that's string-valued. The value is coerced on assignment, so this seemed like a good idea to catch bugs or at least avoid confusion. #1 is decisive for HTML; #2 by itself is not hugely convincing. What Ben did for XUL (apart from any bugs in the constructor) makes input-tweaking JS code generic: no special cases for checkbox and radio type. That's cool. It's 2005 and the HTML 4 spec has been out for what, over 7 years. Is the generic-programming win Ben wanted good for all XUL consumers? Is it worth the difference from HTML, which could be confusing for XUL hackers recruited from among the ranks of web developers? Might we have to harmonize HTML and XUL in the future? Or is this something that should be done only for prefwindow? /be
Comment 8•19 years ago
|
||
(In reply to comment #7) > ... checkboxes and radiobuttons have a boolean checked property in 1995 when > creating the DOM ("Level 0", thanks for labeling it without specifying it, w3c > losers), .... So Hixie reminded me that I mostly meant to slam Netscape and MS losers on the DOM working group, really (and since I think highly of at least vidur, I shouldn't say "losers"), not the w3c leadership, which was doing what its members wanted. /be
Comment 9•19 years ago
|
||
My 2 cents: consistency with the HTML programming model is good in general, but I think it takes a back seat in this case as providing a generic way of assigning a value to a control seems like a good thing.
Reporter | ||
Comment 10•19 years ago
|
||
OK. What constitutes a "control" in XUL, and should all controls have a .value? For example, should the colorpicker widget have a .value? Currently it doesn't. Note that this isn't an argument for or against .value but rather a request that we, for once, spec out what our XUL language will look like and then implement instead of just implementing things in an ad-hoc manner.
Comment 11•19 years ago
|
||
that's a good point. i'd argue for more consistency here. perhaps we should move this discussion to the XUL wiki?
Reporter | ||
Comment 12•19 years ago
|
||
Fine by me. Should I open a new bug on the checkbox constructor?
Comment 13•19 years ago
|
||
Well... that, or maybe just morph this bug into fixing that problem?
Reporter | ||
Comment 14•19 years ago
|
||
Ben, whichever works best for you.
Assignee | ||
Comment 15•19 years ago
|
||
How is the ctor code bogus, given that the presentation is associated with checked="true" ? If a checkbox starts out in this state: <checkbox value="true"/> then at binding attached time it will not be checked unless the value is sync'ed. <colorpicker/> does not implement this because you pretty much never inline a colorpicker in a XUL dialog, but <colorpickerbutton/> does: http://lxr.mozilla.org/seamonkey/source/toolkit/content/widgets/colorpicker.xml#453
Reporter | ||
Comment 16•19 years ago
|
||
> How is the ctor code bogus The ctor code does: this.checked = this.value; This is getting the value property. The property getter is: 53 <property name="value" onset="return this.checked = val;" 54 onget="return this.checked;"/> So the constructor does |this.checked = this.checked|. That seems pretty pointless. All this theory aside, did you actually try the markup you suggest in comment 15? It doesn't work in current trunk Firefox (so with the code under discussion).
Reporter | ||
Comment 17•19 years ago
|
||
Reporter | ||
Comment 18•19 years ago
|
||
On a separate note, for the api discussion, if the idea is that the value _attribute_ (as opposed to just property) does something, then we have some more issues: <checkbox value="true" checked="false" /> <checkbox value="false" checked="true" /> Given those two DOM nodes, are they checked or not? What about the following two checkboxes (which look identical in the DOM, btw, so should be just like the two checkboxes above): <checkbox value="false" id="foo" /> <script>document.getElementById("foo").setAttribute("checked", "true")</script> <checkbox value="true" id="bar" /> <script>document.getElementById("bar").setAttribute("checked", "false")</script> What about: <checkbox id="persister" value="false" persist="value" /> What happens when the user checks this? What happens the next time the XUL document is loaded? (Hint: if implemented per comment 15, the checkbox will never be checked when the document loads.) Finally, what about existing XUL-based apps that happened to use the "value" attribute on a checkbox for storing something of their own? Sounds to me like they'd just break with no warning whatsoever.
Assignee | ||
Comment 19•19 years ago
|
||
Oh. Duh. Sorry. resummarizing.
Status: NEW → ASSIGNED
Summary: Rethink addition of "value" property to XUL checkboxes → Fix .checked initialization in checkbox ctor
Comment 20•19 years ago
|
||
This should get fixed sooner or later for 1.1. Flagging so it won't get lost. /be
Flags: blocking-aviary1.1? → blocking-aviary1.1+
Updated•19 years ago
|
Flags: blocking1.8b3?
Flags: blocking1.8b2?
Flags: blocking1.8b2-
Assignee | ||
Updated•19 years ago
|
Assignee: nobody → bugs
Status: ASSIGNED → NEW
Updated•19 years ago
|
Component: Preferences → XUL Widgets
Updated•19 years ago
|
Flags: blocking1.8b3? → blocking1.8b3+
Updated•19 years ago
|
Flags: blocking1.8b4+
Flags: blocking1.8b3-
Flags: blocking1.8b3+
Assignee | ||
Updated•19 years ago
|
Whiteboard: make this a beta blocker, not an alpha blocker
Updated•19 years ago
|
Whiteboard: make this a beta blocker, not an alpha blocker → [no l10n impact]
Assignee | ||
Updated•19 years ago
|
Whiteboard: [no l10n impact] → [no l10n impact] SWAG: 1d
Assignee | ||
Updated•19 years ago
|
Whiteboard: [no l10n impact] SWAG: 1d → [no l10n impact] ETA: 8/6
Assignee | ||
Updated•19 years ago
|
Whiteboard: [no l10n impact] ETA: 8/6 → [no l10n impact][1.8 Branch ETA 8/6]
Updated•19 years ago
|
Whiteboard: [no l10n impact][1.8 Branch ETA 8/6] → [no l10n impact][ETA 8/6]
Assignee | ||
Comment 21•19 years ago
|
||
Something like this better achieves what is desired - |.value|'s getter now returns the boolean value of its attribute equivalent, and if there is no such attribute returns |.checked|. Also, |setChecked| is updated to keep the value attribute/property combo sync'ed as the |.checked| property changes.
Attachment #193110 -
Flags: first-review?(bzbarsky)
Reporter | ||
Comment 22•19 years ago
|
||
Comment on attachment 193110 [details] [diff] [review] patch This still has issues because it can lead to issues when the checked and value properties have different values, no? And the various other issues I brought up in comment 18? Some are addressed, some are not. the last issue I raised I guess we're not planning to address, but I'd like to see the others addressed.
Attachment #193110 -
Flags: first-review?(bzbarsky) → first-review-
Updated•19 years ago
|
Whiteboard: [no l10n impact][ETA 8/6] → [ETA 8/19]
Assignee | ||
Comment 23•19 years ago
|
||
A more comprehensive approach. Like the previous patch, this makes sure "checked" and "value" attributes are set when |setChecked| is called. This patch makes a policy declaration - "value" is the real master of the checkbox's state. |.checked| looks at the "value" attribute first if present before relying on "checked". We then also add an DOMAttrModified event handler to handle attribute changes and sync state. I think the combination of these two things is really the best we can do to handle inconsistency between the attributes, but what do you think, Boris? I'll attach the combined test case file I've been working with after this.
Attachment #193110 -
Attachment is obsolete: true
Attachment #193197 -
Flags: first-review?(bzbarsky)
Assignee | ||
Comment 24•19 years ago
|
||
Reporter | ||
Comment 25•19 years ago
|
||
Comment on attachment 193197 [details] [diff] [review] more comprehensive I'd like a toolkit peer to OK the change from checked to value as the "primary" attribute, and I'd like to see some recursion protection in the handler or in setChecked (that is, attr changes triggered from setChecked should not reenter setChecked in a nontrivial way). But with those caveats, I guess this is the best we can do if we insist on having both attributes around.
Attachment #193197 -
Flags: second-review?(mconnor)
Attachment #193197 -
Flags: first-review?(bzbarsky)
Attachment #193197 -
Flags: first-review+
Comment 26•19 years ago
|
||
Do we really need to support a |value| attribute on checkboxes? The |value| property as a helper to simplify the preference code should be enough. Just leave it at that and keep the |checked| attribute and property to set a checkbox's state, no need IMO to introduce more code to try and keep these two attributes and properties in sync.
Updated•19 years ago
|
Whiteboard: [ETA 8/19] → [needs review mconnor][ETA 8/19]
Assignee | ||
Comment 27•19 years ago
|
||
You basically need a value attribute to allow the checkbox to be initialized this way before bindings have been attached. If the bug that attachedness is tied to frame construction is ever fixed, then this will not be necessary.
Assignee | ||
Comment 28•19 years ago
|
||
After some thought, I've decided it's much easier to do this entirely within the context of preferences than meddle with the apis for checkbox and colorpicker. The problem is that we need the value attribute for initialization prior to binding attachment because of the bug with bindings not being attached prior to frame construction. Rather than mess with the XUL api to work around other XUL bugs, this patch simply inserts some special cases into the preferences code (which is an implementation detail and thus effectively private) to work around. I still think a common state property is not a bad idea, but I'll pass on it for this release.
Attachment #193483 -
Flags: first-review?(mconnor)
Assignee | ||
Comment 29•19 years ago
|
||
After some thought, I've decided it's much easier to do this entirely within the context of preferences than meddle with the apis for checkbox and colorpicker. The problem is that we need the value attribute for initialization prior to binding attachment because of the bug with bindings not being attached prior to frame construction. Rather than mess with the XUL api to work around other XUL bugs, this patch simply inserts some special cases into the preferences code (which is an implementation detail and thus effectively private) to work around. I still think a common state property is not a bad idea, but I'll pass on it for this release.
Attachment #193197 -
Attachment is obsolete: true
Attachment #193484 -
Flags: first-review?(mconnor)
Assignee | ||
Updated•19 years ago
|
Attachment #193483 -
Flags: first-review?(mconnor)
Assignee | ||
Updated•19 years ago
|
Attachment #193197 -
Flags: second-review?(mconnor)
Assignee | ||
Comment 30•19 years ago
|
||
This patch rolls checkbox.xml back from v1.7 to v1.6, removes the "value" property from <colorpicker/> similarly, and introduces special handling in preferences.xml to handle checkbox and colorpicker widgets.
Updated•19 years ago
|
Attachment #193484 -
Flags: first-review?(mconnor) → first-review+
Assignee | ||
Updated•19 years ago
|
Attachment #193484 -
Flags: approval1.8b4?
Assignee | ||
Updated•19 years ago
|
Whiteboard: [needs review mconnor][ETA 8/19] → [ETA 8/19]
Comment 31•19 years ago
|
||
Comment on attachment 193484 [details] [diff] [review] patch a=me for 1.8b4/fx1.5. /be
Attachment #193484 -
Flags: approval1.8b4? → approval1.8b4+
Assignee | ||
Comment 32•19 years ago
|
||
landed on 1.8 br, waiting for a trunk tree to build before landing there...
Keywords: fixed1.8
Assignee | ||
Comment 33•19 years ago
|
||
fixed on the trunk too.
Status: NEW → RESOLVED
Closed: 19 years ago
Resolution: --- → FIXED
You need to log in
before you can comment on or make changes to this bug.
Description
•