summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/mbgl/map/view.hpp1
-rw-r--r--include/mbgl/util/color.hpp6
-rw-r--r--package.json2
-rw-r--r--platform/node/src/node_style.hpp14
-rw-r--r--src/mbgl/style/property_parsing.cpp16
-rw-r--r--src/mbgl/util/color.cpp20
6 files changed, 45 insertions, 14 deletions
diff --git a/include/mbgl/map/view.hpp b/include/mbgl/map/view.hpp
index 9f12ee5fb6..fa6f91d910 100644
--- a/include/mbgl/map/view.hpp
+++ b/include/mbgl/map/view.hpp
@@ -4,6 +4,7 @@
#include <mbgl/util/chrono.hpp>
#include <mbgl/util/image.hpp>
+#include <array>
#include <functional>
#include <memory>
diff --git a/include/mbgl/util/color.hpp b/include/mbgl/util/color.hpp
index 87d3175178..6491f75801 100644
--- a/include/mbgl/util/color.hpp
+++ b/include/mbgl/util/color.hpp
@@ -1,6 +1,8 @@
#pragma once
-#include <array>
+#include <mbgl/util/optional.hpp>
+
+#include <string>
namespace mbgl {
@@ -14,6 +16,8 @@ public:
static constexpr Color black() { return { 0.0f, 0.0f, 0.0f, 1.0f }; };
static constexpr Color white() { return { 1.0f, 1.0f, 1.0f, 1.0f }; };
+
+ static optional<Color> parse(const std::string&);
};
inline bool operator==(const Color& colorA, const Color& colorB) {
diff --git a/package.json b/package.json
index 5785994247..08e666dec6 100644
--- a/package.json
+++ b/package.json
@@ -23,7 +23,7 @@
"express": "^4.11.1",
"mapbox-gl-shaders": "mapbox/mapbox-gl-shaders#59e998295d548f208ee3ec10cdd21ff2630e2079",
"mapbox-gl-style-spec": "mapbox/mapbox-gl-style-spec#194fc55b6a7dd54c1e2cf2dd9048fbb5e836716d",
- "mapbox-gl-test-suite": "mapbox/mapbox-gl-test-suite#05d8865cf38920d5d15de0e410475514d6edace0",
+ "mapbox-gl-test-suite": "mapbox/mapbox-gl-test-suite#3a6baea2f364410e6d0873b71babfe0484870a72",
"node-gyp": "^3.3.1",
"request": "^2.72.0",
"tape": "^4.5.1"
diff --git a/platform/node/src/node_style.hpp b/platform/node/src/node_style.hpp
index a987c0d262..0b6b05e13b 100644
--- a/platform/node/src/node_style.hpp
+++ b/platform/node/src/node_style.hpp
@@ -65,8 +65,18 @@ struct ValueConverter<T, std::enable_if_t<std::is_enum<T>::value>> {
template <>
struct ValueConverter<mbgl::Color> {
mbgl::optional<mbgl::style::PropertyValue<mbgl::Color>> operator()(const v8::Local<v8::Value>& value) const {
- (void)value;
- return {};
+ if (!value->IsString()) {
+ Nan::ThrowTypeError("string required");
+ return {};
+ }
+
+ mbgl::optional<mbgl::Color> result = mbgl::Color::parse(*Nan::Utf8String(value));
+ if (!result) {
+ Nan::ThrowTypeError("invalid color");
+ return {};
+ }
+
+ return { *result };
}
};
diff --git a/src/mbgl/style/property_parsing.cpp b/src/mbgl/style/property_parsing.cpp
index 2b08ba8788..2eb55dcb25 100644
--- a/src/mbgl/style/property_parsing.cpp
+++ b/src/mbgl/style/property_parsing.cpp
@@ -2,8 +2,6 @@
#include <mbgl/platform/log.hpp>
-#include <csscolorparser/csscolorparser.hpp>
-
namespace mbgl {
namespace style {
@@ -44,15 +42,13 @@ optional<Color> parseConstant(const char* name, const JSValue& value) {
return {};
}
- CSSColorParser::Color css_color = CSSColorParser::parse({ value.GetString(), value.GetStringLength() });
-
- // Premultiply the color.
- const float factor = css_color.a / 255;
+ optional<Color> result = Color::parse({ value.GetString(), value.GetStringLength() });
+ if (!result) {
+ Log::Warning(Event::ParseStyle, "value of '%s' must be a valid color", name);
+ return {};
+ }
- return Color{ (float)css_color.r * factor,
- (float)css_color.g * factor,
- (float)css_color.b * factor,
- css_color.a };
+ return result;
}
template <>
diff --git a/src/mbgl/util/color.cpp b/src/mbgl/util/color.cpp
new file mode 100644
index 0000000000..eea897d3ab
--- /dev/null
+++ b/src/mbgl/util/color.cpp
@@ -0,0 +1,20 @@
+#include <mbgl/util/color.hpp>
+
+#include <csscolorparser/csscolorparser.hpp>
+
+namespace mbgl {
+
+optional<Color> Color::parse(const std::string& s) {
+ CSSColorParser::Color css_color = CSSColorParser::parse(s);
+
+ // Premultiply the color.
+ const float factor = css_color.a / 255;
+ return {{
+ css_color.r * factor,
+ css_color.g * factor,
+ css_color.b * factor,
+ css_color.a
+ }};
+}
+
+} // namespace mbgl