<!DOCTYPE HTML><!-- webkit-test-runner [ experimental:WebAnimationsCSSIntegrationEnabled=false ] -->
<html>
<head>
  <title>CSSValue comparison test</title>
  <script type="text/javascript" src="../../resources/testharness.js"></script>
  <script type="text/javascript" src="../../resources/testharnessreport.js"></script>
</head>
<body onload="run()">
<p>This test verifies that CSSValue objects comparison works correctly.</p>
<div id="test" contenteditable></div>

<script type="text/javascript">
setup({ "explicit_done": true });

function run() {
    var styleElement = document.createElement("style");
    styleElement.type = "text/css";
    var styleTextNode = document.createTextNode("");
    styleElement.appendChild(styleTextNode);
    document.getElementsByTagName("head")[0].appendChild(styleElement);

    var div = document.getElementById("test");
    div.focus();

    function runTest(propertyName, styleSheetPropertyValue, inlineStylePropertyValue, expectedResult) {
      styleTextNode.data = "div { " + propertyName + " : " + styleSheetPropertyValue + "; }";
      document.execCommand('insertHTML', false, "<div id=\"insertedDiv\" style=\"" + propertyName + " : " + inlineStylePropertyValue + "; \"></div>");
      var insertedDiv = document.getElementById('insertedDiv');
      var result = expectedResult;
      if (propertyName in insertedDiv.style)
          result = insertedDiv.style[propertyName] === "";
      insertedDiv.remove();
      return result;
    }

   var tests = [ {"width" : ["20%", "2em", "2rem", "20px", "2cm", "20mm", "4in", "20pt", "10pc", "6vw", "6vh", "4vmin", "-webkit-calc(-100px + 100%)"]}, // lengths, calc
                  {"-webkit-transform" : ["rotate(15deg)", "rotate(1.55rad)", "rotate(200grad)", "rotate(0.5turn)"]}, // angle
                  {"background-image" : ["url(dummy://test.png)", "url(dummy://green.png)"]}, // uri
                  {"font-weight" : ["bold", "inherit"]}, // ident
                  {"content" : ["counter(a)", "counters(a, '.')"]}, // counter
                  {"content" : ["attr(a)", "attr(p)"]}, // attr
                  {"clip" : ["rect(40px, 0, 45px, -5px)", "rect(10px, 5px, 15px, -10px)"]}, // rect
                  {"border-radius" : ["30px 75px 15px 15px", "164px / 82px", "40px"]}, // quads
                  {"stop-color" : ["rgb(255,0,0)", "#FF5566"]}, // hex, rgb color
                  {"-webkit-clip-path" : ["polygon(evenodd, 10px 75px, 180px 180px, 100px 10px, 10px 180px, 180px 75px, 10px 75px)", "polygon(nonzero, 20% 20%, 80% 20%, 80% 80%, 20% 80%)"]}, // shape value
                  {"-webkit-animation-duration" : ["10s", "100ms"]}, // seconds, milliseconds
                  {"color" : ["red", "blue"]}, // ident
                  {"border-image-source" : ["url(resources/greenbox.png)", "url(resources/redbox.png)"]}, // image
                  {"border-image-slice" : ["1 2 3 4", "2 3 4 5"]}, // border image slice
                  {"cursor" : ["url(resources/greenbox.png) 0 0, pointer", "url(resources/cursor.png) 1 1, wait"]}, // cursor
                  {"font" : ["italic bold 12px/30px arial", "italic bold 8px/16px helvetica"]}, // font
                  {"background-image" : ["-webkit-gradient(linear, left top, left bottom, from(#ccc), to(#000))", "-webkit-gradient(radial, 45 45, 0, 52 50, 0, from(#A7D30C), to(rgba(1,159,98,0)), color-stop(90%, #019F62))"]}, // gradients
                  {"background-image" : ["radial-gradient(circle, #ccc, #000)"]}, // gradients
                  {"background-image" : ["linear-gradient(#000, #234)", "linear-gradient(to top, #000, #234)"]}, // gradients
                  {"background-image" : ["-webkit-cross-fade(url(dummy://example.png), url(dummy://example.png), 50%)", "-webkit-cross-fade(url(dummy://background.png), url(dummy://foreground.png), 80%)"]}, // crossfade
                  {"-webkit-box-reflect" : ["below 10px", "below 0px -webkit-gradient(linear, left top, left bottom, from(transparent), to(rgba(10, 55, 234, 1)))"]}, // reflect
                  {"-webkit-box-shadow" : ["0 -20px 10px red, 0 20px 10px blue", "0 20px 10px blue", "5px 5px 5px rgba(0, 0, 0, 0.3)"]}, // shadow
                  {"-webkit-transition-timing-function" : ["cubic-bezier(0.25, 0.1, 0.25, 1)", "linear", "steps(3, end)"]}, // timing functions
                  {"-webkit-transform" : ["rotate(30deg)", "translate(50px,50px)", "scale(2,4)", "skew(30deg,20deg)", "matrix(0.4,0.5,-0.5,0.4,0,0)"]}, // transforms
                  {"-webkit-line-box-contain" : ["inline-box", "font", "glyphs", "replaced"]}, // line-box-contain
                  {"background-image" : ["-webkit-image-set(url(dummy://test.png) 1x, url(dummy://test.png) 2x)", "-webkit-image-set(url(dummy://small.png) 2x, url(dummy://big.png) 3x)"]}, // image set
                  {"background-image" : ["image-set(url(dummy://test.png) 1x, url(dummy://test.png) 2x)", "image-set(url(dummy://small.png) 2x, url(dummy://big.png) 3x)"]}, // image set
                  {"-webkit-filter" : ["grayscale(100%) sepia(100%)", "sepia(10%) grayscale(50%)"]}, // filter
                  {"-webkit-dashboard-region" : ["dashboard-region(label circle)", "dashboard-region(label circle 1px 2px 3px 4px) dashboard-region(label rectangle 5px 6px 7px 8px)"]} // dashboard region
                ];

   for (var index in tests) {
        var testMap = tests[index];
        for (var key in testMap) {
            var testValues = testMap[key];

            // Tests for equality.
            for(var testIndex in testValues)
                test(function() {assert_true(runTest(key, testValues[testIndex], testValues[testIndex], true))}, "Two CSSValues \"" + testValues[testIndex] + "\" for property \"" + key + "\" are equal.");

            // Test that comparison of non-equal cssvalues return false.
            if (testValues.length > 1)
                test(function() {assert_false(runTest(key, testValues[0], testValues[1], false))}, "Two CSSValues \"" + testValues[0] + "\" and \"" + testValues[1] + "\" for property \"" + key + "\" are not equal.");
        }
    }

    done();
}

</script>
</body>
</html>
