<!doctype html>
<html>
 <head>
  <title>The blocks ignore line-height quirk</title>
  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>
  <style> iframe { width:200px; height:20px; } </style>
 </head>
 <body>
  <div id=log></div>
  <iframe id=quirks></iframe>
  <iframe id=almost></iframe>
  <iframe id=standards></iframe>
  <script>
    setup({explicit_done:true});
    onload = function() {
        var html = "<style id=style></style>";
        var a_doctype = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">';
        var s_doctype = '<!DOCTYPE HTML>';
        var q = document.getElementById('quirks').contentWindow;
        var a = document.getElementById('almost').contentWindow;
        var s = document.getElementById('standards').contentWindow;
        q.document.open();
        q.document.write(html);
        q.document.close();
        a.document.open();
        a.document.write(a_doctype + html);
        a.document.close();
        s.document.open();
        s.document.write(s_doctype + html);
        s.document.close();
        [q, a, s].forEach(function(win) {
            ['style', 'test', 'ref', 's_ref'].forEach(function(id) {
                win.__proto__.__defineGetter__(id, function() { return win.document.getElementById(id); });
            });
        });

        var tests = [
        {style:'#ref { display:block }', body:
        '<div id=test><font size=1>x</font></div>'+
        '<font id=ref size=1>x</font>'+
        '<div id=s_ref>x</div>'},

        {style:'#ref { display:block }', body:
        '<div id=test><font size=1>x</font><br><font size=1>x</font></div>'+
        '<font id=ref size=1>x<br>x</font>'+
        '<div id=s_ref>x<br>x</div>'},

        {style:'#ref { display:block }', body:
        '<div id=test><font size=1>foo</font><br><font size=1>foo</font><div>x</div></div>'+
        '<font id=ref size=1>foo<br>foo<br><font size=3>x</font></font>'+
        '<div id=s_ref>x<br>x<br>x</div>'},

        {style:'#ref { display:block } div, #ref { line-height:2 } span { font-size:50% }', body:
        '<div id=test><span>x</span></div>'+
        '<span id=ref>x</span>'+
        '<div id=s_ref>x</div>'},
        ];

        tests.forEach(function(t) {
            test(function() {
                q.style.textContent = t.style;
                a.style.textContent = t.style;
                s.style.textContent = t.style;
                q.document.body.innerHTML = t.body;
                a.document.body.innerHTML = t.body;
                s.document.body.innerHTML = t.body;

                assert_equals(q.getComputedStyle(q.test).height,
                              q.getComputedStyle(q.ref).height,
                              'quirks mode');
                assert_equals(a.getComputedStyle(a.test).height,
                              a.getComputedStyle(a.ref).height,
                              'almost standards mode');
                assert_equals(s.getComputedStyle(s.test).height,
                              s.getComputedStyle(s.s_ref).height,
                              'standards mode');
            }, document.title+', '+t.style+t.body);
        });

        done();
    }
  </script>
 </body>
</html>
