| <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN"> |
| <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 image-set function."); |
| |
| 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 imageSetRule, subRule; |
| |
| function testImageSetRule(description, property, rule, expectedLength, expectedTexts) |
| { |
| debug(""); |
| debug(description + " : " + rule); |
| |
| var div = document.createElement("div"); |
| div.setAttribute("style", property + ": image-set(" + rule + ")"); |
| document.body.appendChild(div); |
| |
| imageSetRule = div.style.getPropertyCSSValue(property); |
| shouldBeType("imageSetRule", "CSSValueList"); |
| |
| if (imageSetRule) { |
| if (jsWrapperClass(imageSetRule[0]) == "CSSValueList") { |
| // The content property returns a CSSValueList anyway, so to get to the |
| // imageSet CSS value list, we have to look at the first entry in the |
| // content value list. |
| imageSetRule = imageSetRule[0]; |
| } |
| } |
| |
| shouldBe("imageSetRule.length", function() { return expectedLength; }); |
| |
| if (imageSetRule) { |
| for (var i = 0; i < expectedLength; i++) { |
| string = imageSetRule[i]; |
| if (i % 2 == 0 && string.cssText.includes('#')) { |
| subRule = string.cssText.split('#')[1].replace('"', ""); |
| subRule = subRule.split(')')[0]; |
| shouldBe("subRule", "'" + expectedTexts[i] + "'"); |
| } else { |
| subRule = string; |
| shouldBe("subRule.cssText", "'" + expectedTexts[i] + "'"); |
| } |
| } |
| } |
| |
| document.body.removeChild(div); |
| } |
| |
| testImageSetRule("Single value for background-image with gradient", |
| "background-image", |
| "linear-gradient(green, white) 1x", 2, |
| ["linear-gradient(green, white)", "1dppx"]); |
| testImageSetRule("Single value for content with gradient", |
| "background-image", |
| "linear-gradient(green, white) 1x", 2, |
| ["linear-gradient(green, white)", "1dppx"]); |
| |
| testImageSetRule("Single value for background-image with gradients", |
| "background-image", |
| "linear-gradient(green, white) 1x, radial-gradient(blue, white) 2x", 4, |
| ["linear-gradient(green, white)", "1dppx", "radial-gradient(blue, white)", "2dppx"]); |
| |
| testImageSetRule("Combined gradient and URL", |
| "background-image", |
| "url('#a') 1x, linear-gradient(green, white) 2x", 4, |
| ["a", "1dppx", "linear-gradient(green, white)", "2dppx"]); |
| |
| testImageSetRule("Combined gradient and URL in content", |
| "content", |
| "url('#a') 1x, linear-gradient(green, white) 2x", 4, |
| ["a", "1dppx", "linear-gradient(green, white)", "2dppx"]); |
| |
| testImageSetRule("Combined gradient and cross-fade", |
| "background-image", |
| "-webkit-cross-fade(url('#a'), url('#b'), 70%) 1x, linear-gradient(green, white) 2x", 4, |
| ["a", "1dppx", "linear-gradient(green, white)", "2dppx"]); |
| |
| testImageSetRule("Single value for background-image with gradient and dpi", |
| "background-image", |
| "linear-gradient(green, white) 192dpi", 2, |
| ["linear-gradient(green, white)", "192dpi"]); |
| |
| |
| successfullyParsed = true; |
| </script> |
| <script src="../../resources/js-test-post.js"></script> |
| </body> |
| </html> |