Index: third_party/WebKit/Source/core/geometry/DOMMatrixReadOnly.cpp |
diff --git a/third_party/WebKit/Source/core/geometry/DOMMatrixReadOnly.cpp b/third_party/WebKit/Source/core/geometry/DOMMatrixReadOnly.cpp |
index 4290ed2c5d4899bc4e360a8866451371cca14f57..4c7d6ed5942d7eec18ae3a06a86f50e89f70ea09 100644 |
--- a/third_party/WebKit/Source/core/geometry/DOMMatrixReadOnly.cpp |
+++ b/third_party/WebKit/Source/core/geometry/DOMMatrixReadOnly.cpp |
@@ -322,21 +322,83 @@ NotShared<DOMFloat64Array> DOMMatrixReadOnly::toFloat64Array() const { |
return NotShared<DOMFloat64Array>(DOMFloat64Array::Create(array, 16)); |
} |
-const String DOMMatrixReadOnly::toString() const { |
- std::stringstream stream; |
+const String DOMMatrixReadOnly::toString( |
+ ExceptionState& exception_state) const { |
+ const char* kComma = ", "; |
+ String result; |
+ |
if (is2D()) { |
- stream << "matrix(" << a() << ", " << b() << ", " << c() << ", " << d() |
- << ", " << e() << ", " << f(); |
- } else { |
- stream << "matrix3d(" << m11() << ", " << m12() << ", " << m13() << ", " |
- << m14() << ", " << m21() << ", " << m22() << ", " << m23() << ", " |
- << m24() << ", " << m31() << ", " << m32() << ", " << m33() << ", " |
- << m34() << ", " << m41() << ", " << m42() << ", " << m43() << ", " |
- << m44(); |
+ if (!std::isfinite(a()) || !std::isfinite(b()) || !std::isfinite(c()) || |
+ !std::isfinite(d()) || !std::isfinite(e()) || !std::isfinite(f())) { |
+ exception_state.ThrowDOMException( |
+ kInvalidStateError, |
+ "DOMMatrix cannot be serialized with NaN or Infinity values."); |
+ return String(); |
+ } |
+ |
+ result.append("matrix("); |
+ result.append(String::NumberToStringECMAScript(a())); |
+ result.append(kComma); |
+ result.append(String::NumberToStringECMAScript(b())); |
+ result.append(kComma); |
+ result.append(String::NumberToStringECMAScript(c())); |
+ result.append(kComma); |
+ result.append(String::NumberToStringECMAScript(d())); |
+ result.append(kComma); |
+ result.append(String::NumberToStringECMAScript(e())); |
+ result.append(kComma); |
+ result.append(String::NumberToStringECMAScript(f())); |
+ result.append(")"); |
+ return result; |
+ } |
+ |
+ if (!std::isfinite(m11()) || !std::isfinite(m12()) || !std::isfinite(m13()) || |
+ !std::isfinite(m14()) || !std::isfinite(m21()) || !std::isfinite(m22()) || |
+ !std::isfinite(m23()) || !std::isfinite(m24()) || !std::isfinite(m31()) || |
+ !std::isfinite(m32()) || !std::isfinite(m33()) || !std::isfinite(m34()) || |
+ !std::isfinite(m41()) || !std::isfinite(m42()) || !std::isfinite(m43()) || |
+ !std::isfinite(m44())) { |
+ exception_state.ThrowDOMException( |
+ kInvalidStateError, |
+ "DOMMatrix cannot be serialized with NaN or Infinity values."); |
+ return String(); |
} |
- stream << ")"; |
- return String(stream.str().c_str()); |
+ result.append("matrix3d("); |
+ result.append(String::NumberToStringECMAScript(m11())); |
+ result.append(kComma); |
+ result.append(String::NumberToStringECMAScript(m12())); |
+ result.append(kComma); |
+ result.append(String::NumberToStringECMAScript(m13())); |
+ result.append(kComma); |
+ result.append(String::NumberToStringECMAScript(m14())); |
+ result.append(kComma); |
+ result.append(String::NumberToStringECMAScript(m21())); |
+ result.append(kComma); |
+ result.append(String::NumberToStringECMAScript(m22())); |
+ result.append(kComma); |
+ result.append(String::NumberToStringECMAScript(m23())); |
+ result.append(kComma); |
+ result.append(String::NumberToStringECMAScript(m24())); |
+ result.append(kComma); |
+ result.append(String::NumberToStringECMAScript(m31())); |
+ result.append(kComma); |
+ result.append(String::NumberToStringECMAScript(m32())); |
+ result.append(kComma); |
+ result.append(String::NumberToStringECMAScript(m33())); |
+ result.append(kComma); |
+ result.append(String::NumberToStringECMAScript(m34())); |
+ result.append(kComma); |
+ result.append(String::NumberToStringECMAScript(m41())); |
+ result.append(kComma); |
+ result.append(String::NumberToStringECMAScript(m42())); |
+ result.append(kComma); |
+ result.append(String::NumberToStringECMAScript(m43())); |
+ result.append(kComma); |
+ result.append(String::NumberToStringECMAScript(m44())); |
+ result.append(")"); |
+ |
+ return result; |
} |
ScriptValue DOMMatrixReadOnly::toJSONForBinding( |