summaryrefslogtreecommitdiffstats
path: root/layout/style/test/test_inherit_storage.html
blob: a9587d34d9ec641af01fa75c017aa58a59665583 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=375363
-->
<head>
  <title>Test for parsing, storage, and serialization of CSS 'inherit' on all properties and 'unset' on inherited properties</title>
  <script src="/tests/SimpleTest/SimpleTest.js"></script>
  <script type="text/javascript" src="property_database.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=375363">Mozilla Bug 375363</a>
<p id="display"></p>
<div id="content" style="display: none">

<div id="testnode"></div>

</div>
<pre id="test">
<script class="testbody" type="text/javascript">

/** Test for parsing, storage, and serialization of CSS 'inherit' on all
    properties and 'unset' on inherited properties **/

var gDeclaration = document.getElementById("testnode").style;

function test_property(property)
{
  var info = gCSSProperties[property];

  var keywords = ["inherit"];
  if (info.inherited)
    keywords.push("unset");

  keywords.forEach(function(keyword) {
    function check_initial(sproperty) {
      var sinfo = gCSSProperties[sproperty];
      var val = gDeclaration.getPropertyValue(sproperty);
      is(val, "", "value of '" + sproperty + "' before we do anything");
      is(val, gDeclaration[sinfo.domProp],
         "consistency between decl.getPropertyValue('" + sproperty + "') and decl." + sinfo.domProp);
    }
    check_initial(property);
    if ("subproperties" in info)
      for (var idx in info.subproperties)
        check_initial(info.subproperties[idx]);

    gDeclaration.setProperty(property, keyword, "");

    function check_set(sproperty) {
      var sinfo = gCSSProperties[sproperty];
      val = gDeclaration.getPropertyValue(sproperty);
      is(val, keyword,
         keyword + " reported back for property '" + sproperty + "'");
      is(val, gDeclaration[sinfo.domProp],
         "consistency between decl.getPropertyValue('" + sproperty +
         "') and decl." + sinfo.domProp);
    }
    check_set(property);
    if ("subproperties" in info)
      for (var idx in info.subproperties)
        check_set(info.subproperties[idx]);

    // We don't care particularly about the whitespace or the placement of
    // semicolons, but for simplicity we'll test the current behavior.
    if ("alias_for" in info) {
      is(gDeclaration.cssText, info.alias_for + ": " + keyword + ";",
        "declaration should serialize to exactly what went in (for " + keyword + ")");
    } else if (info.type == CSS_TYPE_LEGACY_SHORTHAND) {
      // We can't assert anything more meaningful here, really.
      is(property, "zoom", "Zoom is a bit special because it never " +
                           "serializes as-is, we always serialize the longhands, " +
                           "but it doesn't just map to a single property " +
                           "(and thus we can't use the 'alias_for' mechanism)");
    } else {
      is(gDeclaration.cssText, property + ": " + keyword + ";",
        "declaration should serialize to exactly what went in (for " + keyword + ")");
    }

    gDeclaration.removeProperty(property);

    function check_final(sproperty) {
      var sinfo = gCSSProperties[sproperty];
      var val = gDeclaration.getPropertyValue(sproperty);
      is(val, "", "value of '" + sproperty + "' after removal of value");
      is(val, gDeclaration[sinfo.domProp],
         "consistency between decl.getPropertyValue('" + sproperty + "') and decl." + sinfo.domProp);
    }
    check_final(property);
    if ("subproperties" in info)
      for (var idx in info.subproperties)
        check_final(info.subproperties[idx]);

    // can all properties be removed from the style?
    function test_remove_all_properties(propName, value) {
      var i, p = [];
      for (i = 0; i < gDeclaration.length; i++) p.push(gDeclaration[i]);
      for (i = 0; i < p.length; i++) gDeclaration.removeProperty(p[i]);
      var errstr = "when setting property " + propName + " to " + value;
      is(gDeclaration.length, 0, "unremovable properties " + errstr);
      is(gDeclaration.cssText, "", "non-empty serialization after removing all properties " + errstr);
    }

    // sanity check shorthands to make sure disabled props aren't exposed
    if (info.type != CSS_TYPE_LONGHAND) {
      gDeclaration.setProperty(property, keyword, "");
      test_remove_all_properties(property, keyword);
      gDeclaration.removeProperty(property);
    }
  });
}

for (var prop in gCSSProperties)
  test_property(prop);

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