<html>
<head>
<title>Line breaks after span inlines - Latin1</title>
</head>
<body>
<meta charset=utf-8>
<div>
<p>With span inline on first word, Latin1 in second position of second word.</p>
<p style="font-family:courier; font-size:15px; width: 25px"><span>xx</span> xéx</p>
<p>With span inline on first word, Latin1 in first position of second word.</p>
<p style="font-family:courier; font-size:15px; width: 25px"><span>xx</span> éxx</p>
<p>With span inline on first word, no Latin1 in second word.</p>
<p style="font-family:courier; font-size:15px; width: 25px"><span>xx</span> xxx</p>
<p>Without span, Latin1 in second position of second word.</p>
<p style="font-family:courier; font-size:15px; width: 25px">xx xéx</p>
<p>Without span, Latin1 in first position of second word.</p>
<p style="font-family:courier; font-size:15px; width: 25px">xx éxx</p>
<p>Without span, no Latin1 in second word.</p>
<p style="font-family:courier; font-size:15px; width: 25px">xx xxx</p>
</div>
<div><pre id=results></pre></div>
<script>
if (window.testRunner)
    testRunner.dumpAsText();

function mergeRect(rects, rect) {
    var newRects = [];
    if (!rects.length)
        newRects.push(rect);
    else {
        for (var i = 0; i < rects.length; ++i) {
            var r = rects[i];
            if (!rect)
                newRects.push(r);
            else if (rect.top < r.top) {
                newRects.push(rect);
                newRects.push(r);
                rect = null;
            } else if (rect.top == r.top) {
                if (rect.left + rect.width > r.left + r.width)
                    r.width = rect.left + rect.width - r.left;
                newRects.push(r);
                rect = null;
            } else
                newRects.push(r);
        }
        if (rect)
            newRects.push(rect);
    }
    return newRects;
}

function mergeRects(rects, newRects) {
    for (var i = 0; i < newRects.length; ++i)
        rects = mergeRect(rects, newRects[i]);
    return rects;
}

function getLineRects(paragraphNumber) {
    var range = document.createRange();
    var paragraphs = document.getElementsByTagName("p");
    var p = paragraphs[paragraphNumber];
    var rects = [];
    for (var i = 0; i < p.childNodes.length; ++i) {
        range.setStart(p, i);
        range.setEnd(p, i + 1);                     
        rects = mergeRects(rects, range.getClientRects());
    }
    return rects;
}

function appendResults(results, newResults) {
    if (newResults.length) {
        if (results.length)
            results += '\n'
        results += newResults;
    }
    return results;
}

function compareParagraphLineRects(paragraphNumber1, paragraphNumber2, results) {
    var rects1 = getLineRects(paragraphNumber1);
    var rects2 = getLineRects(paragraphNumber2);
    if (rects1.length != rects2.length)
        results = appendResults(results, 'FAIL: different number of lines, got ' + rects1.length + ', expected ' + rects2.length);
    else {
        for (var i = 0; i < rects1.length; ++i) {
            if (rects2[i].width != rects1[i].width) {
                results = appendResults(results,
                    'FAIL: para[' + paragraphNumber1 + '] line[' + i + '] width differs from para[' + paragraphNumber2 + '] line[' + i + ']' +
                    ', got ' + rects1[i].width + ', expected ' + rects2[i].width);
            }
        }
    }
    return results;
}

var results = '';
for (var i = 0; i < 3; i++ )
    results = compareParagraphLineRects(i*2 + 1, i*2 + 1 + 6, results);
if (!results.length)
    results = 'PASS';
document.getElementById("results").innerText = results;
</script>
</body>
</html>
