aboutsummaryrefslogtreecommitdiffhomepage
path: root/experimental/svg
diff options
context:
space:
mode:
authorGravatar fmalita <fmalita@chromium.org>2016-08-08 13:58:50 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-08-08 13:58:50 -0700
commit61f36b37084e7b1c80cfc485825588604a401c9a (patch)
tree335bf7fd27c8950b339f5757f47b86daca0ccfd6 /experimental/svg
parent0adbd3e0a61c039fea1d47c006daa462bae42318 (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.cpp11
-rw-r--r--experimental/svg/model/SkSVGDOM.cpp16
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;