<!DOCTYPE html>
<style>
#break-test {
    word-break:break-all;
    font:50px/1 Ahem;
    width:3em;
}
#result {
    font:15px/1 monospace;
    white-space:pre;
}
</style>
<div id="result"></div>
<div id="break-test"></div>
<script>
var beginChar = 33;
var endChar = 127;
var breakTest = document.getElementById("break-test");
var breakTestFontsize = parseFloat(getComputedStyle(breakTest).fontSize);
var nbsp = String.fromCharCode(0xA0);
nbsp = nbsp + nbsp;

var matrix = getLineBreakMatrix();

var header = [];
for (var i = 0; i < matrix.length; i++)
    header.push(String.fromCharCode(beginChar + i));
var rows = ["  " + header.join("")];
for (var i = 0; i < matrix.length; i++) {
    rows.push(String.fromCharCode(beginChar + i) + " " + matrix[i].map(function (canBreak) {
        return canBreak ? "/" : "X";
    }).join(""));
}
result.textContent = rows.join("\n");

function getLineBreakMatrix() {
    var matrix = [];
    for (var last = beginChar; last < endChar; last++) {
        var canBreakBefore = [];
        for (var current = beginChar; current < endChar; current++)
            canBreakBefore.push(canBreakBetween(last, current));
        matrix.push(canBreakBefore);
    }
    return matrix;
}

function canBreakBetween(last, current) {
    breakTest.textContent = nbsp + String.fromCharCode(last) + String.fromCharCode(current);
    return breakTest.offsetHeight / breakTestFontsize > 1.9;
}

breakTest.textContent = "";
if (window.testRunner)
    testRunner.dumpAsText();
</script>