blob: 3e679d15c99ae2c7885f93f3f52863968ad70b88 [file] [log] [blame]
<!DOCTYPE html>
<script src='../../../resources/testharness.js'></script>
<script src='../../../resources/testharnessreport.js'></script>
<script src='property-suite.js'></script>
<div id="testElement"></div>
<script>
function cssTransformWithRotate(angleValue) {
return new CSSTransformValue([
new CSSRotation(angleValue)]);
}
function cssTransformWithRotate3D(x, y, z, angleValue) {
return new CSSTransformValue([
new CSSRotation(x, y, z, angleValue)]);
}
runInlineStylePropertyMapTests( {
property: 'transform',
validKeywords: [
'none',
],
validObjects: [
// Translations
new CSSTransformValue([new CSSTranslation(CSS.px(1), CSS.px(2))]),
new CSSTransformValue(
[new CSSTranslation(CSS.px(1), CSS.px(2), CSS.px(3))]),
new CSSTransformValue([new CSSTranslation(CSS.px(-10), CSS.px(-20))]),
new CSSTransformValue(
[new CSSTranslation(CSS.px(-10), CSS.px(-20), CSS.px(-30))]),
// Scales
new CSSTransformValue([new CSSScale(1, 2.2)]),
new CSSTransformValue([new CSSScale(1, 2.2, 3)]),
new CSSTransformValue([new CSSScale(-1, -2.2)]),
new CSSTransformValue([new CSSScale(-1, -2.2, -3)]),
// Skews
new CSSTransformValue([new CSSSkew(CSS.deg(30), CSS.deg(0))]),
new CSSTransformValue([new CSSSkew(CSS.rad(10), CSS.deg(0))]),
new CSSTransformValue([new CSSSkew(CSS.grad(2), CSS.deg(0))]),
new CSSTransformValue([new CSSSkew(CSS.turn(0.2), CSS.deg(0))]),
new CSSTransformValue([new CSSSkew(CSS.deg(0), CSS.deg(30))]),
new CSSTransformValue([new CSSSkew(CSS.deg(0), CSS.rad(10))]),
new CSSTransformValue([new CSSSkew(CSS.deg(0), CSS.grad(2))]),
new CSSTransformValue([new CSSSkew(CSS.deg(0), CSS.turn(0.2))]),
// Rotations
cssTransformWithRotate(CSS.deg(30)),
cssTransformWithRotate(CSS.rad(10)),
cssTransformWithRotate(CSS.grad(2)),
cssTransformWithRotate(CSS.turn(0.2)),
cssTransformWithRotate3D(1, 2, 3, CSS.deg(30)),
cssTransformWithRotate3D(1, 2, 3, CSS.rad(10)),
cssTransformWithRotate3D(1, 2, 3, CSS.grad(2)),
cssTransformWithRotate3D(1, 2, 3, CSS.turn(0.2)),
// Perspectives
new CSSTransformValue([new CSSPerspective(CSS.px(10))]),
new CSSTransformValue([new CSSPerspective(CSS.em(5))]),
],
// Values with these strings aren't used in Typed OM, but can also be
// represented by the specified values.
validStringMappings: {
// Translations
'translate(10px)':
new CSSTransformValue([new CSSTranslation(CSS.px(10), CSS.px(0))]),
'translateX(10em)':
new CSSTransformValue([new CSSTranslation(CSS.em(10), CSS.px(0))]),
'translateY(20pc)':
new CSSTransformValue([new CSSTranslation(CSS.px(0), CSS.pc(20))]),
'translateZ(30in)':
new CSSTransformValue(
[new CSSTranslation(CSS.px(0), CSS.px(0), CSS.in(30))]),
// Scales
'scale(4)': new CSSTransformValue([new CSSScale(4, 4)]),
'scaleX(2)': new CSSTransformValue([new CSSScale(2, 1)]),
'scaleY(3)': new CSSTransformValue([new CSSScale(1, 3)]),
// Skews
'skew(45deg)':
new CSSTransformValue([new CSSSkew(CSS.deg(45), CSS.deg(0))]),
'skew(1rad)': new CSSTransformValue([new CSSSkew(CSS.rad(1), CSS.deg(0))]),
'skew(6.2grad)':
new CSSTransformValue([new CSSSkew(CSS.grad(6.2), CSS.deg(0))]),
'skew(0.31turn)':
new CSSTransformValue([new CSSSkew(CSS.turn(0.31), CSS.deg(0))]),
'skewX(45deg)':
new CSSTransformValue([new CSSSkew(CSS.deg(45), CSS.deg(0))]),
'skewX(1rad)': new CSSTransformValue([new CSSSkew(CSS.rad(1), CSS.deg(0))]),
'skewX(6.2grad)':
new CSSTransformValue([new CSSSkew(CSS.grad(6.2), CSS.deg(0))]),
'skewX(0.31turn)':
new CSSTransformValue([new CSSSkew(CSS.turn(0.31), CSS.deg(0))]),
'skewY(45deg)':
new CSSTransformValue([new CSSSkew(CSS.deg(0), CSS.deg(45))]),
'skewY(1rad)': new CSSTransformValue([new CSSSkew(CSS.deg(0), CSS.rad(1))]),
'skewY(6.2grad)':
new CSSTransformValue([new CSSSkew(CSS.deg(0), CSS.grad(6.2))]),
'skewY(0.31turn)':
new CSSTransformValue([new CSSSkew(CSS.deg(0), CSS.turn(0.31))]),
// Rotations
'rotateX(45deg)': cssTransformWithRotate3D(1, 0, 0, CSS.deg(45)),
'rotateX(1rad)': cssTransformWithRotate3D(1, 0, 0, CSS.rad(1)),
'rotateX(6.2grad)': cssTransformWithRotate3D(1, 0, 0, CSS.grad(6.2)),
'rotateX(0.31turn)': cssTransformWithRotate3D(1, 0, 0, CSS.turn(0.31)),
'rotateY(45deg)': cssTransformWithRotate3D(0, 1, 0, CSS.deg(45)),
'rotateY(1rad)': cssTransformWithRotate3D(0, 1, 0, CSS.rad(1)),
'rotateY(6.2grad)': cssTransformWithRotate3D(0, 1, 0, CSS.grad(6.2)),
'rotateY(0.31turn)': cssTransformWithRotate3D(0, 1, 0, CSS.turn(0.31)),
'rotateZ(45deg)': cssTransformWithRotate3D(0, 0, 1, CSS.deg(45)),
'rotateZ(1rad)': cssTransformWithRotate3D(0, 0, 1, CSS.rad(1)),
'rotateZ(6.2grad)': cssTransformWithRotate3D(0, 0, 1, CSS.grad(6.2)),
'rotateZ(0.31turn)': cssTransformWithRotate3D(0, 0, 1, CSS.turn(0.31)),
},
supportsMultiple: false,
invalidObjects: [CSS.px(4)]
});
let crashTestStrings = {
'rotate(calc(45deg + 1rad))': 'rotate(calc(102.296deg))',
'rotate3d(1, 2, 3, calc(45deg + 1rad))': 'rotate3d(1, 2, 3, calc(102.296deg))',
'skew(calc(5deg + 0.1rad))': 'skew(calc(10.7296deg))',
'skew(calc(5deg + 0.1rad), 5deg)': 'skew(calc(10.7296deg), 5deg)',
'skew(5deg, calc(5deg + 0.1rad))': 'skew(5deg, calc(10.7296deg))',
'skewX(calc(5deg + 0.1rad))': 'skewX(calc(10.7296deg))',
'skewY(calc(5deg + 0.1rad))': 'skewY(calc(10.7296deg))',
'perspective(calc(10px + 5em))': 'perspective(calc(10px + 5em))',
};
for (let inputString in crashTestStrings) {
test(() => {
testElement.style.transform = inputString;
let result = testElement.styleMap.get('transform');
assert_equals(result.constructor, CSSStyleValue,
'result is a base CSSStyleValue');
assert_equals(result.toString(), crashTestStrings[inputString]);
}, "Getting transform when it is set to " + inputString + " does not crash");
}
// TODO(meade): Remove/update this test once translate is supported.
test(function() {
testElement.style.transform = 'translateY(50px)';
testElement.styleMap.entries();
}, "Unhandled translate case doesn't crash.");
test(function() {
// Clear transform
let transform = new CSSTransformValue([new CSSPerspective(CSS.px(-5))]);
assert_throws(new TypeError(), () => {
testElement.styleMap.set('transform', transform);
});
}, "Invalid perspective (negative length) doesn't crash");
</script>