Closed Bug 278207 Opened 20 years ago Closed 20 years ago

select only writes one of multiple selected values to instance data

Categories

(Core Graveyard :: XForms, defect)

defect
Not set
normal

Tracking

(Not tracked)

RESOLVED FIXED

People

(Reporter: allan, Assigned: aaronr)

References

()

Details

Attachments

(2 files, 5 obsolete files)

If I select multiple items in a select, it should write the values to the bound
instance node space seperated. It does not, it only writes one of them.
Attached file testcase
Try selecting both "Chocolate" and "Vanilla" and hit Refresh.
Attached patch proposed fix (obsolete) — Splinter Review
Here is a proposed fix.  Basically if I detect that there is already a value in
the instance data node, I append each item's value to that value (having zero'd
out the node before starting).	I also moved all of the event dispatching
(recalc, etc.) out to nsXFormsSelectElement::Refresh so that we only do it
once.
Attachment #172860 - Flags: review?(allan)
Status: NEW → ASSIGNED
Comment on attachment 172860 [details] [diff] [review]
proposed fix

1) The patch is out of date with the current tree

2) Your approach lets each item element check the instance data node, append a
new value, and change the instance node. How about parsing a nsAString to
writeSelectedItems() and let nsXFormsSelectElement write the instance data
once?
Attachment #172860 - Flags: review?(allan) → review-
Attached patch second attempt (obsolete) — Splinter Review
incorporates Allan's comments
Attachment #172860 - Attachment is obsolete: true
Attachment #172924 - Flags: review?(allan)
Attachment #172924 - Flags: review?(allan)
Attached patch updated patch (obsolete) — Splinter Review
updated patch.	Chaged so that we call model.SetNodeValue on mBoundNode instead
of the text node otherwise we'll have errors in model->ValidateNode.
Attachment #172924 - Attachment is obsolete: true
Attachment #172926 - Flags: review?(allan)
Comment on attachment 172926 [details] [diff] [review]
updated patch

forgot to run dos2unix against it
Attachment #172926 - Flags: review?(allan)
removed windows line endings
Attachment #172926 - Attachment is obsolete: true
Attachment #172932 - Flags: review?(allan)
Comment on attachment 172932 [details] [diff] [review]
updated patch with windows line endings removed

>+++ nsIXFormsSelectChild.idl	31 Jan 2005 06:52:14 -0000
...
>-  void writeSelectedItems(in nsIDOMNode container);
>+  void writeSelectedItems(in nsIDOMNode container, out AString stringBuffer);

1) You do not use container anywhere do you?
2) stringBuffer is "inout".

>-nsXFormsChoicesElement::WriteSelectedItems(nsIDOMNode *aContainer)
>+nsXFormsChoicesElement::WriteSelectedItems(nsIDOMNode *aContainer, 
>+                                           nsAString  &stringBuffer)

aStringBuffer

>+++ nsXFormsItemElement.cpp	31 Jan 2005 06:52:17 -0000
...
>-nsXFormsItemElement::WriteSelectedItems(nsIDOMNode *aContainer)
>+nsXFormsItemElement::WriteSelectedItems(nsIDOMNode *aContainer, 
>+                                        nsAString  &stringBuffer)

aStringBuffer

>+++ nsXFormsItemSetElement.cpp	31 Jan 2005 06:52:18 -0000
...
>-nsXFormsItemSetElement::WriteSelectedItems(nsIDOMNode *aContainer)
>+nsXFormsItemSetElement::WriteSelectedItems(nsIDOMNode *aContainer, 
>+                                           nsAString  &stringBuffer)

aStringBuffer

>--- nsXFormsSelectElement.cpp	29 Jan 2005 11:37:33 -0000	1.6
...
>+#include "nsIDOMText.h"

Where do you use this?

>+    nsXFormsUtils::SetNodeValue(mBoundNode, NS_LITERAL_STRING(""));

No need for this if container parameter is not used.

>+
>+    nsCOMPtr<nsIModelElementPrivate> model = 
>+                                        nsXFormsUtils::GetModel(mElement, 0);

model is saved in nsXFormsControlStub now, as mModel. So just add '|| !mModel'
to the previous mBoundNode check, and use mModel.

Besides from the above minor issues, it "works-for-me", so with the above fixed
r=me.

What does not work though, is selecting no elements. If you use the testcase,
and deselect everything the input field is not cleared, but that's not an issue
with this bug, so bug 280504 created.
Attachment #172932 - Flags: review?(allan) → review+
>>+++ nsIXFormsSelectChild.idl		 31 Jan 2005 06:52:14 -0000
>...
>>-  void writeSelectedItems(in nsIDOMNode container);
>>+  void writeSelectedItems(in nsIDOMNode container, out AString
stringBuffer);
>
>1) You do not use container anywhere do you?
>2) stringBuffer is "inout".

1) I don't use container.  Yet.  I don't really know exactly what this will
look like once have have itemset selection working.  I think a whole nodeset
will have to be copied into the container.  I'll leave it for now and remove it
when the itemset bug is fixed if we don't need it (bug 278277).
2) AString can't be used as an inout.  Gets an error message as inout

Fixed other suggestions.
Attachment #172932 - Attachment is obsolete: true
Attachment #172944 - Flags: superreview?(bryner)
Comment on attachment 172944 [details] [diff] [review]
update with Allan's last comments

Heh, oops.  I'd intended that a selected item would append itself to the text
node child of the bound node, not overwrite it.  However, your approach is
better because it does less work for each selected item and also fixes the case
where we're bound to an attribute node instead of an element node.  Comments
below:

>--- nsIXFormsSelectChild.idl	15 Jan 2005 01:04:02 -0000	1.2
>+++ nsIXFormsSelectChild.idl	31 Jan 2005 11:32:02 -0000
>-  void writeSelectedItems(in nsIDOMNode container);
>+  void writeSelectedItems(in nsIDOMNode container, out AString stringBuffer);

Just a little IDL nitpicking... I'd prefer:

  AString writeSelectedItems(in nsIDOMNode container);


>--- nsXFormsSelectElement.cpp	29 Jan 2005 11:37:33 -0000	1.6
>+++ nsXFormsSelectElement.cpp	31 Jan 2005 11:32:09 -0000
>+    // clear out whatever was in the instance data before.  
>+    // We'll fill it below.
>+    nsXFormsUtils::SetNodeValue(mBoundNode, NS_LITERAL_STRING(""));

Use EmptyString() instead of NS_LITERAL_STRING(""), it's a bit cheaper.

>+    nsString stringBuffer;

Use an nsAutoString here, that will avoid doing any heap allocation if the data
is less than 64 bytes.

>+      rv = nsXFormsUtils::DispatchEvent(modelNode, eEvent_Recalculate);
>+      NS_ENSURE_SUCCESS(rv, rv);

One consequence of bailing on an error return here is that (I believe) if a
script handler for the "recalculate" event causes a JS exception, you will get
an error return here and not do the revalidate and refresh.  Is that what we
want?
(In reply to comment #10)
> >--- nsIXFormsSelectChild.idl	15 Jan 2005 01:04:02 -0000	1.2
> >+++ nsIXFormsSelectChild.idl	31 Jan 2005 11:32:02 -0000
> >-  void writeSelectedItems(in nsIDOMNode container);
> >+  void writeSelectedItems(in nsIDOMNode container, out AString stringBuffer);
> 
> Just a little IDL nitpicking... I'd prefer:
> 
>   AString writeSelectedItems(in nsIDOMNode container);
> 

Actually, disregard that.  What you have is fine, given that |inout| doesn't work.
Comment on attachment 172944 [details] [diff] [review]
update with Allan's last comments

new patch coming
Attachment #172944 - Flags: superreview?(bryner)
took Brian's suggestions except:

He second guessed the .idl change since it really is no difference.
We are still going to bail if the rv is no good.  Brian doesn't think that the
default handler will run if a script handler returns has an exception, so if
the default handler doesn't run, no sense doing the revalidate and refresh.

This patch also contains the fix I mentioned for 280504
Attachment #172944 - Attachment is obsolete: true
Attachment #173032 - Flags: superreview?(bryner)
*** Bug 280504 has been marked as a duplicate of this bug. ***
Attachment #173032 - Flags: superreview?(bryner) → superreview+
checked in
Status: ASSIGNED → RESOLVED
Closed: 20 years ago
Resolution: --- → FIXED
Product: Core → Core Graveyard
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: