[SVGDom] Improve whitespace handling in style parsing
authorfmalita <fmalita@chromium.org>
Mon, 8 Aug 2016 20:58:50 +0000 (13:58 -0700)
committerCommit bot <commit-bot@chromium.org>
Mon, 8 Aug 2016 20:58:50 +0000 (13:58 -0700)
Handle whitespace-padded style names/values.

R=stephana@google.com,robertphillips@google.com
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2225623002

Review-Url: https://codereview.chromium.org/2225623002

experimental/svg/model/SkSVGAttributeParser.cpp
experimental/svg/model/SkSVGDOM.cpp

index f973d38..7a2561c 100644 (file)
@@ -152,13 +152,20 @@ bool SkSVGAttributeParser::parseHexColorToken(SkColor* c) {
 bool SkSVGAttributeParser::parseColor(SkSVGColorType* color) {
     SkColor c;
 
+    // consume preceding whitespace
+    this->parseWSToken();
+
     // TODO: rgb(...)
+    bool parsedValue = false;
     if (this->parseHexColorToken(&c) || this->parseNamedColorToken(&c)) {
         *color = SkSVGColorType(c);
-        return true;
+        parsedValue = true;
+
+        // consume trailing whitespace
+        this->parseWSToken();
     }
 
-    return false;
+    return parsedValue && this->parseEOSToken();
 }
 
 // https://www.w3.org/TR/SVG/types.html#DataTypeNumber
index 9b67484..c4fdcb1 100644 (file)
@@ -82,6 +82,18 @@ bool SetViewBoxAttribute(const sk_sp<SkSVGNode>& node, SkSVGAttribute attr,
     return true;
 }
 
+SkString TrimmedString(const char* first, const char* last) {
+    SkASSERT(first);
+    SkASSERT(last);
+    SkASSERT(first <= last);
+
+    while (first <= last && *first <= ' ') { first++; }
+    while (first <= last && *last  <= ' ') { last--; }
+
+    SkASSERT(last - first + 1 >= 0);
+    return SkString(first, SkTo<size_t>(last - first + 1));
+}
+
 // Breaks a "foo: bar; baz: ..." string into key:value pairs.
 class StyleIterator {
 public:
@@ -96,8 +108,8 @@ public:
 
             const char* valueSep = strchr(fPos, ':');
             if (valueSep && valueSep < sep) {
-                name.set(fPos, valueSep - fPos);
-                value.set(valueSep + 1, sep - valueSep - 1);
+                name  = TrimmedString(fPos, valueSep - 1);
+                value = TrimmedString(valueSep + 1, sep - 1);
             }
 
             fPos = *sep ? sep + 1 : nullptr;