Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(864)

Unified Diff: third_party/WebKit/Source/core/svg/SVGTransformList.cpp

Issue 1659513002: Error reporting for SVG transform lists (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: type -> transformType Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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();
}

Powered by Google App Engine
This is Rietveld 408576698