layout/style/test/test_value_cloning.html

Thu, 15 Jan 2015 21:03:48 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 21:03:48 +0100
branch
TOR_BUG_9701
changeset 11
deefc01c0e14
permissions
-rw-r--r--

Integrate friendly tips from Tor colleagues to make (or not) 4.5 alpha 3;
This includes removal of overloaded (but unused) methods, and addition of
a overlooked call to DataStruct::SetData(nsISupports, uint32_t, bool.)

     1 <!DOCTYPE HTML>
     2 <html>
     3 <!--
     4 https://bugzilla.mozilla.org/show_bug.cgi?id=375363
     5 -->
     6 <head>
     7   <title>Test for cloning of CSS property values (including 'inherit', 'initial' and 'unset')</title>
     8   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
     9   <script type="text/javascript" src="property_database.js"></script>
    10   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
    11 </head>
    12 <body>
    13 <p id="display"><iframe id="iframe" src="about:blank"></iframe></p>
    14 <pre id="test">
    15 <script class="testbody" type="text/javascript">
    17 /** Test for cloning of CSS property values (including 'inherit', 'initial' and 'unset') **/
    18 var gTestUnset = SpecialPowers.getBoolPref("layout.css.unset-value.enabled");
    19 var test_queue = [];
    20 var iframe = document.getElementById("iframe");
    22 SimpleTest.waitForExplicitFinish();
    24 for (var prop in gCSSProperties) {
    25   var info = gCSSProperties[prop];
    27   test_queue.push({ prop: prop, value: "inherit",
    28                     inherited_value: info.initial_values[0] });
    29   test_queue.push({ prop: prop, value: "inherit",
    30                     inherited_value: info.other_values[0] });
    31   test_queue.push({ prop: prop, value: "initial" });
    32   if (gTestUnset) {
    33     if (info.inherited) {
    34       test_queue.push({ prop: prop, value: "unset",
    35                         inherited_value: info.initial_values[0] });
    36       test_queue.push({ prop: prop, value: "unset",
    37                         inherited_value: info.other_values[0] });
    38     } else {
    39       test_queue.push({ prop: prop, value: "unset" });
    40     }
    41   }
    42   for (var idx in info.initial_values) {
    43     test_queue.push({ prop: prop, value: info.initial_values[idx] });
    44   }
    45   for (var idx in info.other_values) {
    46     test_queue.push({ prop: prop, value: info.other_values[idx] });
    47   }
    48 }
    50 test_queue.reverse();
    52 doTest();
    54 function doTest()
    55 {
    56   var sheet_data = "";
    58   for (var idx = 0; idx < test_queue.length; ++idx) {
    59     var current_item = test_queue[idx];
    61     var info = gCSSProperties[current_item.prop];
    63     sheet_data += "#parent"+idx+", #test"+idx+" { ";
    64     for (var prereq in info.prereqs) {
    65       sheet_data += prereq + ": " + info.prereqs[prereq] + ";";
    66     }
    67     sheet_data += " }";
    69     sheet_data += "#parent"+idx+" { ";
    70     if ("inherited_value" in current_item) {
    71       sheet_data += current_item.prop + ": " + current_item.inherited_value;
    72     }
    73     sheet_data += "}";
    75     sheet_data += "#test"+idx+" { ";
    76     sheet_data += current_item.prop + ": " + current_item.value;
    77     sheet_data += "}";
    78   }
    80   var sheet_url = "data:text/css," + escape(sheet_data);
    82   var doc_data =
    83     "<!DOCTYPE HTML>\n" +
    84     "<link rel='stylesheet' type='text/css' href='" + sheet_url + "'>\n" +
    85     "<link rel='stylesheet' type='text/css' href='" + sheet_url + "'>\n" +
    86     "<body>\n";
    89   for (var idx = 0; idx < test_queue.length; ++idx) {
    90     var current_item = test_queue[idx];
    92     if ("inherited_value" in current_item) {
    93       doc_data += "<span id='parent"+idx+"'>";
    94     }
    95     doc_data += "<span id='test"+idx+"'></span>";
    96     if ("inherited_value" in current_item) {
    97       doc_data += "</span>";
    98     }
    99   }
   101   var doc_url = "data:text/html," + escape(doc_data);
   102   iframe.onload = iframe_loaded;
   103   iframe.src = doc_url;
   104 }
   106 function iframe_loaded(event)
   107 {
   108   if (event.target != iframe)
   109     return;
   111   var start_ser = [];
   112   var start_compute = [];
   113   var test_cs = [];
   114   var ifdoc = iframe.contentDocument;
   116   for (var idx = 0; idx < test_queue.length; ++idx) {
   117     var current_item = test_queue[idx];
   118     var info = gCSSProperties[current_item.prop];
   120     var test = ifdoc.getElementById("test" + idx);
   121     var cur_cs = iframe.contentWindow.getComputedStyle(test, "");
   122     test_cs.push(cur_cs);
   123     var cur_ser = ifdoc.styleSheets[0].cssRules[3*idx+2].style.getPropertyValue(current_item.prop);
   124     if (cur_ser == "") {
   125       isnot(cur_ser, "",
   126 	    "serialization should be nonempty for " +
   127 	    current_item.prop + ": " + current_item.value);
   128     }
   129     start_ser.push(cur_ser);
   131     var cur_compute;
   132     if (!("backend_only" in info)) {
   133       cur_compute = get_computed_value(cur_cs, current_item.prop);
   134       if (cur_compute == "") {
   135 	isnot(cur_compute, "",
   136 	      "computed value should be nonempty for " +
   137 	      current_item.prop + ": " + current_item.value);
   138       }
   139     } else {
   140       cur_compute = undefined;
   141     }
   142     start_compute.push(cur_compute);
   143   }
   145   // In case the above access didn't force a clone already (though it
   146   // currently does), clone the second style sheet's inner and then
   147   // remove the first.
   148   ifdoc.styleSheets[1].insertRule("#nonexistent { color: red }", 0);
   149   var firstlink = ifdoc.getElementsByTagName("link")[0];
   150   firstlink.parentNode.removeChild(firstlink);
   152   // Force a flush
   153   ifdoc.body.style.display="none";
   154   var ow = ifdoc.body.offsetWidth;
   155   ifdoc.body.style.display="";
   157   for (var idx = 0; idx < test_queue.length; ++idx) {
   158     var current_item = test_queue[idx];
   159     var info = gCSSProperties[current_item.prop];
   161     var end_ser =
   162       ifdoc.styleSheets[0].cssRules[3*idx+3].style.getPropertyValue(current_item.prop);
   163     is(end_ser, start_ser[idx],
   164        "serialization should match when cloning " +
   165        current_item.prop + ": " + current_item.value);
   167     if (!("backend_only" in info)) {
   168       var end_compute = get_computed_value(test_cs[idx], current_item.prop);
   169       // Output computed values only when the test failed.
   170       // Computed values may be very long.
   171       if (end_compute == start_compute[idx]) {
   172         ok(true,
   173            "computed values should match when cloning " +
   174            current_item.prop + ": " + current_item.value);
   175       } else {
   176         is(end_compute, start_compute[idx],
   177            "computed values should match when cloning " +
   178            current_item.prop + ": " + current_item.value);
   179       }
   180     }
   181   }
   183   SimpleTest.finish();
   184 }
   186 </script>
   187 </pre>
   188 </body>
   189 </html>

mercurial