diff --git a/content/html/content/src/nsHTMLOptionElement.cpp b/content/html/content/src/nsHTMLOptionElement.cpp index 2c966a209dd1..13c788b29bb3 100644 --- a/content/html/content/src/nsHTMLOptionElement.cpp +++ b/content/html/content/src/nsHTMLOptionElement.cpp @@ -91,6 +91,7 @@ public: NS_IMETHOD GetDefaultSelected(PRBool* aDefaultSelected); NS_IMETHOD SetDefaultSelected(PRBool aDefaultSelected); NS_IMETHOD GetText(nsString& aText); + NS_IMETHOD SetText(const nsString& aText); NS_IMETHOD GetIndex(PRInt32* aIndex); NS_IMETHOD SetIndex(PRInt32 aIndex); NS_IMETHOD GetDisabled(PRBool* aDisabled); @@ -431,6 +432,8 @@ nsHTMLOptionElement::GetMappedAttributeImpact(const nsIAtom* aAttribute, { if (aAttribute == nsHTMLAtoms::label) { aHint = NS_STYLE_HINT_REFLOW; + } else if (aAttribute == nsHTMLAtoms::text) { + aHint = NS_STYLE_HINT_REFLOW; } else if (! nsGenericHTMLElement::GetCommonMappedAttributesImpact(aAttribute, aHint)) { aHint = NS_STYLE_HINT_CONTENT; } @@ -493,7 +496,70 @@ nsHTMLOptionElement::GetText(nsString& aText) NS_RELEASE(node); } } - return NS_OK; + return rv; +} + +NS_IMETHODIMP +nsHTMLOptionElement::SetText(const nsString& aText) +{ + PRInt32 numNodes; + PRBool usedExistingTextNode = PR_FALSE; // Do we need to create a text node? + nsresult result = mInner.ChildCount(numNodes); + if (NS_FAILED(result)) { + return result; + } + nsIDOMText* domText = nsnull; + for (PRInt32 i = 0; i < numNodes; i++) { + nsIContent* node; + result = ChildAt(i, node); + if (NS_SUCCEEDED(result)) { + result = node->QueryInterface(kIDOMTextIID, (void**)&domText); + if (NS_SUCCEEDED(result) && domText) { + result = domText->SetData(aText); + if (NS_SUCCEEDED(result)) usedExistingTextNode = PR_TRUE; + NS_RELEASE(domText); + NS_RELEASE(node); + break; + } + NS_RELEASE(node); + } + } + if (!usedExistingTextNode) { + nsIContent* text; + result = NS_NewTextNode(&text); + if (NS_OK == result) { + nsIDOMText* domtext; + result = text->QueryInterface(kIDOMTextIID, (void**)&tc); + if (NS_OK == result) { + result = domtext->SetData(aText); + if (NS_SUCCEEDED(result)) { + result = AppendChildTo(text, PR_FALSE); + if (NS_SUCCEEDED(result)) { + nsIDocument * doc; + result = GetDocument(doc); + if (NS_SUCCEEDED(result)) { + text->SetDocument(doc, PR_FALSE); + NS_IF_RELEASE(doc); + } + } + } + NS_RELEASE(domtext); + } + NS_RELEASE(text); + } + } + if (NS_SUCCEEDED(result)) { + nsIFormControlFrame* fcFrame = nsnull; + result = GetPrimaryFrame(fcFrame); + if (NS_SUCCEEDED(result) && (nsnull != fcFrame)) { + nsIComboboxControlFrame* selectFrame = nsnull; + result = fcFrame->QueryInterface(nsIComboboxControlFrame::GetIID(),(void **) &selectFrame); + if (NS_SUCCEEDED(result) && (nsnull != selectFrame)) { + selectFrame->UpdateSelection(PR_FALSE, PR_TRUE, 0); + } + } + } + return result; } // Options don't have frames - get the select content node diff --git a/layout/html/content/src/nsHTMLOptionElement.cpp b/layout/html/content/src/nsHTMLOptionElement.cpp index 2c966a209dd1..13c788b29bb3 100644 --- a/layout/html/content/src/nsHTMLOptionElement.cpp +++ b/layout/html/content/src/nsHTMLOptionElement.cpp @@ -91,6 +91,7 @@ public: NS_IMETHOD GetDefaultSelected(PRBool* aDefaultSelected); NS_IMETHOD SetDefaultSelected(PRBool aDefaultSelected); NS_IMETHOD GetText(nsString& aText); + NS_IMETHOD SetText(const nsString& aText); NS_IMETHOD GetIndex(PRInt32* aIndex); NS_IMETHOD SetIndex(PRInt32 aIndex); NS_IMETHOD GetDisabled(PRBool* aDisabled); @@ -431,6 +432,8 @@ nsHTMLOptionElement::GetMappedAttributeImpact(const nsIAtom* aAttribute, { if (aAttribute == nsHTMLAtoms::label) { aHint = NS_STYLE_HINT_REFLOW; + } else if (aAttribute == nsHTMLAtoms::text) { + aHint = NS_STYLE_HINT_REFLOW; } else if (! nsGenericHTMLElement::GetCommonMappedAttributesImpact(aAttribute, aHint)) { aHint = NS_STYLE_HINT_CONTENT; } @@ -493,7 +496,70 @@ nsHTMLOptionElement::GetText(nsString& aText) NS_RELEASE(node); } } - return NS_OK; + return rv; +} + +NS_IMETHODIMP +nsHTMLOptionElement::SetText(const nsString& aText) +{ + PRInt32 numNodes; + PRBool usedExistingTextNode = PR_FALSE; // Do we need to create a text node? + nsresult result = mInner.ChildCount(numNodes); + if (NS_FAILED(result)) { + return result; + } + nsIDOMText* domText = nsnull; + for (PRInt32 i = 0; i < numNodes; i++) { + nsIContent* node; + result = ChildAt(i, node); + if (NS_SUCCEEDED(result)) { + result = node->QueryInterface(kIDOMTextIID, (void**)&domText); + if (NS_SUCCEEDED(result) && domText) { + result = domText->SetData(aText); + if (NS_SUCCEEDED(result)) usedExistingTextNode = PR_TRUE; + NS_RELEASE(domText); + NS_RELEASE(node); + break; + } + NS_RELEASE(node); + } + } + if (!usedExistingTextNode) { + nsIContent* text; + result = NS_NewTextNode(&text); + if (NS_OK == result) { + nsIDOMText* domtext; + result = text->QueryInterface(kIDOMTextIID, (void**)&tc); + if (NS_OK == result) { + result = domtext->SetData(aText); + if (NS_SUCCEEDED(result)) { + result = AppendChildTo(text, PR_FALSE); + if (NS_SUCCEEDED(result)) { + nsIDocument * doc; + result = GetDocument(doc); + if (NS_SUCCEEDED(result)) { + text->SetDocument(doc, PR_FALSE); + NS_IF_RELEASE(doc); + } + } + } + NS_RELEASE(domtext); + } + NS_RELEASE(text); + } + } + if (NS_SUCCEEDED(result)) { + nsIFormControlFrame* fcFrame = nsnull; + result = GetPrimaryFrame(fcFrame); + if (NS_SUCCEEDED(result) && (nsnull != fcFrame)) { + nsIComboboxControlFrame* selectFrame = nsnull; + result = fcFrame->QueryInterface(nsIComboboxControlFrame::GetIID(),(void **) &selectFrame); + if (NS_SUCCEEDED(result) && (nsnull != selectFrame)) { + selectFrame->UpdateSelection(PR_FALSE, PR_TRUE, 0); + } + } + } + return result; } // Options don't have frames - get the select content node