blob: 1a13c47408c05a319a752fe08c5c003e07485035 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<style>
#computed-infer-vertical-border-spacing { border-spacing: 11px; }
#computed-infer-vertical-border-spacing-from-negative-horizontal-border-spacing { border-spacing: -11px; }
#computed-explicit-border-spacing { border-spacing: 13px 23px; }
#computed-explicit-negative-border-spacing { border-spacing: -5px -13px; }
#computed-explicit-border-spacing-with-negative-horizontal { border-spacing: -5px 13px; }
#computed-explicit-border-spacing-with-negative-vertical { border-spacing: 5px -13px; }
#missing-stylesheet-border-spacing { border-spacing: }
</style>
<script>
window.onload = runTests;
if (!String.prototype.trim) {
// Assume this script is being executed in Internet Explorer.
String.prototype.trim = function() {
return this.replace(/^\s+/, '').replace(/\s+$/, '');
}
}
function runTests()
{
debug('Valid values:');
testInferredVerticalBorderSpacing();
testExplicitBorderSpacing();
testComputedInferredVerticalBorderSpacing();
testComputedExplicitBorderSpacing();
debug('<br />Negative values:');
testInferredVerticalBorderSpacingFromNegativeHorizontalSpacing();
testExplicitNegativeBorderSpacing();
testExplicitBorderSpacingWithNegativeHorizontal();
testExplicitBorderSpacingWithNegativeVertical();
testComputedInferredVerticalBorderSpacingFromNegativeHorizontalSpacing();
testComputedExplicitNegativeBorderSpacing();
testComputedExplicitBorderSpacingWithNegativeHorizontal();
testComputedExplicitBorderSpacingWithNegativeVertical();
debug('<br />Missing values:');
testMissingBorderSpacing();
testMissingStylesheetBorderSpacing();
document.body.removeChild(document.getElementById("test-container"));
debug('<br /><span class="pass">TEST COMPLETE</span>');
}
function testInferredVerticalBorderSpacing()
{
var styleAttr = styleAttribute(document.getElementById("infer-vertical-border-spacing"));
shouldBeEqualToString('document.getElementById("infer-vertical-border-spacing").style.borderSpacing', parseCSSTextForPropertyValue(styleAttr, "border-spacing"));
}
function testExplicitBorderSpacing()
{
var styleAttr = styleAttribute(document.getElementById("explicit-border-spacing"));
shouldBeEqualToString('document.getElementById("explicit-border-spacing").style.borderSpacing', parseCSSTextForPropertyValue(styleAttr, "border-spacing"));
}
function testComputedInferredVerticalBorderSpacing()
{
shouldBeEqualToString('computedStyle(document.getElementById("computed-infer-vertical-border-spacing")).borderSpacing', "11px 11px");
shouldBeEqualToString('cssRule("#computed-infer-vertical-border-spacing").style.borderSpacing', "11px"); // Must match border-spacing for #computed-infer-vertical-border-spacing.
}
function testComputedExplicitBorderSpacing()
{
var expectedResult = "13px 23px"; // Must match border-spacing for #computed-explicit-border-spacing.
shouldBeEqualToString('computedStyle(document.getElementById("computed-explicit-border-spacing")).borderSpacing', expectedResult);
shouldBeEqualToString('cssRule("#computed-explicit-border-spacing").style.borderSpacing', expectedResult);
}
function testInferredVerticalBorderSpacingFromNegativeHorizontalSpacing()
{
// The expected value of the empty string follows from <http://www.w3.org/TR/html5/elements.html#the-style-attribute>,
// <http://www.w3.org/TR/css-style-attr/#syntax>, <http://www.w3.org/TR/CSS21/syndata.html#declaration>, <http://www.w3.org/TR/CSS21/syndata.html#length-units>,
// and the definition of "ignore" <http://www.w3.org/TR/CSS21/syndata.html#ignore>.
shouldBeEqualToString('document.getElementById("infer-vertical-border-spacing-from-negative-horizontal-spacing").style.borderSpacing', "");
}
function testExplicitNegativeBorderSpacing()
{
// The expected value of the empty string follows from <http://www.w3.org/TR/html5/elements.html#the-style-attribute>,
// <http://www.w3.org/TR/css-style-attr/#syntax>, <http://www.w3.org/TR/CSS21/syndata.html#declaration>, <http://www.w3.org/TR/CSS21/syndata.html#length-units>,
// and the definition of "ignore" <http://www.w3.org/TR/CSS21/syndata.html#ignore>.
shouldBeEqualToString('document.getElementById("explicit-negative-border-spacing").style.borderSpacing', "");
}
function testExplicitBorderSpacingWithNegativeHorizontal()
{
// The expected value of the empty string follows from <http://www.w3.org/TR/html5/elements.html#the-style-attribute>,
// <http://www.w3.org/TR/css-style-attr/#syntax>, <http://www.w3.org/TR/CSS21/syndata.html#declaration>, <http://www.w3.org/TR/CSS21/syndata.html#length-units>,
// and the definition of "ignore" <http://www.w3.org/TR/CSS21/syndata.html#ignore>.
shouldBeEqualToString('document.getElementById("explicit-border-spacing-with-negative-horizontal").style.borderSpacing', "");
}
function testExplicitBorderSpacingWithNegativeVertical()
{
// The expected value of the empty string follows from <http://www.w3.org/TR/html5/elements.html#the-style-attribute>,
// <http://www.w3.org/TR/css-style-attr/#syntax>, <http://www.w3.org/TR/CSS21/syndata.html#declaration>, <http://www.w3.org/TR/CSS21/syndata.html#length-units>,
// and the definition of "ignore" <http://www.w3.org/TR/CSS21/syndata.html#ignore>.
shouldBeEqualToString('document.getElementById("explicit-border-spacing-with-negative-vertical").style.borderSpacing', "");
}
function testComputedInferredVerticalBorderSpacingFromNegativeHorizontalSpacing()
{
// Expected results follow from the explanation given in testInferredVerticalBorderSpacingFromNegativeHorizontalSpacing().
shouldBeEqualToString('cssRule("#computed-infer-vertical-border-spacing-from-negative-horizontal-border-spacing").style.borderSpacing', "");
}
function testComputedExplicitNegativeBorderSpacing()
{
// Expected results follow from the explanation given in testExplicitNegativeBorderSpacing().
shouldBeEqualToString('cssRule("#computed-explicit-negative-border-spacing").style.borderSpacing', "");
}
function testComputedExplicitBorderSpacingWithNegativeHorizontal()
{
// Expected results follow from the explanation given in testExplicitBorderSpacingWithNegativeHorizontal().
shouldBeEqualToString('cssRule("#computed-explicit-border-spacing-with-negative-horizontal").style.borderSpacing', "");
}
function testComputedExplicitBorderSpacingWithNegativeVertical()
{
// Expected results follow from the explanation given in testExplicitBorderSpacingWithNegativeVertical().
shouldBeEqualToString('cssRule("#computed-explicit-border-spacing-with-negative-vertical").style.borderSpacing', "");
}
function testMissingBorderSpacing()
{
// Notice, a property with a missing value is considered a malformed declaration by
// <http://www.w3.org/TR/CSS21/syndata.html#parsing-errors>. Hence, we ignore the declaration.
shouldBeEqualToString('document.getElementById("missing-border-spacing").style.borderSpacing', "");
}
function testMissingStylesheetBorderSpacing()
{
// Expected results follow from the explanation given in testMissingBorderSpacing().
shouldBeEqualToString('cssRule("#missing-stylesheet-border-spacing").style.borderSpacing', "");
}
function styleAttribute(element)
{
var result = element.getAttribute("style");
if (typeof(result) === "object") {
// Assume this script is being executed in Internet Explorer.
result = result.cssText;
}
return result;
}
function computedStyle(element)
{
if (window.getComputedStyle)
return window.getComputedStyle(element, null);
return element.currentStyle; // Assume this script is being executed in Internet Explorer 8 or less.
}
function cssRule(ruleName)
{
if (!ruleName)
return;
if (!document.styleSheets)
return;
var NotFound = -1; // We can't make this "const" since IE (as of 8.0) doesn't support it.
// We normalize the name of the rule to be lowercase since it is case-insensitive by <http://www.w3.org/TR/CSS21/syndata.html#characters>.
var ruleName = ruleName.toLowerCase();
var lastRuleThatMatchedCriterion;
for (var i = 0; i < document.styleSheets.length; ++i) {
var rules = [];
try {
var rules = document.styleSheets[i].rules || document.styleSheets[i].cssRules; // IE has "rules" property; WebKit and Firefox have "cssRules".
} catch (e) {
// Firefox's same-origin policy for file URLs prevents access to cssRules for stylesheets that aren't within the
// same directory as the web page (e.g. ../../js/resources/). So, we ignore such exceptions that arise.
continue;
}
for (var r = 0; r < rules.length; ++r) {
if (rules[r].selectorText.toLowerCase() !== ruleName)
continue;
lastRuleThatMatchedCriterion = rules[r];
}
}
return lastRuleThatMatchedCriterion;
}
function parseCSSTextForPropertyValue(cssText, propertyName)
{
if (!cssText)
return String();
if (!propertyName)
return String();
// Some constants. We can't use "const" since IE (as of 8.0) doesn't support it.
var Colon = ':';
var Semicolon = ';';
var NotFound = -1;
// Note, CSS property names are case-insensitive, but its corresponding value can be case-
// sensitive (e.g. font-family) by section 4.1.3 of the CSS 2.1 spec <http://www.w3.org/TR/CSS21/syndata.html#characters>.
var cssTextLowerCase = cssText.toLowerCase();
var propertyName = propertyName.toLowerCase();
var startOfPropertyName = cssTextLowerCase.indexOf(propertyName);
if (startOfPropertyName === NotFound)
return;
var delimiter = cssTextLowerCase.indexOf(Colon, startOfPropertyName);
if (delimiter === NotFound)
return;
if (cssTextLowerCase.substr(startOfPropertyName, delimiter - startOfPropertyName).trim() !== propertyName)
return;
var startOfPropertyValue = delimiter + 1;
var endOfRule = cssTextLowerCase.indexOf(Semicolon, startOfPropertyValue);
return cssText.substr(startOfPropertyValue, endOfRule === NotFound ? cssText.length : endOfRule - startOfPropertyValue).trim(); // Preserve case-sensitivity of the property value.
}
</script>
</head>
<body>
<p id="description"></p>
<div id="test-container">
<table id="infer-vertical-border-spacing" style="border-spacing: 4px">
<tr><td>Infer vertical border spacing</td></tr>
</table>
<table id="explicit-border-spacing" style="border-spacing: 4px 5px">
<tr><td>Explicit horizontal and vertical border spacing</td></tr>
</table>
<table id="computed-infer-vertical-border-spacing">
<tr><td>Infer vertical border spacing (uses computed style)</td></tr>
</table>
<table id="computed-explicit-border-spacing">
<tr><td>Explicit horizontal and vertical border spacing (uses computed style)</td></tr>
</table>
<table id="infer-vertical-border-spacing-from-negative-horizontal-spacing" style="border-spacing: -5px">
<tr><td>Infer vertical border spacing from negative horizontal spacing</td></tr>
</table>
<table id="explicit-negative-border-spacing" style="border-spacing: -5px -13px">
<tr><td>Explicit negative horizontal and vertical border spacing</td></tr>
</table>
<table id="explicit-border-spacing-with-negative-horizontal" style="border-spacing: -5px 13px">
<tr><td>Explicit vertical and horizontal border spacing with negative horizontal border spacing</td></tr>
</table>
<table id="explicit-border-spacing-with-negative-vertical" style="border-spacing: 5px -13px">
<tr><td>Explicit vertical and horizontal border spacing with negative vertical border spacing</td></tr>
</table>
<table id="computed-infer-vertical-border-spacing-from-negative-horizontal-border-spacing">
<tr><td>Infer vertical border spacing from negative horizontal border spacing (uses computed style)</td></tr>
</table>
<table id="computed-explicit-negative-border-spacing">
<tr><td>Explicit negative horizontal and vertical border spacing (uses computed style)</td></tr>
</table>
<table id="computed-explicit-border-spacing-with-negative-horizontal">
<tr><td>Explicit horizontal and vertical border spacing with negative horizontal border spacing (uses computed style)</td></tr>
</table>
<table id="computed-explicit-border-spacing-with-negative-vertical">
<tr><td>Explicit horizontal and vertical border spacing with negative vertical border spacing (uses computed style)</td></tr>
</table>
<table id="missing-border-spacing" style="border-spacing: ">
<tr><td>Missing border spacing</td></tr>
</table>
<table id="missing-stylesheet-border-spacing">
<tr><td>Missing border-spacing value in stylesheet</td></tr>
</table>
</div>
<div id="console"></div>
<script>
description("This test checks that style.borderSpacing returns the correct result for valid, negative, and missing border-spacing values.");
</script>
</body>
</html>