<!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});

    var png = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAACklEQVR4nGMAAQAABQABDQottAAAAABJRU5ErkJggg==";
    var preload = new Image();
    preload.src = png;

    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) {
                Object.getPrototypeOf(win).__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>
