| Index: third_party/WebKit/Source/core/dom/DOMMatrixReadOnly.cpp | 
| diff --git a/third_party/WebKit/Source/core/dom/DOMMatrixReadOnly.cpp b/third_party/WebKit/Source/core/dom/DOMMatrixReadOnly.cpp | 
| index 82b6298d50fa4119469185be3b3be533b3784fd3..03794b1e4c6b6cfb1f772157f0aa30b6da442cd3 100644 | 
| --- a/third_party/WebKit/Source/core/dom/DOMMatrixReadOnly.cpp | 
| +++ b/third_party/WebKit/Source/core/dom/DOMMatrixReadOnly.cpp | 
| @@ -3,8 +3,81 @@ | 
| // found in the LICENSE file. | 
|  | 
| #include "core/dom/DOMMatrix.h" | 
| +#include "core/dom/DOMMatrixInit.h" | 
|  | 
| namespace blink { | 
| +namespace { | 
| + | 
| +void setDictionaryMembers(DOMMatrixInit& other) | 
| +{ | 
| +    if (!other.hasM11()) | 
| +        other.setM11(other.hasA() ? other.a() : 1); | 
| + | 
| +    if (!other.hasM12()) | 
| +        other.setM12(other.hasB() ? other.b() : 0); | 
| + | 
| +    if (!other.hasM21()) | 
| +        other.setM21(other.hasC() ? other.c() : 0); | 
| + | 
| +    if (!other.hasM22()) | 
| +        other.setM22(other.hasD() ? other.d() : 1); | 
| + | 
| +    if (!other.hasM41()) | 
| +        other.setM41(other.hasE() ? other.e() : 0); | 
| + | 
| +    if (!other.hasM42()) | 
| +        other.setM42(other.hasF() ? other.f() : 0); | 
| +} | 
| + | 
| +String getErrorMessage(const char* a, const char* b) | 
| +{ | 
| +    return String::format("The '%s' property should eqaul the '%s' property.", a, b); | 
| +} | 
| + | 
| +} // namespace | 
| + | 
| +bool DOMMatrixReadOnly::validateAndFixup(DOMMatrixInit& other, ExceptionState& exceptionState) | 
| +{ | 
| +    if (other.hasA() && other.hasM11() && other.a() != other.m11()) { | 
| +        exceptionState.throwTypeError(getErrorMessage("a", "m11")); | 
| +        return false; | 
| +    } | 
| +    if (other.hasB() && other.hasM12() && other.b() != other.m12()) { | 
| +        exceptionState.throwTypeError(getErrorMessage("b", "m12")); | 
| +        return false; | 
| +    } | 
| +    if (other.hasC() && other.hasM21() && other.c() != other.m21()) { | 
| +        exceptionState.throwTypeError(getErrorMessage("c", "m21")); | 
| +        return false; | 
| +    } | 
| +    if (other.hasD() && other.hasM22() && other.d() != other.m22()) { | 
| +        exceptionState.throwTypeError(getErrorMessage("d", "m22")); | 
| +        return false; | 
| +    } | 
| +    if (other.hasE() && other.hasM41() && other.e() != other.m41()) { | 
| +        exceptionState.throwTypeError(getErrorMessage("e", "m41")); | 
| +        return false; | 
| +    } | 
| +    if (other.hasF() && other.hasM42() && other.f() != other.m42()) { | 
| +        exceptionState.throwTypeError(getErrorMessage("f", "m42")); | 
| +        return false; | 
| +    } | 
| +    if (other.hasIs2D() && other.is2D() && (other.m31() || other.m32() | 
| +        || other.m13() || other.m23() || other.m43() || other.m14() | 
| +        || other.m24() || other.m34() || other.m33() != 1 || other.m44() != 1)) { | 
| +        exceptionState.throwTypeError("The is2D member is set to true but the input matrix is 3d matrix."); | 
| +        return false; | 
| +    } | 
| + | 
| +    setDictionaryMembers(other); | 
| +    if (!other.hasIs2D()) { | 
| +        bool is2D = !(other.m31() || other.m32() || other.m13() || other.m23() | 
| +            || other.m43() || other.m14() || other.m24() || other.m34() | 
| +            || other.m33() != 1 || other.m44() != 1); | 
| +        other.setIs2D(is2D); | 
| +    } | 
| +    return true; | 
| +} | 
|  | 
| DOMMatrixReadOnly* DOMMatrixReadOnly::create(Vector<double> sequence, ExceptionState& exceptionState) | 
| { | 
| @@ -34,6 +107,28 @@ DOMMatrixReadOnly* DOMMatrixReadOnly::fromFloat64Array(DOMFloat64Array* float64A | 
| return new DOMMatrixReadOnly(float64Array->data(), float64Array->length()); | 
| } | 
|  | 
| +DOMMatrixReadOnly* DOMMatrixReadOnly::fromMatrix(DOMMatrixInit& other, ExceptionState& exceptionState) | 
| +{ | 
| +    if (!validateAndFixup(other, exceptionState)) | 
| +        return nullptr; | 
| + | 
| +    if (other.is2D()) { | 
| +        double args[] = { | 
| +            other.m11(), other.m12(), other.m21(), | 
| +            other.m22(), other.m41(), other.m42() | 
| +        }; | 
| +        return new DOMMatrixReadOnly(args, 6); | 
| +    } | 
| + | 
| +    double args[] = { | 
| +        other.m11(), other.m12(), other.m13(), other.m14(), | 
| +        other.m21(), other.m22(), other.m23(), other.m24(), | 
| +        other.m31(), other.m32(), other.m33(), other.m34(), | 
| +        other.m41(), other.m42(), other.m43(), other.m44() | 
| +    }; | 
| +    return new DOMMatrixReadOnly(args, 16); | 
| +} | 
| + | 
| DOMMatrixReadOnly::~DOMMatrixReadOnly() | 
| { | 
| } | 
| @@ -48,9 +143,9 @@ bool DOMMatrixReadOnly::isIdentity() const | 
| return m_matrix->isIdentity(); | 
| } | 
|  | 
| -DOMMatrix* DOMMatrixReadOnly::multiply(DOMMatrix* other) | 
| +DOMMatrix* DOMMatrixReadOnly::multiply(DOMMatrixInit& other, ExceptionState& exceptionState) | 
| { | 
| -    return DOMMatrix::create(this)->multiplySelf(other); | 
| +    return DOMMatrix::create(this)->multiplySelf(other, exceptionState); | 
| } | 
|  | 
| DOMMatrix* DOMMatrixReadOnly::translate(double tx, double ty, double tz) | 
|  |