Bug 801486 - Skip script elements in HTMLOptionElement.prototype.text; r=bz

This commit is contained in:
Ms2ger 2012-10-21 09:38:40 +02:00
parent aa605cc8fc
commit b44db1c477
2 changed files with 55 additions and 2 deletions

View File

@ -260,7 +260,19 @@ NS_IMETHODIMP
nsHTMLOptionElement::GetText(nsAString& aText) nsHTMLOptionElement::GetText(nsAString& aText)
{ {
nsAutoString text; nsAutoString text;
nsContentUtils::GetNodeTextContent(this, true, text);
nsIContent* child = nsINode::GetFirstChild();
while (child) {
if (child->NodeType() == nsIDOMNode::TEXT_NODE ||
child->NodeType() == nsIDOMNode::CDATA_SECTION_NODE) {
child->AppendTextTo(text);
}
if (child->IsHTML(nsGkAtoms::script) || child->IsSVG(nsGkAtoms::script)) {
child = child->GetNextNonChildNode(this);
} else {
child = child->GetNextNode(this);
}
}
// XXX No CompressWhitespace for nsAString. Sad. // XXX No CompressWhitespace for nsAString. Sad.
text.CompressWhitespace(true, true); text.CompressWhitespace(true, true);

View File

@ -12,5 +12,46 @@ test(function() {
option.appendChild(document.createElement("font")) option.appendChild(document.createElement("font"))
.appendChild(document.createTextNode(" font ")); .appendChild(document.createTextNode(" font "));
assert_equals(option.text, "font"); assert_equals(option.text, "font");
}); }, "option.text should recurse");
test(function() {
var option = document.createElement("option");
option.appendChild(document.createTextNode(" before "));
option.appendChild(document.createElement("script"))
.appendChild(document.createTextNode(" script "));
option.appendChild(document.createTextNode(" after "));
assert_equals(option.text, "before after");
}, "option.text should not recurse into HTML script elements");
test(function() {
var option = document.createElement("option");
option.appendChild(document.createTextNode(" before "));
option.appendChild(document.createElementNS("http://www.w3.org/2000/svg", "script"))
.appendChild(document.createTextNode(" script "));
option.appendChild(document.createTextNode(" after "));
assert_equals(option.text, "before after");
}, "option.text should not recurse into SVG script elements");
test(function() {
var option = document.createElement("option");
option.appendChild(document.createTextNode(" before "));
option.appendChild(document.createElementNS("http://www.w3.org/1998/Math/MathML", "script"))
.appendChild(document.createTextNode(" script "));
option.appendChild(document.createTextNode(" after "));
assert_equals(option.text, "before script after");
}, "option.text should recurse into MathML script elements");
test(function() {
var option = document.createElement("option");
option.appendChild(document.createTextNode(" before "));
option.appendChild(document.createElementNS(null, "script"))
.appendChild(document.createTextNode(" script "));
option.appendChild(document.createTextNode(" after "));
assert_equals(option.text, "before script after");
}, "option.text should recurse into null script elements");
test(function() {
var option = document.createElement("option");
var span = option.appendChild(document.createElement("span"));
span.appendChild(document.createTextNode(" Some "));
span.appendChild(document.createElement("script"))
.appendChild(document.createTextNode(" script "));
option.appendChild(document.createTextNode(" Text "));
assert_equals(option.text, "Some Text");
}, "option.text should work if a child of the option ends with a script");
</script> </script>