Index: Source/core/svg/SVGParserUtilities.cpp |
diff --git a/Source/core/svg/SVGParserUtilities.cpp b/Source/core/svg/SVGParserUtilities.cpp |
index 8d39b657feb3f82757a49796ac139d38cd394a18..897c9e60ec0ed7555c4d7fbd82ad96c8181aa992 100644 |
--- a/Source/core/svg/SVGParserUtilities.cpp |
+++ b/Source/core/svg/SVGParserUtilities.cpp |
@@ -43,7 +43,7 @@ static inline bool isValidRange(const FloatType& x) |
// at a higher precision internally, without any unnecessary runtime cost or code |
// complexity. |
template <typename CharType, typename FloatType> |
-static bool genericParseNumber(const CharType*& ptr, const CharType* end, FloatType& number, bool skip) |
+static bool genericParseNumber(const CharType*& ptr, const CharType* end, FloatType& number, WhitespaceMode mode) |
{ |
FloatType integer, decimal, frac, exponent; |
int sign, expsign; |
@@ -56,6 +56,9 @@ static bool genericParseNumber(const CharType*& ptr, const CharType* end, FloatT |
sign = 1; |
expsign = 1; |
+ if (mode & AllowLeadingWhitespace) |
+ skipOptionalSVGSpaces(ptr, end); |
+ |
// read the sign |
if (ptr < end && *ptr == '+') |
ptr++; |
@@ -136,7 +139,7 @@ static bool genericParseNumber(const CharType*& ptr, const CharType* end, FloatT |
if (start == ptr) |
return false; |
- if (skip) |
+ if (mode & AllowTrailingWhitespace) |
skipOptionalSVGSpacesOrDelimiter(ptr, end); |
return true; |
@@ -147,21 +150,21 @@ bool parseSVGNumber(CharType* begin, size_t length, double& number) |
{ |
const CharType* ptr = begin; |
const CharType* end = ptr + length; |
- return genericParseNumber(ptr, end, number, false); |
+ return genericParseNumber(ptr, end, number, AllowLeadingAndTrailingWhitespace); |
} |
// Explicitly instantiate the two flavors of parseSVGNumber() to satisfy external callers |
template bool parseSVGNumber(LChar* begin, size_t length, double&); |
template bool parseSVGNumber(UChar* begin, size_t length, double&); |
-bool parseNumber(const LChar*& ptr, const LChar* end, float& number, bool skip) |
+bool parseNumber(const LChar*& ptr, const LChar* end, float& number, WhitespaceMode mode) |
{ |
- return genericParseNumber(ptr, end, number, skip); |
+ return genericParseNumber(ptr, end, number, mode); |
} |
-bool parseNumber(const UChar*& ptr, const UChar* end, float& number, bool skip) |
+bool parseNumber(const UChar*& ptr, const UChar* end, float& number, WhitespaceMode mode) |
{ |
- return genericParseNumber(ptr, end, number, skip); |
+ return genericParseNumber(ptr, end, number, mode); |
} |
// only used to parse largeArcFlag and sweepFlag which must be a "0" or "1" |
@@ -202,7 +205,7 @@ static bool genericParseNumberOptionalNumber(const CharType*& ptr, const CharTyp |
if (ptr == end) |
y = x; |
- else if (!parseNumber(ptr, end, y, false)) |
+ else if (!parseNumber(ptr, end, y, AllowLeadingAndTrailingWhitespace)) |
return false; |
return ptr == end; |
@@ -212,6 +215,7 @@ bool parseNumberOptionalNumber(const String& string, float& x, float& y) |
{ |
if (string.isEmpty()) |
return false; |
+ |
if (string.is8Bit()) { |
const LChar* ptr = string.characters8(); |
const LChar* end = ptr + string.length(); |
@@ -223,6 +227,43 @@ bool parseNumberOptionalNumber(const String& string, float& x, float& y) |
} |
template<typename CharType> |
+bool genericParseNumberOrPercentage(const CharType*& ptr, const CharType* end, float& number) |
+{ |
+ if (genericParseNumber(ptr, end, number, AllowLeadingWhitespace)) { |
+ if (ptr == end) |
+ return true; |
+ |
+ bool isPercentage = (*ptr == '%'); |
+ if (isPercentage) |
+ ptr++; |
+ |
+ skipOptionalSVGSpaces(ptr, end); |
+ |
+ if (isPercentage) |
+ number /= 100.f; |
+ |
+ return ptr == end; |
+ } |
+ |
+ return false; |
+} |
+ |
+bool parseNumberOrPercentage(const String& string, float& number) |
+{ |
+ if (string.isEmpty()) |
+ return false; |
+ |
+ if (string.is8Bit()) { |
+ const LChar* ptr = string.characters8(); |
+ const LChar* end = ptr + string.length(); |
+ return genericParseNumberOrPercentage(ptr, end, number); |
+ } |
+ const UChar* ptr = string.characters16(); |
+ const UChar* end = ptr + string.length(); |
+ return genericParseNumberOrPercentage(ptr, end, number); |
+} |
+ |
+template<typename CharType> |
static bool parseGlyphName(const CharType*& ptr, const CharType* end, HashSet<String>& values) |
{ |
skipOptionalSVGSpaces(ptr, end); |
@@ -238,7 +279,7 @@ static bool parseGlyphName(const CharType*& ptr, const CharType* end, HashSet<St |
// walk backwards from the ; to ignore any whitespace |
const CharType* inputEnd = ptr - 1; |
- while (inputStart < inputEnd && isSVGSpace(*inputEnd)) |
+ while (inputStart < inputEnd && isHTMLSpace<CharType>(*inputEnd)) |
--inputEnd; |
values.add(String(inputStart, inputEnd - inputStart + 1)); |
@@ -390,7 +431,7 @@ static Vector<String> genericParseDelimitedString(const CharType*& ptr, const Ch |
// walk backwards from the ; to ignore any whitespace |
const CharType* inputEnd = ptr - 1; |
- while (inputStart < inputEnd && isSVGSpace(*inputEnd)) |
+ while (inputStart < inputEnd && isHTMLSpace<CharType>(*inputEnd)) |
inputEnd--; |
values.append(String(inputStart, inputEnd - inputStart + 1)); |