<!DOCTYPE html>
<html lang="en-GB">
<head>
<meta charset="utf-8"/>
<title>x-sjis decoding</title>
<meta name="timeout" content="long">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org">
<link rel="help" href="https://encoding.spec.whatwg.org/#names-and-labels">
<meta name="assert" content="The browser produces the same decoding behavior for a document labeled 'x-sjis' as for a document labeled 'shift_jis'.">
<style>
 iframe { display:none }
</style>
<script src="jis0208_index.js"></script>
<script src="sjis-decoder.js"></script>
</head>

<body onload="showNodes();">

<iframe src="sjis_chars-x-sjis.html" name="scriptWindow" id="scrwin"></iframe>

<div id="log"></div>

<script>
var tests = [];

function iframeRef(frameRef) {
  return frameRef.contentWindow
    ? frameRef.contentWindow.document
    : frameRef.contentDocument;
}

function showNodes() {
  var iframe = iframeRef(document.getElementById("scrwin"));
  nodes = iframe.querySelectorAll("span");

  for (var i = 0; i < nodes.length; i++) {
    tests[i] = async_test(
      "U+" +
        nodes[i].dataset.cp +
        " " +
        String.fromCodePoint(parseInt(nodes[i].dataset.cp, 16)) +
        " " +
        sjisDecoder(nodes[i].dataset.bytes) +
        " " +
        nodes[i].dataset.bytes
    );
  }

  for (var i = 0; i < nodes.length; i++) {
    tests[i].step(function() {
      assert_equals(nodes[i].textContent, sjisDecoder(nodes[i].dataset.bytes));
    });
    tests[i].done();
  }
}
</script>
</body>
</html>
