From 61f36b37084e7b1c80cfc485825588604a401c9a Mon Sep 17 00:00:00 2001 From: fmalita Date: Mon, 8 Aug 2016 13:58:50 -0700 Subject: [PATCH] [SVGDom] Improve whitespace handling in style parsing 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 | 11 +++++++++-- experimental/svg/model/SkSVGDOM.cpp | 16 ++++++++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/experimental/svg/model/SkSVGAttributeParser.cpp b/experimental/svg/model/SkSVGAttributeParser.cpp index f973d38..7a2561c 100644 --- a/experimental/svg/model/SkSVGAttributeParser.cpp +++ b/experimental/svg/model/SkSVGAttributeParser.cpp @@ -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 diff --git a/experimental/svg/model/SkSVGDOM.cpp b/experimental/svg/model/SkSVGDOM.cpp index 9b67484..c4fdcb1 100644 --- a/experimental/svg/model/SkSVGDOM.cpp +++ b/experimental/svg/model/SkSVGDOM.cpp @@ -82,6 +82,18 @@ bool SetViewBoxAttribute(const sk_sp& 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(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; -- 2.7.4