<!DOCTYPE html>
<html>
<head>
<meta charset="shift-jis"> <!-- test breaks if the server overrides this -->
<title>shift-jis encoding (form)</title>
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="jis0208_index.js"></script>
<script src="sjis-encoder.js"></script>
<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
<link rel="help" href="https://encoding.spec.whatwg.org//#shift_jis">
<meta name="assert" content="The browser produces the same encoding behavior for a document labeled 'shift-jis' as for a document labeled 'euc-jp'.">
<style>
 iframe { display:none }
 form { display:none }
</style>
</head>
<body>
<div id="log"></div>
<script>
var tests = [];
var cplist = [];
var numTests = null;
var numFrames = 2;
var chunkSize = 500;
var numChunks = null;
var frames = null;
var frames = null;
var forms = null;
var separator = ",";
var encodedSeparator = encodeURIComponent(",");
var currentChunkIndex = 0;

setup(function() {
    // create a simple list of just those code points for which there is an encoding possible
    codepoints = [];
    for (var i = 0x80; i < 0xffff; i++) {
        result = sjisEncoder(String.fromCodePoint(i));
        if (result) {
            var item = {};
            codepoints.push(item);
            item.cp = i;
            item.expected = "%" + result.replace(/ /g, "%");
        }
    }

    // convert the information into a simple array of objects that can be easily traversed
    var currentChunk = [];
    var currentTests = [];
    cplist = [currentChunk];
    tests = [currentTests];
    for (i = 0; i < codepoints.length; i++) {
        if (currentChunk.length == chunkSize) {
            currentChunk = [];
            cplist.push(currentChunk);
            currentTests = [];
            tests.push(currentTests);
        }
        var item = {};
        currentChunk.push(item);
        item.cp = codepoints[i].cp;
        item.expected = codepoints[i].expected;
        currentTests.push(
            async_test(
                "U+" +
                    item.cp.toString(16).toUpperCase() +
                    " " +
                    String.fromCodePoint(item.cp) +
                    " " +
                    item.expected
            )
        );
    }

    numChunks = cplist.length;

    for (var i = 0; i < numFrames; i++) {
        var frame = document.createElement("iframe");
        frame.id = frame.name = "frame-" + i;
        document.body.appendChild(frame);
        var form = document.createElement("form");
        form.id = "form-" + i;
        form.method = "GET";
        form.action = "/common/blank.html";
        form.acceptCharset = "shift-jis";
        form.target = frame.id;
        var input = document.createElement("input");
        input.id = input.name = "input-" + i;
        form.appendChild(input);
        document.body.appendChild(form);
    }

    addEventListener("load", function() {
        frames = Array.prototype.slice.call(
            document.getElementsByTagName("iframe")
        );
        forms = Array.prototype.slice.call(
            document.getElementsByTagName("form")
        );
        inputs = Array.prototype.slice.call(
            document.getElementsByTagName("input")
        );
        for (var i = 0; i < Math.min(numFrames, numChunks); i++) {
            runNext(i);
        }
    });
});

function runNext(id) {
    var i = currentChunkIndex;
    currentChunkIndex += 1;

    var iframe = frames[id];
    var form = forms[id];
    var input = inputs[id];

    input.value = cplist[i]
        .map(function(x) {
            return String.fromCodePoint(x.cp);
        })
        .join(separator);
    form.submit();

    iframe.onload = function() {
        var url = iframe.contentWindow.location;
        var query = url.search;
        var result_string = query.substr(query.indexOf("=") + 1);
        var results = result_string.split(encodedSeparator);

        for (var j = 0; j < cplist[i].length; j++) {
            var t = tests[i][j];
            t.step(function() {
                assert_equals(
                    normalizeStr(results[j]),
                    normalizeStr(cplist[i][j].expected)
                );
            });
            t.done();
        }
        if (currentChunkIndex < numChunks) {
            runNext(id);
        }
    };
}
</script>
</body>
</html>
