blob: cb25c2a2083a5a2186692986b875e70b8972fbf5 [file] [log] [blame]
// Valid values for shape-outside. Two values are specified when the shape property value
// differs from the specified value. Three values are specified when the computed shape property value differs
// from the specified value.
// eg: "specified value/CSS Text value/computed style value"
// or: ["specified value", "CSS Text value/computed style value"]
// or: ["specified value", "CSS Text value", "Computed style value"]
var validShapeValues = [
"none",
"inset(10px)",
"inset(10px 9px)",
"inset(10px 9px 8px)",
"inset(10px 20px 30px 40px)",
["inset(10px 20px 30px 20px)", "inset(10px 20px 30px)"],
["inset(10px 20px 10px 20px)", "inset(10px 20px)"],
"inset(10px round 9px)",
"inset(10px round 0px / 0px 10px)",
["inset(10px round 9px / 9px)", "inset(10px round 9px)"],
"inset(10px round 9px / 8px)",
"inset(10px round 9px / 8px 7px)",
"inset(10px round 9px / 8px 7px 6px)",
"inset(10px round 9px / 8px 7px 6px 5px)",
"inset(10px round 9px 8px / 7px)",
"inset(10px round 9px 8px / 7px 6px)",
"inset(10px round 9px 8px / 7px 6px 5px)",
"inset(10px round 9px 8px / 7px 6px 5px 4px)",
"inset(10px round 9px 8px 7px / 6px)",
"inset(10px round 9px 8px 7px / 6px 5px)",
"inset(10px round 9px 8px 7px / 6px 5px 4px)",
"inset(10px round 9px 8px 7px / 6px 5px 4px 3px)",
"inset(10px round 9px 8px 7px 6px / 5px)",
"inset(10px round 9px 8px 7px 6px / 5px 4px)",
"inset(10px round 9px 8px 7px 6px / 5px 4px 3px)",
"inset(10px round 9px 8px 7px 6px / 5px 4px 3px 2px)",
["inset(10px round 10px 20px 30px 20px)", "inset(10px round 10px 20px 30px)"],
["inset(10px round 10px 20px 10px 20px)", "inset(10px round 10px 20px)"],
"inset(10px 20px 30px 40px round 5px 6px)",
"inset(10px 20px 30px 40px round 5px 6px 7px 8px / 50px 60px 70px 80px)",
"inset(10px round 0px / 10px)",
["inset(calc(25%*3 - 10in) 0 0 0)", "inset(calc(75% - 10in) 0px 0px)", "inset(calc(75% - 960px) 0px 0px)"],
["inset(10px 10px 10px 10px round calc(25%*3 - 10in))", "inset(10px round calc(75% - 10in))", "inset(10px round calc(75% - 960px))"],
["circle()", "circle(at 50% 50%)", "circle(at 50% 50%)"],
["circle(farthest-side)", "circle(farthest-side at 50% 50%)", "circle(farthest-side at 50% 50%)"],
["circle()", "circle(at 50% 50%)", "circle(at 50% 50%)"],
["circle(closest-side at 50px 50px)", "circle(at 50px 50px)", "circle(at 50px 50px)"],
["circle(10px)", "circle(10px at 50% 50%)", "circle(10px at 50% 50%)"],
["circle(10px at 10px)", "circle(10px at 10px 50%)"],
"circle(10px at 10px 10px)",
["circle(at 10px)", "circle(at 10px 50%)", "circle(at 10px 50%)"],
["circle(at 10px 10px)", "circle(at 10px 10px)", "circle(at 10px 10px)"],
["circle(at top left)", "circle(at 0% 0%)", "circle(at 0% 0%)"],
["circle(at right bottom)", "circle(at 100% 100%)", "circle(at 100% 100%)"],
["circle(10px at left top 10px)", "circle(10px at 0% 10px)", "circle(10px at 0% 10px)"],
["circle(10px at top 10px left 10px)", "circle(10px at 10px 10px)", "circle(10px at 10px 10px)"],
["circle(10px at right 10% bottom 10%)", "circle(10px at 90% 90%)"],
["circle(10px at right 0px bottom 0px)", "circle(10px at 100% 100%)"],
["circle(10px at right 10px bottom 10px)", "circle(10px at right 10px bottom 10px)"],
["ellipse()", "ellipse(at 50% 50%)", "ellipse(at 50% 50%)"],
["ellipse(10px)", "ellipse(10px at 50% 50%)", "ellipse(10px at 50% 50%)"],
["ellipse(10px 20px)", "ellipse(10px 20px at 50% 50%)", "ellipse(10px 20px at 50% 50%)"],
["ellipse(10px at 10px)", "ellipse(10px at 10px 50%)", "ellipse(10px at 10px 50%)"],
["ellipse(10px 20px at 10px)", "ellipse(10px 20px at 10px 50%)"],
["ellipse(10px at 10px 10px)", "ellipse(10px at 10px 10px)", "ellipse(10px at 10px 10px)"],
["ellipse(at 10px)", "ellipse(at 10px 50%)", "ellipse(at 10px 50%)"],
["ellipse(at 10px 10px)", "ellipse(at 10px 10px)", "ellipse(at 10px 10px)"],
["ellipse(at top left)", "ellipse(at 0% 0%)", "ellipse(at 0% 0%)"],
["ellipse(at right bottom)", "ellipse(at 100% 100%)", "ellipse(at 100% 100%)"],
["ellipse(10px at left top 10px)", "ellipse(10px at 0% 10px)", "ellipse(10px at 0% 10px)"],
["ellipse(10px at top 10px left 10px)", "ellipse(10px at 10px 10px)", "ellipse(10px at 10px 10px)"],
["ellipse(10px at right 10px bottom 10px)", "ellipse(10px at right 10px bottom 10px)", "ellipse(10px at right 10px bottom 10px)"],
["ellipse(10px 20px at left top 10px)", "ellipse(10px 20px at 0% 10px)", "ellipse(10px 20px at 0% 10px)"],
["ellipse(10px 20px at top 10px left 10px)", "ellipse(10px 20px at 10px 10px)", "ellipse(10px 20px at 10px 10px)"],
["ellipse(10px 20px at right 10px bottom 10px)", "ellipse(10px 20px at right 10px bottom 10px)"],
["ellipse(10px 10px at right 10% bottom 10%)", "ellipse(10px 10px at 90% 90%)"],
["ellipse(10px 10px at right 0px bottom 0px)", "ellipse(10px 10px at 100% 100%)"],
["ellipse(closest-side closest-side at 50px 50px)", "ellipse(at 50px 50px)", "ellipse(at 50px 50px)"],
["ellipse(farthest-side farthest-side at 50px 50px)", "ellipse(farthest-side farthest-side at 50px 50px)", "ellipse(farthest-side farthest-side at 50px 50px)"],
["ellipse(closest-side farthest-side at 50px 50px)", "ellipse(closest-side farthest-side at 50px 50px)", "ellipse(closest-side farthest-side at 50px 50px)"],
["ellipse(farthest-side closest-side at 50px 50px)", "ellipse(farthest-side at 50px 50px)", "ellipse(farthest-side at 50px 50px)"],
["polygon(10px 20px, 30px 40px, 40px 50px)", "polygon(10px 20px, 30px 40px, 40px 50px)"],
["polygon(evenodd, 10px 20px, 30px 40px, 40px 50px)", "polygon(evenodd, 10px 20px, 30px 40px, 40px 50px)"],
["polygon(nonzero, 10px 20px, 30px 40px, 40px 50px)", "polygon(10px 20px, 30px 40px, 40px 50px)"],
["polygon(10px calc(10in))", "polygon(10px calc(10in))", "polygon(10px 960px)"],
["polygon(calc(10in) 10px)", "polygon(calc(10in) 10px)", "polygon(960px 10px)"],
"content-box",
"padding-box",
"border-box",
"margin-box",
["polygon(nonzero, 0px 0px, 10px 10px, 10px 0px) content-box", "polygon(0px 0px, 10px 10px, 10px 0px) content-box"],
["polygon(nonzero, 0px 0px, 10px 10px, 10px 0px) padding-box", "polygon(0px 0px, 10px 10px, 10px 0px) padding-box"],
["polygon(nonzero, 0px 0px, 10px 10px, 10px 0px) border-box", "polygon(0px 0px, 10px 10px, 10px 0px) border-box"],
["polygon(nonzero, 0px 0px, 10px 10px, 10px 0px) margin-box", "polygon(0px 0px, 10px 10px, 10px 0px) margin-box"],
["content-box polygon(nonzero, 0px 0px, 10px 10px, 10px 0px)", "content-box polygon(0px 0px, 10px 10px, 10px 0px)", "polygon(0px 0px, 10px 10px, 10px 0px) content-box"],
["padding-box polygon(nonzero, 0px 0px, 10px 10px, 10px 0px)", "padding-box polygon(0px 0px, 10px 10px, 10px 0px)", "polygon(0px 0px, 10px 10px, 10px 0px) padding-box"],
["border-box polygon(nonzero, 0px 0px, 10px 10px, 10px 0px)", "border-box polygon(0px 0px, 10px 10px, 10px 0px)", "polygon(0px 0px, 10px 10px, 10px 0px) border-box"],
["margin-box polygon(nonzero, 0px 0px, 10px 10px, 10px 0px)", "margin-box polygon(0px 0px, 10px 10px, 10px 0px)", "polygon(0px 0px, 10px 10px, 10px 0px) margin-box"],
"linear-gradient(to right, red, blue)",
"radial-gradient(at 10px 20px, red 0%, blue 50%, green 95%)"
];
// Invalid values for shape-outside. When an invalid shape value is specified, the
// shape property's computed value is the same as its default.
var invalidShapeValues = [
"calc()",
"auto",
"inset()",
"inset(10px, 10px)",
"inset(10px 20px, 30px)",
"inset(10px, 20px 30px 40px)",
"inset(10px 20px 30px 40px 50px 60px)",
"inset(round)",
"inset(round 10px)",
"inset(10px round)",
"inset(10px round 10px /)",
"inset(10px round 20px 30px 40px 50px 60px)",
"inset(10px round /)",
"inset(10px round / 10px)",
"inset(/)",
"inset(/ 10px)",
"inset(round /)",
"circle(10px 20px)",
"circle(10px at 10px 10px 10px)",
"circle(10px at 10px 10px at center)",
"circle(10px at center center 10px)",
"circle(10px at 10% left)",
"circle(at 10px 10px 10px)",
"circle(at 10px 10px at center)",
"circle(at center center 10px)",
"circle(at 10px 10px closest-side)",
"circle(10px at)",
"circle(at)",
"ellipse(10px 20px 30px)",
"ellipse(10px at 10px 10px 10px)",
"ellipse(10px at 10px 10px at center)",
"ellipse(10px at center center 10px)",
"ellipse(10px 10px at 10% left)",
"ellipse(10px 20px 30px at center center 10px)",
"ellipse(at 10px 10px 10px)",
"ellipse(at 10px 10px at center)",
"ellipse(at center center 10px)",
"ellipse(10px 20px at)",
"ellipse(at)",
"polygon()",
"polygon(evenodd 10px 20px, 30px 40px, 40px 50px)",
"polygon(nonzero 10px 20px, 30px 40px, 40px 50px)",
"polygon(nonzero)",
"polygon(evenodd)",
"polygon(10px)",
"polygon(nonzero,10px)",
"polygon(evenodd,12px)",
"polygon(10px, 20px, 30px, 40px, 40px, 50px)",
"content-box content-box",
"polygon(nonzero, 0 0, 10px 10px, 10px 0) polygon(nonzero, 0 0, 10px 10px, 10px 0)",
"content-box polygon(nonzero, 0 0, 10px 10px, 10px 0) content-box",
"none content-box",
"url('shape.svg') content-box",
"url('shape.svg') polygon(nonzero, 0 0, 10px 10px, 10px 0)"
];
// Valid length values for shape-margin and shape-padding.
var validShapeLengths = [
"1.5ex",
"2em",
"2.5in",
"3cm",
"3.5mm",
"4pt",
"4.5pc",
"5px",
"120%"
];
// Invalid length values for shape-margin and shape-padding.
var invalidShapeLengths = [
"-5px",
"none",
"\'string\'"
];
function getCSSText(property, value)
{
var element = document.createElement("div");
element.style.cssText = property + ": " + value;
return element.style[property];
}
function getComputedStyleValue(property, value)
{
var element = document.createElement("div");
document.body.appendChild(element);
element.style.setProperty(property, value);
var computedValue = getComputedStyle(element).getPropertyValue(property);
document.body.removeChild(element);
return computedValue;
}
function getParentAndChildComputedStyles(property, parentValue, childValue)
{
var parentElement = document.createElement("div");
document.body.appendChild(parentElement);
parentElement.style.setProperty(property, parentValue);
var childElement = document.createElement("div");
parentElement.appendChild(childElement);
childElement.style.setProperty(property, childValue);
var parentComputedValue = getComputedStyle(parentElement).getPropertyValue(property);
var childComputedValue = getComputedStyle(childElement).getPropertyValue(property);
parentElement.removeChild(childElement);
document.body.removeChild(parentElement);
return {parent: parentComputedValue, child: childComputedValue};
}
function getParentAndChildComputedStylesString(property, parentValue, childValue)
{
var styles = getParentAndChildComputedStyles(property, parentValue, childValue);
return "parent: " + styles.parent + ", child: " + styles.child;
}
function getChildComputedStyle(property, parentValue, childValue)
{
var styles = getParentAndChildComputedStyles(property, parentValue, childValue);
return styles.child;
}
function testShapeSpecifiedProperty(property, value, expectedValue)
{
shouldBeEqualToString('getCSSText("' + property + '", "' + value + '")', expectedValue);
}
function testShapeComputedProperty(property, value, expectedValue)
{
shouldBeEqualToString('getComputedStyleValue("' + property + '", "' + value + '")', expectedValue);
}
function testNotInheritedShapeChildProperty(property, parentValue, childValue, expectedChildValue)
{
shouldBeEqualToString('getChildComputedStyle("' + property + '", "' + parentValue + '", "' + childValue + '")', expectedChildValue);
}
// Need to remove the base URL to avoid having local paths in the expected results.
function removeBaseURL(src) {
var urlRegexp = /url\("([^\)]*)"\)/g;
return src.replace(urlRegexp, function(match, url) {
return "url(\"" + url.substr(url.lastIndexOf("/") + 1) + "\")";
});
}
function testLocalURLShapeProperty(property, value, expected)
{
shouldBeEqualToString('removeBaseURL(getCSSText("' + property + '", "' + value + '"))', expected);
shouldBeEqualToString('removeBaseURL(getComputedStyleValue("' + property + '", "' + value + '"))', expected);
}
function testShapePropertyParsingFailure(property, value, defaultComputedStyle)
{
shouldBeEqualToString('getCSSText("' + property + '", "' + value + '")', '');
shouldBeEqualToString('getComputedStyleValue("' + property + '", "' + value + '")', defaultComputedStyle);
}
function testNotInheritedShapeProperty(property, parentValue, childValue, expectedValue)
{
shouldBeEqualToString('getParentAndChildComputedStylesString("' + property + '", "' + parentValue + '", "' + childValue + '")', expectedValue);
}
function applyToEachArglist(testFunction, arglists)
{
arglists.forEach(function(arglist, i, a) {testFunction.apply(null, arglist);});
}