| <!DOCTYPE> |
| <html> |
| <head> |
| <script src="../../resources/js-test-pre.js"></script> |
| </head> |
| <body> |
| <p id="description"></p> |
| <div id="console"></div> |
| <script> |
| description("Test the parsing of the filter property."); |
| |
| function jsWrapperClass(node) |
| { |
| if (!node) |
| return "[null]"; |
| var string = Object.prototype.toString.apply(node); |
| return string.substr(8, string.length - 9); |
| } |
| |
| function shouldBeType(expression, className, prototypeName, constructorName) |
| { |
| if (!prototypeName) |
| prototypeName = className + "Prototype"; |
| if (!constructorName) |
| constructorName = className + "Constructor"; |
| shouldBe("jsWrapperClass(" + expression + ")", "'" + className + "'"); |
| shouldBe("jsWrapperClass(" + expression + ".__proto__)", "'" + prototypeName + "'"); |
| shouldBe("jsWrapperClass(" + expression + ".constructor)", "'Function'"); |
| } |
| |
| // These have to be global for the test helpers to see them. |
| var stylesheet, cssRule, declaration, filterRule, subRule; |
| var styleElement = document.createElement("style"); |
| document.head.appendChild(styleElement); |
| stylesheet = styleElement.sheet; |
| |
| function testFilterRule(description, rule, expectedLength, expectedValue, expectedTexts) |
| { |
| debug(""); |
| debug(`${description} : ${rule}`); |
| |
| stylesheet.insertRule(`body { filter: ${rule}; }`, 0); |
| cssRule = stylesheet.cssRules.item(0); |
| |
| shouldBe("cssRule.type", "1"); |
| |
| declaration = cssRule.style; |
| shouldBe("declaration.length", "1"); |
| shouldBeEqualToString("declaration.getPropertyValue('filter')", expectedValue); |
| |
| filterRule = declaration.getPropertyCSSValue("filter"); |
| shouldBeType("filterRule", "CSSValueList"); |
| |
| shouldBe("filterRule.length", `${expectedLength}`); |
| |
| if (filterRule) { |
| for (var i = 0; i < expectedLength; i++) { |
| subRule = filterRule[i]; |
| shouldBeEqualToString("subRule.cssText", expectedTexts[i]); |
| } |
| } |
| |
| stylesheet.deleteRule(0); |
| } |
| |
| function testInvalidFilterRule(description, rule) |
| { |
| debug(""); |
| debug(`${description} : ${rule}`); |
| |
| stylesheet.insertRule(`body { filter: ${rule}; }`, 0); |
| cssRule = stylesheet.cssRules.item(0); |
| |
| shouldBe("cssRule.type", "1"); |
| |
| declaration = cssRule.style; |
| shouldBe("declaration.length", "0"); |
| shouldBe("declaration.getPropertyValue('filter')", "''"); |
| |
| stylesheet.deleteRule(0); |
| } |
| |
| testFilterRule("Basic reference", |
| "url('#a')", 1, 'url("#a")', |
| ['url("#a")']); |
| |
| testFilterRule("Bare unquoted reference converting to quoted form", |
| "url(#a)", 1, 'url("#a")', |
| ['url("#a")']); |
| |
| testFilterRule("Multiple references", |
| "url('#a') url('#b')", 2, 'url("#a") url("#b")', |
| ['url("#a")', 'url("#b")']); |
| |
| testFilterRule("Reference as 2nd value", |
| "grayscale(1) url('#a')", 2, 'grayscale(1) url("#a")', |
| ["grayscale(1)", 'url("#a")']); |
| |
| testFilterRule("Integer value", |
| "grayscale(1)", 1, "grayscale(1)", |
| ["grayscale(1)"]); |
| |
| testFilterRule("Percentage value", |
| "grayscale(50%)", 1, "grayscale(50%)", |
| ["grayscale(50%)"]); |
| |
| testFilterRule("Float value converts to integer", |
| "grayscale(1.0)", 1, "grayscale(1)", |
| ["grayscale(1)"]); |
| |
| testFilterRule("Values over 1 are clamped", |
| "grayscale(1.5)", 1, "grayscale(1)", |
| ["grayscale(1)"]); |
| |
| testFilterRule("Percentages over 100 are clamped", |
| "grayscale(320%)", 1, "grayscale(100%)", |
| ["grayscale(100%)"]); |
| |
| testFilterRule("Zero value", |
| "grayscale(0)", 1, "grayscale(0)", |
| ["grayscale(0)"]); |
| |
| testFilterRule("No values", |
| "grayscale()", 1, "grayscale()", |
| ["grayscale()"]); |
| |
| testFilterRule("Multiple values", |
| "grayscale(0.5) grayscale(0.25)", 2, "grayscale(0.5) grayscale(0.25)", |
| ["grayscale(0.5)", "grayscale(0.25)"]); |
| |
| testFilterRule("Integer value", |
| "sepia(1)", 1, "sepia(1)", |
| ["sepia(1)"]); |
| |
| testFilterRule("Percentage value", |
| "sepia(50%)", 1, "sepia(50%)", |
| ["sepia(50%)"]); |
| |
| testFilterRule("Float value converts to integer", |
| "sepia(1.0)", 1, "sepia(1)", |
| ["sepia(1)"]); |
| |
| testFilterRule("Values over 1 are clamped", |
| "sepia(8)", 1, "sepia(1)", |
| ["sepia(1)"]); |
| |
| testFilterRule("Percentages over 100 are clamped", |
| "sepia(101%)", 1, "sepia(100%)", |
| ["sepia(100%)"]); |
| |
| testInvalidFilterRule("Negative value", "sepia(-0.5)"); |
| |
| testFilterRule("Zero value", |
| "sepia(0)", 1, "sepia(0)", |
| ["sepia(0)"]); |
| |
| testFilterRule("No values", |
| "sepia()", 1, "sepia()", |
| ["sepia()"]); |
| |
| testInvalidFilterRule("Negative value", "grayscale(-0.2)"); |
| |
| testFilterRule("Multiple values", |
| "sepia(0.5) sepia(0.25)", 2, "sepia(0.5) sepia(0.25)", |
| ["sepia(0.5)", "sepia(0.25)"]); |
| |
| testFilterRule("Rule combinations", |
| "sepia(0.5) grayscale(0.25)", 2, "sepia(0.5) grayscale(0.25)", |
| ["sepia(0.5)", "grayscale(0.25)"]); |
| |
| testFilterRule("Integer value", |
| "saturate(1)", 1, "saturate(1)", |
| ["saturate(1)"]); |
| |
| testFilterRule("Percentage value", |
| "saturate(50%)", 1, "saturate(50%)", |
| ["saturate(50%)"]); |
| |
| testFilterRule("Percentage value > 1", |
| "saturate(250%)", 1, "saturate(250%)", |
| ["saturate(250%)"]); |
| |
| testFilterRule("Float value converts to integer", |
| "saturate(1.0)", 1, "saturate(1)", |
| ["saturate(1)"]); |
| |
| testFilterRule("Input value > 1", |
| "saturate(5.5)", 1, "saturate(5.5)", |
| ["saturate(5.5)"]); |
| |
| testInvalidFilterRule("Negative value", "saturate(-0.5)"); |
| |
| testFilterRule("Zero value", |
| "saturate(0)", 1, "saturate(0)", |
| ["saturate(0)"]); |
| |
| testFilterRule("No values", |
| "saturate()", 1, "saturate()", |
| ["saturate()"]); |
| |
| testFilterRule("Multiple values", |
| "saturate(0.5) saturate(0.25)", 2, "saturate(0.5) saturate(0.25)", |
| ["saturate(0.5)", "saturate(0.25)"]); |
| |
| testFilterRule("Rule combinations", |
| "saturate(0.5) grayscale(0.25)", 2, "saturate(0.5) grayscale(0.25)", |
| ["saturate(0.5)", "grayscale(0.25)"]); |
| |
| testFilterRule("Degrees value as integer", |
| "hue-rotate(10deg)", 1, "hue-rotate(10deg)", |
| ["hue-rotate(10deg)"]); |
| |
| testFilterRule("Degrees float value converts to integer", |
| "hue-rotate(10.0deg)", 1, "hue-rotate(10deg)", |
| ["hue-rotate(10deg)"]); |
| |
| testFilterRule("Radians value", |
| "hue-rotate(10rad)", 1, "hue-rotate(10rad)", |
| ["hue-rotate(10rad)"]); |
| |
| testFilterRule("Gradians value", |
| "hue-rotate(10grad)", 1, "hue-rotate(10grad)", |
| ["hue-rotate(10grad)"]); |
| |
| testFilterRule("Turns value", |
| "hue-rotate(0.5turn)", 1, "hue-rotate(0.5turn)", |
| ["hue-rotate(0.5turn)"]); |
| |
| testFilterRule("Negative value", |
| "hue-rotate(-370.2deg)", 1, "hue-rotate(-370.2deg)", |
| ["hue-rotate(-370.2deg)"]); |
| |
| testFilterRule("Zero value", |
| "hue-rotate(0)", 1, "hue-rotate(0deg)", |
| ["hue-rotate(0deg)"]); |
| |
| testFilterRule("No values", |
| "hue-rotate()", 1, "hue-rotate()", |
| ["hue-rotate()"]); |
| |
| testFilterRule("Rule combinations", |
| "hue-rotate(10deg) grayscale(0.25)", 2, "hue-rotate(10deg) grayscale(0.25)", |
| ["hue-rotate(10deg)", "grayscale(0.25)"]); |
| |
| testFilterRule("Integer value", |
| "invert(1)", 1, "invert(1)", |
| ["invert(1)"]); |
| |
| testFilterRule("Percentage value", |
| "invert(50%)", 1, "invert(50%)", |
| ["invert(50%)"]); |
| |
| testFilterRule("Float value converts to integer", |
| "invert(1.0)", 1, "invert(1)", |
| ["invert(1)"]); |
| |
| testFilterRule("Values over 1 are clamped", |
| "invert(1.01)", 1, "invert(1)", |
| ["invert(1)"]); |
| |
| testFilterRule("Percentages over 100 are clamped", |
| "invert(500000%)", 1, "invert(100%)", |
| ["invert(100%)"]); |
| |
| testFilterRule("Zero value", |
| "invert(0)", 1, "invert(0)", |
| ["invert(0)"]); |
| |
| testInvalidFilterRule("Negative value", "invert(-0.5)"); |
| |
| testFilterRule("No values", |
| "invert()", 1, "invert()", |
| ["invert()"]); |
| |
| testFilterRule("Multiple values", |
| "invert(0.5) invert(0.25)", 2, "invert(0.5) invert(0.25)", |
| ["invert(0.5)", "invert(0.25)"]); |
| |
| testFilterRule("Rule combinations", |
| "invert(0.5) grayscale(0.25)", 2, "invert(0.5) grayscale(0.25)", |
| ["invert(0.5)", "grayscale(0.25)"]); |
| |
| testFilterRule("Integer value", |
| "opacity(1)", 1, "opacity(1)", |
| ["opacity(1)"]); |
| |
| testFilterRule("Percentage value", |
| "opacity(50%)", 1, "opacity(50%)", |
| ["opacity(50%)"]); |
| |
| testFilterRule("Float value converts to integer", |
| "opacity(1.0)", 1, "opacity(1)", |
| ["opacity(1)"]); |
| |
| testFilterRule("Values over 1 are clamped", |
| "opacity(2134687326)", 1, "opacity(1)", |
| ["opacity(1)"]); |
| |
| testFilterRule("Percentages over 100 are clamped", |
| "opacity(500%)", 1, "opacity(100%)", |
| ["opacity(100%)"]); |
| |
| testInvalidFilterRule("Negative value", "opacity(-0.5)"); |
| |
| testFilterRule("Zero value", |
| "opacity(0)", 1, "opacity(0)", |
| ["opacity(0)"]); |
| |
| testFilterRule("No values", |
| "opacity()", 1, "opacity()", |
| ["opacity()"]); |
| |
| testFilterRule("Multiple values", |
| "opacity(0.5) opacity(0.25)", 2, "opacity(0.5) opacity(0.25)", |
| ["opacity(0.5)", "opacity(0.25)"]); |
| |
| testFilterRule("Rule combinations", |
| "opacity(0.5) grayscale(0.25)", 2, "opacity(0.5) grayscale(0.25)", |
| ["opacity(0.5)", "grayscale(0.25)"]); |
| |
| testFilterRule("Integer value", |
| "brightness(1)", 1, "brightness(1)", |
| ["brightness(1)"]); |
| |
| testFilterRule("Percentage value", |
| "brightness(50%)", 1, "brightness(50%)", |
| ["brightness(50%)"]); |
| |
| testFilterRule("Float value converts to integer", |
| "brightness(1.0)", 1, "brightness(1)", |
| ["brightness(1)"]); |
| |
| testFilterRule("Zero value", |
| "brightness(0)", 1, "brightness(0)", |
| ["brightness(0)"]); |
| |
| testInvalidFilterRule("Negative value", "brightness(-2)"); |
| |
| testFilterRule("No values", |
| "brightness()", 1, "brightness()", |
| ["brightness()"]); |
| |
| testFilterRule("Multiple values", |
| "brightness(0.5) brightness(0.25)", 2, "brightness(0.5) brightness(0.25)", |
| ["brightness(0.5)", "brightness(0.25)"]); |
| |
| testFilterRule("Rule combinations", |
| "brightness(0.5) grayscale(0.25)", 2, "brightness(0.5) grayscale(0.25)", |
| ["brightness(0.5)", "grayscale(0.25)"]); |
| |
| testInvalidFilterRule("Value less than -100%", "brightness(-1.1)"); |
| testInvalidFilterRule("Negative value", "brightness(-0.6)"); |
| |
| testFilterRule("Parameter more than 100%", |
| "brightness(101%)", 1, "brightness(101%)", |
| ["brightness(101%)"]); |
| |
| testFilterRule("Rule combinations", |
| "grayscale(0.25) brightness(0.5)", 2, "grayscale(0.25) brightness(0.5)", |
| ["grayscale(0.25)", "brightness(0.5)"]); |
| |
| testFilterRule("Integer value", |
| "contrast(1)", 1, "contrast(1)", |
| ["contrast(1)"]); |
| |
| testFilterRule("Percentage value", |
| "contrast(50%)", 1, "contrast(50%)", |
| ["contrast(50%)"]); |
| |
| testFilterRule("Percentage value > 1", |
| "contrast(250%)", 1, "contrast(250%)", |
| ["contrast(250%)"]); |
| |
| testFilterRule("Float value converts to integer", |
| "contrast(1.0)", 1, "contrast(1)", |
| ["contrast(1)"]); |
| |
| testFilterRule("Zero value", |
| "contrast(0)", 1, "contrast(0)", |
| ["contrast(0)"]); |
| |
| testInvalidFilterRule("Negative value", "contrast(-0.2)"); |
| |
| testFilterRule("No values", |
| "contrast()", 1, "contrast()", |
| ["contrast()"]); |
| |
| testFilterRule("Value greater than one", |
| "contrast(2)", 1, "contrast(2)", |
| ["contrast(2)"]); |
| |
| testInvalidFilterRule("Negative value", "contrast(-0.8)"); |
| |
| testFilterRule("Multiple values", |
| "contrast(0.5) contrast(0.25)", 2, "contrast(0.5) contrast(0.25)", |
| ["contrast(0.5)", "contrast(0.25)"]); |
| |
| testFilterRule("Rule combinations", |
| "contrast(0.5) grayscale(0.25)", 2, "contrast(0.5) grayscale(0.25)", |
| ["contrast(0.5)", "grayscale(0.25)"]); |
| |
| testFilterRule("Rule combinations", |
| "grayscale(0.25) contrast(0.5)", 2, "grayscale(0.25) contrast(0.5)", |
| ["grayscale(0.25)", "contrast(0.5)"]); |
| |
| testFilterRule("One zero to px", |
| "blur(0)", 1, "blur(0px)", |
| ["blur(0px)"]); |
| |
| testFilterRule("One length", |
| "blur(10px)", 1, "blur(10px)", |
| ["blur(10px)"]); |
| |
| testFilterRule("No values", |
| "blur()", 1, "blur()", |
| ["blur()"]); |
| |
| testInvalidFilterRule("Negative value", "blur(-2px)"); |
| |
| testFilterRule("Color then three values", |
| "drop-shadow(red 1px 2px 3px)", 1, "drop-shadow(red 1px 2px 3px)", |
| ["drop-shadow(red 1px 2px 3px)"]); |
| |
| testFilterRule("Three values then color", |
| "drop-shadow(1px 2px 3px red)", 1, "drop-shadow(red 1px 2px 3px)", |
| ["drop-shadow(red 1px 2px 3px)"]); |
| |
| testFilterRule("Color then three values with zero length", |
| "drop-shadow(#abc 0 0 0)", 1, "drop-shadow(rgb(170, 187, 204) 0px 0px 0px)", |
| ["drop-shadow(rgb(170, 187, 204) 0px 0px 0px)"]); |
| |
| testFilterRule("Three values with zero length", |
| "drop-shadow(0 0 0)", 1, "drop-shadow(0px 0px 0px)", |
| ["drop-shadow(0px 0px 0px)"]); |
| |
| testFilterRule("Two values no color", |
| "drop-shadow(1px 2px)", 1, "drop-shadow(1px 2px)", |
| ["drop-shadow(1px 2px)"]); |
| |
| testFilterRule("Multiple operations", |
| "grayscale(0.5) sepia(0.25) saturate(0.75) hue-rotate(35deg) invert(0.2) opacity(0.9) blur(5px) drop-shadow(green 1px 2px 3px)", 8, |
| "grayscale(0.5) sepia(0.25) saturate(0.75) hue-rotate(35deg) invert(0.2) opacity(0.9) blur(5px) drop-shadow(green 1px 2px 3px)", |
| [ |
| "grayscale(0.5)", |
| "sepia(0.25)", |
| "saturate(0.75)", |
| "hue-rotate(35deg)", |
| "invert(0.2)", |
| "opacity(0.9)", |
| "blur(5px)", |
| "drop-shadow(green 1px 2px 3px)" |
| ]); |
| |
| successfullyParsed = true; |
| |
| </script> |
| <script src="../../resources/js-test-post.js"></script> |
| </body> |
| </html> |