<!DOCTYPE html>
<html>
<body>
<div id="test" contenteditable></div>
<dl>
<dt>Removed</dt>
<dd id="removed"></dd>
<dt>Preserved</dt>
<dd id="preserved"></dd>
<dt>Exceptions</dt>
<dd id="exceptions"></dd>
</dl>
<script type="text/javascript">

if (window.testRunner)
    testRunner.dumpAsText();

var elements = [ "noscript", "a", "abbr", "acronym", "address", "applet", "area", "article", "aside", "audio",
"b", "base", "basefont", "bdo", "bgsound", "big", "blockquote", "body", "br", "button",
"canvas", ["table", "caption"], "center", "cite", "code", ["table", "col"], ["table", "colgroup"], "command",
"datagrid", "datalist", "dcell", "dcol", "dd", "del", "details", "dfn", "dir", "div", "dl", "drow", "dt",
"em", "embed", "fieldset", "figcaption", "figure", "font", "footer", "form", "frame", "frameset",
"h1", "h2", "h3", "h4", "h5", "h6", "head", "header", "hgroup", "hr", "html",
"i", "iframe", "image", "img", "input", "ins", "isindex", "kbd", "keygen", "label", "layer", "legend", ["ul", "li"], "link", "listing",
"map", "mark", "marquee", "menu", "meta", "meter", "nav", "nobr", "noembed", "noframes", "nolayer", "noscript",
"object", "ol", "optgroup", "option", "p", "param", "plaintext", "pre", "progress", "q", "rp", "rt", "ruby",
"s", "samp", "script", "section", "select", "small", "source", "span", "strike", "strong", "style", "sub", "summary", "sup",
"table", ["table", "tbody"], ["table", "td"], "textarea", ["table", "tfoot"], ["table", "th"], ["table", "thead"],
"title", ["table", "tr"], "track", "tt", "u", "ul", "var", "video", "wbr", "xmp" ];

function addResult(container, name, annotation, description)
{
    if (container.innerHTML.length && !annotation)
        container.innerHTML += ', ';
    container.innerHTML += name;
    if (annotation)
        container.appendChild(document.createTextNode(" (" + annotation + ")"));
    if (description)
        container.appendChild(document.createTextNode(description));
    if (annotation || description)
        container.appendChild(document.createElement('br'));
}

function contains(node, descendant)
{
    while (descendant && descendant != node && descendant.parentNode)
        descendant = descendant.parentNode;
    return descendant == node;
}

var test = document.getElementById('test');
for (var i = 0; i < elements.length; i++) {
    var elementName;
    var instance = null;
    var container = null;
    if (typeof elements[i] == 'string') {
        elementName = elements[i];
        instance = document.createElement(elementName)
        container = instance;
    } else {
        var elementList = elements[i];
        for (var j = 0; j < elementList.length; j++) {
            var node = document.createElement(elementList[j]);
            if (!container)
                container = node;
            if (instance)
                instance.appendChild(node);
            instance = node;
        }
        elementName = elementList[elementList.length - 1];
    }
    var dummy_text = document.createTextNode('hello=1;');
    if (instance === undefined) {
        addResult(document.getElementById('exceptions'), elementName, test.innerHTML);
        continue;
    }
    test.innerHTML = "";
    try {
        instance.appendChild(dummy_text); // this may fail for non-container elements.
    } catch (error) { }
    test.appendChild(container);
    test.appendChild(document.createTextNode(' webkit=2;'));
    var ec = ''
    if (window.getSelection) {
        window.getSelection().selectAllChildren(test);
    } else {
        var range = document.body.createTextRange();
        range.moveToElementText(test.firstChild);
        try { range.select(); }
        catch (error) { ec += ' failed to select'; }
    }
    document.execCommand('removeFormat', false, null);

    if (ec) {
        addResult(document.getElementById('exceptions'), elementName, test.innerHTML, ec);
        continue;
    }

    if (!test.firstChild || test.firstChild.nodeType == 3 /*TextNode*/)
        addResult(document.getElementById('removed'), elementName)
    else if (contains(test, instance) && (instance.innerHTML == "" || instance.innerHTML == "hello=1;" || elementName == "keygen"))
        addResult(document.getElementById('preserved'), elementName);
    else
        addResult(document.getElementById('exceptions'), elementName, test.innerHTML);
}
document.body.removeChild(test);

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