зеркало из https://github.com/mozilla/gecko-dev.git
Fix writing multiple selected items to the instance data (bug 278207). Also fixes bug 280504. Patch by aaronr@us.ibm.com, r=allan@beaufour.dk, sr=me.
This commit is contained in:
Родитель
87401ae601
Коммит
9ad4cbaa75
|
@ -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.
|
||||
|
|
|
@ -282,7 +282,8 @@ nsXFormsChoicesElement::SelectItemsByContent(nsIDOMNode *aNode)
|
|||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsXFormsChoicesElement::WriteSelectedItems(nsIDOMNode *aContainer)
|
||||
nsXFormsChoicesElement::WriteSelectedItems(nsIDOMNode *aContainer,
|
||||
nsAString &aStringBuffer)
|
||||
{
|
||||
nsCOMPtr<nsIDOMNodeList> 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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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<nsIDOMNodeList> children;
|
||||
nsresult rv = aContainer->GetChildNodes(getter_AddRefs(children));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
PRUint32 childCount;
|
||||
children->GetLength(&childCount);
|
||||
nsCOMPtr<nsIDOMNode> 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<nsIDOMDocument> doc;
|
||||
aContainer->GetOwnerDocument(getter_AddRefs(doc));
|
||||
NS_ENSURE_TRUE(doc, NS_ERROR_FAILURE);
|
||||
|
||||
nsCOMPtr<nsIDOMText> 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<nsIModelElementPrivate> model = nsXFormsUtils::GetModel(mElement,
|
||||
0);
|
||||
nsCOMPtr<nsIDOMNode> 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;
|
||||
|
|
|
@ -208,7 +208,8 @@ nsXFormsItemSetElement::SelectItemsByContent(nsIDOMNode *aNode)
|
|||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsXFormsItemSetElement::WriteSelectedItems(nsIDOMNode *aContainer)
|
||||
nsXFormsItemSetElement::WriteSelectedItems(nsIDOMNode *aContainer,
|
||||
nsAString &aStringBuffer)
|
||||
{
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
|
@ -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<nsIDOMNode> 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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче