| Index: third_party/WebKit/Source/core/svg/SVGTransformList.cpp
|
| diff --git a/third_party/WebKit/Source/core/svg/SVGTransformList.cpp b/third_party/WebKit/Source/core/svg/SVGTransformList.cpp
|
| index ad281f0b6720f545954effb619f98c7a166c216b..d8bd71e031023f67ea98f9d89c7e441691fbffbb 100644
|
| --- a/third_party/WebKit/Source/core/svg/SVGTransformList.cpp
|
| +++ b/third_party/WebKit/Source/core/svg/SVGTransformList.cpp
|
| @@ -115,7 +115,7 @@ const unsigned kMaxTransformArguments = 6;
|
| using TransformArguments = Vector<float, kMaxTransformArguments>;
|
|
|
| template<typename CharType>
|
| -int parseTransformArgumentsForType(
|
| +SVGParseStatus parseTransformArgumentsForType(
|
| SVGTransformType type,
|
| const CharType*& ptr, const CharType* end,
|
| TransformArguments& arguments)
|
| @@ -145,10 +145,12 @@ int parseTransformArgumentsForType(
|
| }
|
| }
|
|
|
| - if (trailingDelimiter || !(arguments.size() == required || arguments.size() == maxPossibleParams))
|
| - return -1;
|
| + if (!(arguments.size() == required || arguments.size() == maxPossibleParams))
|
| + return SVGParseStatus::ExpectedNumber;
|
| + if (trailingDelimiter)
|
| + return SVGParseStatus::TrailingGarbage;
|
|
|
| - return safeCast<int>(arguments.size());
|
| + return SVGParseStatus::NoError;
|
| }
|
|
|
| PassRefPtrWillBeRawPtr<SVGTransform> createTransformFromValues(SVGTransformType type, const TransformArguments& arguments)
|
| @@ -194,30 +196,31 @@ PassRefPtrWillBeRawPtr<SVGTransform> createTransformFromValues(SVGTransformType
|
| } // namespace
|
|
|
| template<typename CharType>
|
| -bool SVGTransformList::parseInternal(const CharType*& ptr, const CharType* end)
|
| +SVGParsingError SVGTransformList::parseInternal(const CharType*& ptr, const CharType* end)
|
| {
|
| clear();
|
|
|
| + const CharType* start = ptr;
|
| bool delimParsed = false;
|
| while (skipOptionalSVGSpaces(ptr, end)) {
|
| delimParsed = false;
|
|
|
| SVGTransformType transformType = parseAndSkipTransformType(ptr, end);
|
| if (transformType == SVG_TRANSFORM_UNKNOWN)
|
| - return false;
|
| + return SVGParsingError(SVGParseStatus::ParsingFailed, ptr - start);
|
|
|
| if (!skipOptionalSVGSpaces(ptr, end) || *ptr != '(')
|
| - return false;
|
| + return SVGParsingError(SVGParseStatus::ParsingFailed, ptr - start);
|
| ptr++;
|
|
|
| TransformArguments arguments;
|
| - int valueCount = parseTransformArgumentsForType(transformType, ptr, end, arguments);
|
| - if (valueCount < 0)
|
| - return false;
|
| - ASSERT(static_cast<unsigned>(valueCount) >= requiredValuesForType[transformType]);
|
| + SVGParseStatus status = parseTransformArgumentsForType(transformType, ptr, end, arguments);
|
| + if (status != SVGParseStatus::NoError)
|
| + return SVGParsingError(status, ptr - start);
|
| + ASSERT(arguments.size() >= requiredValuesForType[transformType]);
|
|
|
| if (!skipOptionalSVGSpaces(ptr, end) || *ptr != ')')
|
| - return false;
|
| + return SVGParsingError(SVGParseStatus::ExpectedEndOfArguments, ptr - start);
|
| ptr++;
|
|
|
| append(createTransformFromValues(transformType, arguments));
|
| @@ -227,17 +230,19 @@ bool SVGTransformList::parseInternal(const CharType*& ptr, const CharType* end)
|
| delimParsed = true;
|
| }
|
| }
|
| - return !delimParsed;
|
| + if (delimParsed)
|
| + return SVGParsingError(SVGParseStatus::TrailingGarbage, ptr - start);
|
| + return SVGParseStatus::NoError;
|
| }
|
|
|
| bool SVGTransformList::parse(const UChar*& ptr, const UChar* end)
|
| {
|
| - return parseInternal(ptr, end);
|
| + return parseInternal(ptr, end) == SVGParseStatus::NoError;
|
| }
|
|
|
| bool SVGTransformList::parse(const LChar*& ptr, const LChar* end)
|
| {
|
| - return parseInternal(ptr, end);
|
| + return parseInternal(ptr, end) == SVGParseStatus::NoError;
|
| }
|
|
|
| SVGTransformType parseTransformType(const String& string)
|
| @@ -277,23 +282,21 @@ SVGParsingError SVGTransformList::setValueAsString(const String& value)
|
| return SVGParseStatus::NoError;
|
| }
|
|
|
| - bool valid = false;
|
| + SVGParsingError parseError;
|
| if (value.is8Bit()) {
|
| const LChar* ptr = value.characters8();
|
| const LChar* end = ptr + value.length();
|
| - valid = parse(ptr, end);
|
| + parseError = parseInternal(ptr, end);
|
| } else {
|
| const UChar* ptr = value.characters16();
|
| const UChar* end = ptr + value.length();
|
| - valid = parse(ptr, end);
|
| + parseError = parseInternal(ptr, end);
|
| }
|
|
|
| - if (!valid) {
|
| + if (parseError != SVGParseStatus::NoError)
|
| clear();
|
| - return SVGParseStatus::ParsingFailed;
|
| - }
|
|
|
| - return SVGParseStatus::NoError;
|
| + return parseError;
|
| }
|
|
|
| PassRefPtrWillBeRawPtr<SVGPropertyBase> SVGTransformList::cloneForAnimation(const String& value) const
|
| @@ -306,22 +309,22 @@ PassRefPtrWillBeRawPtr<SVGTransformList> SVGTransformList::create(SVGTransformTy
|
| {
|
| TransformArguments arguments;
|
| bool atEndOfValue = false;
|
| - int valueCount = -1;
|
| + SVGParseStatus status = SVGParseStatus::ParsingFailed;
|
| if (value.isEmpty()) {
|
| } else if (value.is8Bit()) {
|
| const LChar* ptr = value.characters8();
|
| const LChar* end = ptr + value.length();
|
| - valueCount = parseTransformArgumentsForType(transformType, ptr, end, arguments);
|
| + status = parseTransformArgumentsForType(transformType, ptr, end, arguments);
|
| atEndOfValue = !skipOptionalSVGSpaces(ptr, end);
|
| } else {
|
| const UChar* ptr = value.characters16();
|
| const UChar* end = ptr + value.length();
|
| - valueCount = parseTransformArgumentsForType(transformType, ptr, end, arguments);
|
| + status = parseTransformArgumentsForType(transformType, ptr, end, arguments);
|
| atEndOfValue = !skipOptionalSVGSpaces(ptr, end);
|
| }
|
|
|
| RefPtrWillBeRawPtr<SVGTransformList> svgTransformList = SVGTransformList::create();
|
| - if (atEndOfValue && valueCount > 0)
|
| + if (atEndOfValue && status == SVGParseStatus::NoError)
|
| svgTransformList->append(createTransformFromValues(transformType, arguments));
|
| return svgTransformList.release();
|
| }
|
|
|