<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<style>
.resultsDiv {
    position: absolute;
    top: 0px;
    left: 0px;
    -moz-column-width: 13em;
    -moz-column-gap: 5em;
    -webkit-columns:1 1px; /* Make as many (overflowing) columns as necessary, but keep them as narrow as possible */
    -webkit-column-gap: 5em;
    -webkit-column-fill: auto;
    columns:1 1px;
    column-gap: 5em;
    column-fill: auto;
    height: 400px;
}
</style>
</head>
<body>
<div>This table shows unicode-bidi: isolate behavior (in red) with display: inline-block behavior overlapping in green.  You should see no red in this test!  Behavior between these two methods should be identical for non-wrapping strings, assuming unicode-bidi: isolate is implemented and functioning correctly.</div>

<div id="resultsContainer" style="position: relative">
<div id="actual" style="color: red" class="resultsDiv"></div>
<div id="expected" style="color: green;" class="resultsDiv"></div>
</div>

<script>
var seed = 0;

var neutrals = ['"', ")", "("];
var strongRTLs = ['ש', 'נ', 'ב', 'ג', 'ק', 'כ', 'ע'];
var strongLTRs = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
var neutral = function() { return neutrals[seed++ % neutrals.length]; }
var strongRTL = function() { return strongRTLs[seed++ % strongRTLs.length]; }
var strongLTR = function() { return strongLTRs[seed++ % strongLTRs.length]; }
var charClassExamples = [neutral, strongRTL, strongLTR];
var possibleDirs = ['ltr', 'rtl'];

var testStyle = "unicode-bidi: -webkit-isolate";
var controlStyle = "display: inline-block";

for (outerDirIndex in possibleDirs) {
    var outerDir = possibleDirs[outerDirIndex];
    for (beforeSpanIndex in charClassExamples) {
        var beforeSpan = charClassExamples[beforeSpanIndex];
        for (spanDirIndex in possibleDirs) {
            var spanDir = possibleDirs[spanDirIndex];
            for (inSpanIndex in charClassExamples) {
                var inSpan = charClassExamples[inSpanIndex];
                for (afterSpanIndex in charClassExamples) {
                    var afterSpan = charClassExamples[afterSpanIndex];
                    function caseWithStyle(spanStyle) {
                        seed = 0;
                        var outerDiv = document.createElement("div");
                        outerDiv.dir = outerDir;
                        outerDiv.appendChild(document.createTextNode(beforeSpan()));
                        var span = document.createElement("span");
                        span.dir = spanDir;
                        span.setAttribute("style", spanStyle)
                        span.appendChild(document.createTextNode(inSpan()));
                        outerDiv.appendChild(span);
                        outerDiv.appendChild(document.createTextNode(afterSpan()));
                        return outerDiv;
                    }
                    expected.appendChild(caseWithStyle(controlStyle));
                    actual.appendChild(caseWithStyle(testStyle));
                }
            }
        }
    }
}

</script>
</table>
</body>
</html>
