Changeset 216881 in webkit


Ignore:
Timestamp:
May 15, 2017 3:07:54 PM (7 years ago)
Author:
Chris Dumez
Message:

Align WebKitCSSMatrix stringifier with spec for DOMMatrix
https://bugs.webkit.org/show_bug.cgi?id=172114

Reviewed by Simon Fraser.

Source/WebCore:

Align WebKitCSSMatrix stringifier with spec for DOMMatrix after:

The following changes were made:

  • Use EcmaScript's ToString() to convert floating point values to string
  • Throw an invalid state error if the matrix contains non-finite values
  • Made WebKitCSSMatrix.toString enumerable as per [1].

[1] https://heycam.github.io/webidl/#es-stringifier

Test: fast/css/matrix-stringifier.html

  • css/WebKitCSSMatrix.cpp:

(WebCore::WebKitCSSMatrix::toString):

  • css/WebKitCSSMatrix.h:
  • css/WebKitCSSMatrix.idl:
  • platform/graphics/transforms/TransformationMatrix.cpp:

(WebCore::TransformationMatrix::containsOnlyFiniteValues):

  • platform/graphics/transforms/TransformationMatrix.h:

LayoutTests:

  • fast/css/matrix-stringifier-expected.txt: Added.
  • fast/css/matrix-stringifier.html: Added.

Add layout test coverage.

  • fast/dom/Window/custom-constructors-expected.txt:
  • fast/dom/Window/custom-constructors.html:

Rebaseline existing test to reflect behavior change.

Location:
trunk
Files:
2 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r216876 r216881  
     12017-05-15  Chris Dumez  <cdumez@apple.com>
     2
     3        Align WebKitCSSMatrix stringifier with spec for DOMMatrix
     4        https://bugs.webkit.org/show_bug.cgi?id=172114
     5
     6        Reviewed by Simon Fraser.
     7
     8        * fast/css/matrix-stringifier-expected.txt: Added.
     9        * fast/css/matrix-stringifier.html: Added.
     10        Add layout test coverage.
     11
     12        * fast/dom/Window/custom-constructors-expected.txt:
     13        * fast/dom/Window/custom-constructors.html:
     14        Rebaseline existing test to reflect behavior change.
     15
    1162017-05-15  Mark Lam  <mark.lam@apple.com>
    217
  • trunk/LayoutTests/fast/dom/Window/custom-constructors-expected.txt

    r203333 r216881  
    77PASS Option.prototype.toString.call(new Option) is '[object HTMLOptionElement]'
    88PASS WebKitPoint.prototype.toString.call(new WebKitPoint) is '[object WebKitPoint]'
    9 PASS WebKitCSSMatrix.prototype.toString.call(new WebKitCSSMatrix) is 'matrix(1.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000)'
    10 PASS WebKitCSSMatrix.prototype.toString.call(new WebKitCSSMatrix()) is 'matrix(1.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000)'
    11 PASS WebKitCSSMatrix.prototype.toString.call(new WebKitCSSMatrix(undefined)) is 'matrix(1.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000)'
     9PASS WebKitCSSMatrix.prototype.toString.call(new WebKitCSSMatrix) is 'matrix(1, 0, 0, 1, 0, 0)'
     10PASS WebKitCSSMatrix.prototype.toString.call(new WebKitCSSMatrix()) is 'matrix(1, 0, 0, 1, 0, 0)'
     11PASS WebKitCSSMatrix.prototype.toString.call(new WebKitCSSMatrix(undefined)) is 'matrix(1, 0, 0, 1, 0, 0)'
    1212PASS new WebKitCSSMatrix(null) threw exception SyntaxError (DOM Exception 12): The string did not match the expected pattern..
    1313PASS XMLHttpRequest.prototype.toString.call(new XMLHttpRequest) is '[object XMLHttpRequest]'
  • trunk/LayoutTests/fast/dom/Window/custom-constructors.html

    r189507 r216881  
    1616    shouldBe("Option.prototype.toString.call(new Option)", "'[object HTMLOptionElement]'");
    1717    shouldBe("WebKitPoint.prototype.toString.call(new WebKitPoint)", "'[object WebKitPoint]'");
    18     shouldBe("WebKitCSSMatrix.prototype.toString.call(new WebKitCSSMatrix)", "'matrix(1.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000)'");
    19     shouldBe("WebKitCSSMatrix.prototype.toString.call(new WebKitCSSMatrix())", "'matrix(1.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000)'");
    20     shouldBe("WebKitCSSMatrix.prototype.toString.call(new WebKitCSSMatrix(undefined))", "'matrix(1.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000)'");
     18    shouldBe("WebKitCSSMatrix.prototype.toString.call(new WebKitCSSMatrix)", "'matrix(1, 0, 0, 1, 0, 0)'");
     19    shouldBe("WebKitCSSMatrix.prototype.toString.call(new WebKitCSSMatrix())", "'matrix(1, 0, 0, 1, 0, 0)'");
     20    shouldBe("WebKitCSSMatrix.prototype.toString.call(new WebKitCSSMatrix(undefined))", "'matrix(1, 0, 0, 1, 0, 0)'");
    2121    shouldThrow("new WebKitCSSMatrix(null)");
    2222    shouldBe("XMLHttpRequest.prototype.toString.call(new XMLHttpRequest)", "'[object XMLHttpRequest]'");
  • trunk/Source/WebCore/ChangeLog

    r216876 r216881  
     12017-05-15  Chris Dumez  <cdumez@apple.com>
     2
     3        Align WebKitCSSMatrix stringifier with spec for DOMMatrix
     4        https://bugs.webkit.org/show_bug.cgi?id=172114
     5
     6        Reviewed by Simon Fraser.
     7
     8        Align WebKitCSSMatrix stringifier with spec for DOMMatrix after:
     9        - https://github.com/w3c/fxtf-drafts/pull/148
     10
     11        The following changes were made:
     12        - Use EcmaScript's ToString() to convert floating point values to string
     13        - Throw an invalid state error if the matrix contains non-finite values
     14        - Made WebKitCSSMatrix.toString enumerable as per [1].
     15
     16        [1] https://heycam.github.io/webidl/#es-stringifier
     17
     18        Test: fast/css/matrix-stringifier.html
     19
     20        * css/WebKitCSSMatrix.cpp:
     21        (WebCore::WebKitCSSMatrix::toString):
     22        * css/WebKitCSSMatrix.h:
     23        * css/WebKitCSSMatrix.idl:
     24        * platform/graphics/transforms/TransformationMatrix.cpp:
     25        (WebCore::TransformationMatrix::containsOnlyFiniteValues):
     26        * platform/graphics/transforms/TransformationMatrix.h:
     27
    1282017-05-15  Mark Lam  <mark.lam@apple.com>
    229
  • trunk/Source/WebCore/css/WebKitCSSMatrix.cpp

    r209826 r216881  
    3636#include "TransformFunctions.h"
    3737#include <wtf/MathExtras.h>
     38#include <wtf/text/StringBuilder.h>
    3839
    3940namespace WebCore {
     
    198199}
    199200
    200 String WebKitCSSMatrix::toString() const
    201 {
    202     // FIXME - Need to ensure valid CSS floating point values (https://bugs.webkit.org/show_bug.cgi?id=20674)
    203     if (m_matrix.isAffine())
    204         return String::format("matrix(%f, %f, %f, %f, %f, %f)", m_matrix.a(), m_matrix.b(), m_matrix.c(), m_matrix.d(), m_matrix.e(), m_matrix.f());
    205     return String::format("matrix3d(%f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f)",
    206         m_matrix.m11(), m_matrix.m12(), m_matrix.m13(), m_matrix.m14(),
    207         m_matrix.m21(), m_matrix.m22(), m_matrix.m23(), m_matrix.m24(),
    208         m_matrix.m31(), m_matrix.m32(), m_matrix.m33(), m_matrix.m34(),
    209         m_matrix.m41(), m_matrix.m42(), m_matrix.m43(), m_matrix.m44());
     201ExceptionOr<String> WebKitCSSMatrix::toString() const
     202{
     203    if (!m_matrix.containsOnlyFiniteValues())
     204        return Exception { INVALID_STATE_ERR, ASCIILiteral("Matrix contains non-finite values") };
     205
     206    StringBuilder builder;
     207    if (m_matrix.isAffine()) {
     208        builder.appendLiteral("matrix(");
     209        builder.append(String::numberToStringECMAScript(m_matrix.a()));
     210        builder.appendLiteral(", ");
     211        builder.append(String::numberToStringECMAScript(m_matrix.b()));
     212        builder.appendLiteral(", ");
     213        builder.append(String::numberToStringECMAScript(m_matrix.c()));
     214        builder.appendLiteral(", ");
     215        builder.append(String::numberToStringECMAScript(m_matrix.d()));
     216        builder.appendLiteral(", ");
     217        builder.append(String::numberToStringECMAScript(m_matrix.e()));
     218        builder.appendLiteral(", ");
     219        builder.append(String::numberToStringECMAScript(m_matrix.f()));
     220    } else {
     221        builder.appendLiteral("matrix3d(");
     222        builder.append(String::numberToStringECMAScript(m_matrix.m11()));
     223        builder.appendLiteral(", ");
     224        builder.append(String::numberToStringECMAScript(m_matrix.m12()));
     225        builder.appendLiteral(", ");
     226        builder.append(String::numberToStringECMAScript(m_matrix.m13()));
     227        builder.appendLiteral(", ");
     228        builder.append(String::numberToStringECMAScript(m_matrix.m14()));
     229        builder.appendLiteral(", ");
     230        builder.append(String::numberToStringECMAScript(m_matrix.m21()));
     231        builder.appendLiteral(", ");
     232        builder.append(String::numberToStringECMAScript(m_matrix.m22()));
     233        builder.appendLiteral(", ");
     234        builder.append(String::numberToStringECMAScript(m_matrix.m23()));
     235        builder.appendLiteral(", ");
     236        builder.append(String::numberToStringECMAScript(m_matrix.m24()));
     237        builder.appendLiteral(", ");
     238        builder.append(String::numberToStringECMAScript(m_matrix.m31()));
     239        builder.appendLiteral(", ");
     240        builder.append(String::numberToStringECMAScript(m_matrix.m32()));
     241        builder.appendLiteral(", ");
     242        builder.append(String::numberToStringECMAScript(m_matrix.m33()));
     243        builder.appendLiteral(", ");
     244        builder.append(String::numberToStringECMAScript(m_matrix.m34()));
     245        builder.appendLiteral(", ");
     246        builder.append(String::numberToStringECMAScript(m_matrix.m41()));
     247        builder.appendLiteral(", ");
     248        builder.append(String::numberToStringECMAScript(m_matrix.m42()));
     249        builder.appendLiteral(", ");
     250        builder.append(String::numberToStringECMAScript(m_matrix.m43()));
     251        builder.appendLiteral(", ");
     252        builder.append(String::numberToStringECMAScript(m_matrix.m44()));
     253    }
     254    builder.append(')');
     255    return builder.toString();
    210256}
    211257
  • trunk/Source/WebCore/css/WebKitCSSMatrix.h

    r207396 r216881  
    138138    const TransformationMatrix& transform() const { return m_matrix; }
    139139
    140     String toString() const;
     140    ExceptionOr<String> toString() const;
    141141
    142142private:
  • trunk/Source/WebCore/css/WebKitCSSMatrix.idl

    r215403 r216881  
    9292    WebKitCSSMatrix skewY(optional unrestricted double angle = NaN);
    9393
    94     [NotEnumerable] DOMString toString();
     94    [MayThrowException] DOMString toString(); // FIXME: Should be stringifier; once we support it.
    9595};
  • trunk/Source/WebCore/platform/graphics/transforms/TransformationMatrix.cpp

    r208985 r216881  
    3434#include "LayoutRect.h"
    3535#include "TextStream.h"
     36#include <cmath>
    3637#include <wtf/Assertions.h>
    3738#include <wtf/MathExtras.h>
     
    16941695}
    16951696
     1697bool TransformationMatrix::containsOnlyFiniteValues() const
     1698{
     1699    return std::isfinite(m_matrix[0][0]) && std::isfinite(m_matrix[0][1]) && std::isfinite(m_matrix[0][2]) && std::isfinite(m_matrix[0][3])
     1700        && std::isfinite(m_matrix[1][0]) && std::isfinite(m_matrix[1][1]) && std::isfinite(m_matrix[1][2]) && std::isfinite(m_matrix[1][3])
     1701        && std::isfinite(m_matrix[2][0]) && std::isfinite(m_matrix[2][1]) && std::isfinite(m_matrix[2][2]) && std::isfinite(m_matrix[2][3])
     1702        && std::isfinite(m_matrix[3][0]) && std::isfinite(m_matrix[3][1]) && std::isfinite(m_matrix[3][2]) && std::isfinite(m_matrix[3][3]);
     1703}
     1704
    16961705TransformationMatrix TransformationMatrix::to2dTransform() const
    16971706{
  • trunk/Source/WebCore/platform/graphics/transforms/TransformationMatrix.h

    r208985 r216881  
    381381    bool isIntegerTranslation() const;
    382382
     383    bool containsOnlyFiniteValues() const;
     384
    383385    // Returns the matrix without 3D components.
    384386    TransformationMatrix to2dTransform() const;
Note: See TracChangeset for help on using the changeset viewer.