| <!DOCTYPE html> |
| <html> |
| <head> |
| <meta charset="gbk"> <!-- test breaks if the server overrides this --> |
| <title>GBK encoding errors (form, misc)</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="gbk_index.js"></script> |
| <script src="gbk-encoder.js"></script> |
| <link rel="author" title="Richard Ishida" href="mailto:ishida@w3.org"> |
| <link rel="help" href="http://www.w3.org/TR/encoding/#gbk"> |
| <meta name="assert" content="The browser produces percent-escaped character references for a URL produced by a form when encoding miscellaneous characters that are not in the gbk encoding."> |
| <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 seperator = "," |
| var encodedSeperator = encodeURIComponent(",") |
| var currentChunkIndex = 0 |
| |
| |
| setup(function() { |
| // set up a simple array of unicode codepoints that are not encoded |
| var codepoints = [] |
| |
| for (var i=0x80;i<0x4FF;i++) { |
| result = gbEncoder(String.fromCodePoint(i)) |
| if (!result) { |
| var item = {} |
| codepoints.push(item) |
| item.cp = i |
| item.expected = '%26%23'+item.cp+'%3B' |
| item.desc = 'latin, greek, cyrillic, etc ' |
| } |
| } |
| |
| for (i=0x2000;i<0x23FF;i++) { |
| result = gbEncoder(String.fromCodePoint(i)) |
| if (!result) { |
| var item = {} |
| codepoints.push(item) |
| item.cp = i |
| item.expected = '%26%23'+item.cp+'%3B' |
| item.desc = 'punctuation, currency, symbols ' |
| } |
| } |
| |
| |
| for (i=0x2460;i<0x26FF;i++) { |
| result = gbEncoder(String.fromCodePoint(i)) |
| if (!result) { |
| var item = {} |
| codepoints.push(item) |
| item.cp = i |
| item.expected = '%26%23'+item.cp+'%3B' |
| item.desc = 'enclosed chars and boxes ' |
| } |
| } |
| |
| for (i=0x3000;i<0x33FF;i++) { |
| result = gbEncoder(String.fromCodePoint(i)) |
| if (!result) { |
| var item = {} |
| codepoints.push(item) |
| item.cp = i |
| item.expected = '%26%23'+item.cp+'%3B' |
| item.desc = 'various asian ' |
| } |
| } |
| |
| for (i=0xFF00;i<0xFFEF;i++) { |
| result = gbEncoder(String.fromCodePoint(i)) |
| if (!result) { |
| var item = {} |
| codepoints.push(item) |
| item.cp = i |
| item.expected = '%26%23'+item.cp+'%3B' |
| item.desc = 'half/full width ' |
| } |
| } |
| |
| // 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 |
| item.desc = codepoints[i].desc |
| currentTests.push(async_test(item.desc+"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 = "dummy.html" |
| form.acceptCharset = "gbk" |
| 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(seperator); |
| 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(encodedSeperator) |
| |
| 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> |