<!doctype html>
<html>
 <head>
  <title>The table cell nowrap minimum width calculation 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 png = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg==";
        var preload = new Image();
        preload.src = png;
        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); });
            });
        });
        q.title = 'quirks mode';
        a.title = 'almost standards mode';
        s.title = 'standards mode';

        var tests = [
        {desc:"basic",
        style:'table { width:8px } #test { width:10px }',
        body:'<table><tr><td id=test nowrap></table>'+
        '<table><tr><td id=ref><img src="{png}" width=10></table>'+
        '<table><tr><td id=s_ref></table>'},
        ];

        tests.forEach(function(t) {
            test(function() {
                var style = t.style.replace(/\{png\}/g, png);
                var body = t.body.replace(/\{png\}/g, png);
                [q, a, s].forEach(function(win) {
                    win.style.textContent = style;
                    win.document.body.innerHTML = body;
                    assert_equals(win.getComputedStyle(win.test).width,
                                  win.getComputedStyle(win == q ? win.ref : win.s_ref).width,
                                  win.title);
                });
            }, document.title+', '+t.desc);
        });

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