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

Unified Diff: Source/core/svg/SVGParserUtilities.cpp

Issue 302643004: [SVG2] Allow leading and trailing whitespace in svg attributes (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@relax_todouble_wtf
Patch Set: review fixes Created 6 years, 7 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: Source/core/svg/SVGParserUtilities.cpp
diff --git a/Source/core/svg/SVGParserUtilities.cpp b/Source/core/svg/SVGParserUtilities.cpp
index 8d39b657feb3f82757a49796ac139d38cd394a18..a9794c774af6bb954927adc06b1e09eb38e2d1fb 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, WhitespaceParsing 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 & ALLOW_LEADING)
+ 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 & ALLOW_TRAILING)
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, ALLOW_LEADING_AND_TRAILING);
}
// 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, WhitespaceParsing 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, WhitespaceParsing 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, ALLOW_LEADING_AND_TRAILING))
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, ALLOW_LEADING)) {
+ 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);

Powered by Google App Engine
This is Rietveld 408576698