void DOMSVGLength::SetValueAsString(const nsAString& aValue, ErrorResult& aRv) { if (mIsAnimValItem) { aRv.Throw(NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR); return; } if (mVal) { aRv = mVal->SetBaseValueString(aValue, mSVGElement, true); return; } SVGLength value; if (!value.SetValueFromString(aValue)) { aRv.Throw(NS_ERROR_DOM_SYNTAX_ERR); return; } if (HasOwner()) { if (InternalItem() == value) { return; } AutoChangeLengthNotifier notifier(this); InternalItem() = value; return; } mValue = value.GetValueInCurrentUnits(); mUnit = value.GetUnit(); }
nsresult SVGLengthList::SetValueFromString(const nsAString& aValue) { SVGLengthList temp; NS_ConvertUTF16toUTF8 value(aValue); char* start = SkipWhitespace(value.BeginWriting()); // We can't use strtok with SVG_COMMA_WSP_DELIM because to correctly handle // invalid input in the form of two commas without a value between them, we // would need to know if strtok overwrote a comma or not. while (*start != '\0') { int end = strcspn(start, SVG_COMMA_WSP_DELIM); if (end == 0) { // found comma in an invalid location return NS_ERROR_DOM_SYNTAX_ERR; } SVGLength length; if (!length.SetValueFromString(NS_ConvertUTF8toUTF16(start, PRUint32(end)))) { return NS_ERROR_DOM_SYNTAX_ERR; } if (!temp.AppendItem(length)) { return NS_ERROR_OUT_OF_MEMORY; } start = SkipWhitespace(start + end); if (*start == ',') { start = SkipWhitespace(start + 1); } } return CopyFrom(temp); }
nsresult SVGLengthList::SetValueFromString(const nsAString& aValue) { SVGLengthList temp; nsCharSeparatedTokenizerTemplate<nsContentUtils::IsHTMLWhitespace> tokenizer( aValue, ',', nsCharSeparatedTokenizer::SEPARATOR_OPTIONAL); while (tokenizer.hasMoreTokens()) { SVGLength length; if (!length.SetValueFromString(tokenizer.nextToken())) { return NS_ERROR_DOM_SYNTAX_ERR; } if (!temp.AppendItem(length)) { return NS_ERROR_OUT_OF_MEMORY; } } if (tokenizer.separatorAfterCurrentToken()) { return NS_ERROR_DOM_SYNTAX_ERR; // trailing comma } return CopyFrom(temp); }
nsresult SVGLengthList::SetValueFromString(const nsAString& aValue) { SVGLengthList temp; nsCharSeparatedTokenizerTemplate<IsSVGWhitespace> tokenizer(aValue, ',', nsCharSeparatedTokenizer::SEPARATOR_OPTIONAL); nsCAutoString str; // outside loop to minimize memory churn while (tokenizer.hasMoreTokens()) { SVGLength length; if (!length.SetValueFromString(tokenizer.nextToken())) { return NS_ERROR_DOM_SYNTAX_ERR; } if (!temp.AppendItem(length)) { return NS_ERROR_OUT_OF_MEMORY; } } if (tokenizer.lastTokenEndedWithSeparator()) { return NS_ERROR_DOM_SYNTAX_ERR; // trailing comma } return CopyFrom(temp); }