diff --git a/mozilla/extensions/xforms/nsIXFormsSelectChild.idl b/mozilla/extensions/xforms/nsIXFormsSelectChild.idl index a50f2f9a871..72a9772d8dd 100644 --- a/mozilla/extensions/xforms/nsIXFormsSelectChild.idl +++ b/mozilla/extensions/xforms/nsIXFormsSelectChild.idl @@ -77,13 +77,13 @@ interface nsIXFormsSelectChild : nsISupports void selectItemsByContent(in nsIDOMNode node); /** - * Instructs the item to serialize its selected elements into |container|. + * Instructs the item to serialize its selected elements. * For children that have a value child, they should append the value of - * any selected items to the text node child of |container|. For children + * any selected items to the provided string buffer. For children * that have a copy child, they should copy the instance data element into * |container|. */ - void writeSelectedItems(in nsIDOMNode container); + void writeSelectedItems(in nsIDOMNode container, out AString stringBuffer); /** * Set the context node, position, and size to be used for XPath evaluation. diff --git a/mozilla/extensions/xforms/nsXFormsChoicesElement.cpp b/mozilla/extensions/xforms/nsXFormsChoicesElement.cpp index 724c3af1f7e..2908616cbfd 100644 --- a/mozilla/extensions/xforms/nsXFormsChoicesElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsChoicesElement.cpp @@ -282,7 +282,8 @@ nsXFormsChoicesElement::SelectItemsByContent(nsIDOMNode *aNode) } NS_IMETHODIMP -nsXFormsChoicesElement::WriteSelectedItems(nsIDOMNode *aContainer) +nsXFormsChoicesElement::WriteSelectedItems(nsIDOMNode *aContainer, + nsAString &aStringBuffer) { nsCOMPtr children; nsresult rv = mElement->GetChildNodes(getter_AddRefs(children)); @@ -298,7 +299,7 @@ nsXFormsChoicesElement::WriteSelectedItems(nsIDOMNode *aContainer) children->Item(i, getter_AddRefs(childNode)); childItem = do_QueryInterface(childNode); if (childItem) { - childItem->WriteSelectedItems(aContainer); + childItem->WriteSelectedItems(aContainer, aStringBuffer); } } diff --git a/mozilla/extensions/xforms/nsXFormsItemElement.cpp b/mozilla/extensions/xforms/nsXFormsItemElement.cpp index be66de23bb1..709d7de8848 100644 --- a/mozilla/extensions/xforms/nsXFormsItemElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsItemElement.cpp @@ -264,74 +264,23 @@ nsXFormsItemElement::SelectItemsByContent(nsIDOMNode *aNode) } NS_IMETHODIMP -nsXFormsItemElement::WriteSelectedItems(nsIDOMNode *aContainer) +nsXFormsItemElement::WriteSelectedItems(nsIDOMNode *aContainer, + nsAString &aStringBuffer) { PRBool selected; mOption->GetSelected(&selected); if (!selected) return NS_OK; - nsCOMPtr children; - nsresult rv = aContainer->GetChildNodes(getter_AddRefs(children)); - NS_ENSURE_SUCCESS(rv, rv); - - PRUint32 childCount; - children->GetLength(&childCount); - nsCOMPtr child, textNode; - - for (PRUint32 i = 0; i < childCount; ++i) { - children->Item(i, getter_AddRefs(child)); - - PRUint16 nodeType; - child->GetNodeType(&nodeType); - if (nodeType == nsIDOMNode::TEXT_NODE) { - textNode = child; - break; - } - } - - if (!textNode) { - // No text node, so make one. - nsCOMPtr doc; - aContainer->GetOwnerDocument(getter_AddRefs(doc)); - NS_ENSURE_TRUE(doc, NS_ERROR_FAILURE); - - nsCOMPtr text; - rv = doc->CreateTextNode(EmptyString(), getter_AddRefs(text)); - NS_ENSURE_SUCCESS(rv, rv); - - rv = aContainer->AppendChild(text, getter_AddRefs(child)); - NS_ENSURE_SUCCESS(rv, rv); - - textNode = text; - } - - NS_ASSERTION(textNode, "We should have a text node by now"); - nsAutoString value; - rv = GetValue(value); + nsresult rv = GetValue(value); NS_ENSURE_SUCCESS(rv, rv); - nsCOMPtr model = nsXFormsUtils::GetModel(mElement, - 0); - nsCOMPtr modelNode = do_QueryInterface(model); - NS_ENSURE_STATE(modelNode); - - /// @todo beaufour: The update code should probably not be here. - /// @see https://bugzilla.mozilla.org/show_bug.cgi?id=278207 - /// Wherever its final resting place might be, it should be shared - /// with the code in nsXFormsInputElement - - PRBool changed; - rv = model->SetNodeValue(textNode, value, &changed); - NS_ENSURE_SUCCESS(rv, rv); - if (changed) { - rv = nsXFormsUtils::DispatchEvent(modelNode, eEvent_Recalculate); - NS_ENSURE_SUCCESS(rv, rv); - rv = nsXFormsUtils::DispatchEvent(modelNode, eEvent_Revalidate); - NS_ENSURE_SUCCESS(rv, rv); - rv = nsXFormsUtils::DispatchEvent(modelNode, eEvent_Refresh); - NS_ENSURE_SUCCESS(rv, rv); + if(aStringBuffer.IsEmpty()){ + aStringBuffer.Append(value); + } + else{ + aStringBuffer.Append(NS_LITERAL_STRING(" ") + value); } return NS_OK; diff --git a/mozilla/extensions/xforms/nsXFormsItemSetElement.cpp b/mozilla/extensions/xforms/nsXFormsItemSetElement.cpp index 94637063595..7b668f211e6 100644 --- a/mozilla/extensions/xforms/nsXFormsItemSetElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsItemSetElement.cpp @@ -208,7 +208,8 @@ nsXFormsItemSetElement::SelectItemsByContent(nsIDOMNode *aNode) } NS_IMETHODIMP -nsXFormsItemSetElement::WriteSelectedItems(nsIDOMNode *aContainer) +nsXFormsItemSetElement::WriteSelectedItems(nsIDOMNode *aContainer, + nsAString &aStringBuffer) { return NS_OK; } diff --git a/mozilla/extensions/xforms/nsXFormsSelectElement.cpp b/mozilla/extensions/xforms/nsXFormsSelectElement.cpp index 23a9054d1e3..028f31cf9e4 100644 --- a/mozilla/extensions/xforms/nsXFormsSelectElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsSelectElement.cpp @@ -363,7 +363,7 @@ nsXFormsSelectElement::HandleEvent(nsIDOMEvent *aEvent) if ((isIncremental && type.EqualsLiteral("change")) || (!isIncremental && type.EqualsLiteral("blur"))) { - if (!mBoundNode) + if (!mBoundNode || !mModel) return NS_OK; // Update the instance data with our selected items. @@ -376,13 +376,34 @@ nsXFormsSelectElement::HandleEvent(nsIDOMEvent *aEvent) PRUint32 childCount; children->GetLength(&childCount); + nsAutoString stringBuffer; for (PRUint32 i = 0; i < childCount; ++i) { children->Item(i, getter_AddRefs(child)); childItem = do_QueryInterface(child); if (childItem) { - childItem->WriteSelectedItems(mBoundNode); + // This will go item by item, looking for selected nodes. For every + // selected option that it finds, it will append the option's value + // to the string buffer (for childItems that are not xforms:itemset's). + childItem->WriteSelectedItems(mBoundNode, stringBuffer); } } + + PRBool changed = PR_FALSE; + + rv = mModel->SetNodeValue(mBoundNode, stringBuffer, &changed); + NS_ENSURE_SUCCESS(rv, rv); + + if (changed) { + nsCOMPtr modelNode = do_QueryInterface(mModel); + NS_ENSURE_STATE(modelNode); + + rv = nsXFormsUtils::DispatchEvent(modelNode, eEvent_Recalculate); + NS_ENSURE_SUCCESS(rv, rv); + rv = nsXFormsUtils::DispatchEvent(modelNode, eEvent_Revalidate); + NS_ENSURE_SUCCESS(rv, rv); + rv = nsXFormsUtils::DispatchEvent(modelNode, eEvent_Refresh); + NS_ENSURE_SUCCESS(rv, rv); + } } return NS_OK;