diff options
author | fmalita <fmalita@chromium.org> | 2016-08-08 13:58:50 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-08-08 13:58:50 -0700 |
commit | 61f36b37084e7b1c80cfc485825588604a401c9a (patch) | |
tree | 335bf7fd27c8950b339f5757f47b86daca0ccfd6 /experimental/svg | |
parent | 0adbd3e0a61c039fea1d47c006daa462bae42318 (diff) |
[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
Diffstat (limited to 'experimental/svg')
-rw-r--r-- | experimental/svg/model/SkSVGAttributeParser.cpp | 11 | ||||
-rw-r--r-- | 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 f973d385f5..7a2561cdf7 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 9b67484fbc..c4fdcb172b 100644 --- a/experimental/svg/model/SkSVGDOM.cpp +++ b/experimental/svg/model/SkSVGDOM.cpp @@ -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; |