Index: Source/core/svg/SVGLengthTearOff.cpp |
diff --git a/Source/core/svg/SVGLengthTearOff.cpp b/Source/core/svg/SVGLengthTearOff.cpp |
index e43a606269c486143342e911471eff1a46cbf7b6..bf29952cee2d56b5a17dbf0eaaf5fdd9b13ef7bb 100644 |
--- a/Source/core/svg/SVGLengthTearOff.cpp |
+++ b/Source/core/svg/SVGLengthTearOff.cpp |
@@ -55,7 +55,7 @@ inline bool canResolveRelativeUnits(const SVGElement* contextElement) |
SVGLengthType SVGLengthTearOff::unitType() |
{ |
- return target()->unitType(); |
+ return hasExposedLengthUnit() ? target()->unitType() : LengthTypeUnknown; |
} |
SVGLengthMode SVGLengthTearOff::unitMode() |
@@ -108,7 +108,8 @@ void SVGLengthTearOff::setValueInSpecifiedUnits(float value, ExceptionState& es) |
String SVGLengthTearOff::valueAsString() |
{ |
- return target()->valueAsString(); |
+ // TODO(shanmuga.m@samsung.com): Not all <length> properties have 0 (with no unit) as the default (lacuna) value, Need to return default value instead of 0 |
+ return hasExposedLengthUnit() ? target()->valueAsString() : String::number(0); |
} |
void SVGLengthTearOff::setValueAsString(const String& str, ExceptionState& es) |
@@ -118,7 +119,16 @@ void SVGLengthTearOff::setValueAsString(const String& str, ExceptionState& es) |
return; |
} |
+ String oldValue = target()->valueAsString(); |
+ |
target()->setValueAsString(str, es); |
+ |
+ if (!es.hadException() && !hasExposedLengthUnit()) { |
+ target()->setValueAsString(oldValue, ASSERT_NO_EXCEPTION); // rollback to old value |
+ es.throwDOMException(SyntaxError, "The value provided ('" + str + "') is invalid."); |
+ return; |
+ } |
+ |
commitChange(); |
} |