| <!DOCTYPE html> |
| <meta charset="utf-8"> |
| <title>Encoding: ISO-2022-JP unencodable replacement in form submission</title> |
| <link rel="help" href="https://encoding.spec.whatwg.org/#iso-2022-jp-encoder"> |
| <link rel="author" title="Benjamin C. Wiley Sittler" |
| href="mailto:bsittler@chromium.org"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script> |
| 'use strict'; |
| |
| promise_test(async testCase => { |
| const target = Object.assign(document.createElement('iframe'), { |
| name: 'target', |
| }); |
| if (document.readyState !== 'complete') { |
| await new Promise(resolve => addEventListener('load', resolve)); |
| } |
| document.body.insertBefore(target, document.body.firstChild); |
| const form = Object.assign(document.createElement('form'), { |
| acceptCharset: 'iso-2022-jp', |
| // NOTE: This uses escape and unescape rather than |
| // encodeURI/encodeURIComponent and decodeURI/decodeURIComponent |
| // intentionally, because: |
| // |
| // - escape() is required because encodeURI{,Component} encodes |
| // using UTF-8, and would falsely imply that non-ASCII |
| // characters are expected to work here -- which they won't, as |
| // the data URI has ISO-2022-JP charset; likewise |
| // |
| // - unescape() is required because the encoded byte sequence |
| // we're trying to decode and verify represents ISO-2022-JP data |
| // rather than the UTF-8 expected by decodeURI{,Component} |
| // |
| // The resulting document inside the IFRAME will look like: |
| // <body onload="..."><plaintext>?utf16=... |
| action: 'data:text/html;charset=iso-2022-jp,' + escape( |
| '<body onload="(' + |
| (() => parent.postMessage({ |
| utf16: document.body.innerText.split('=').pop(), |
| iso2022jp: unescape(location.href.split('=').pop()), |
| }, '*')) + |
| ')()"><plaintext>'), |
| target: target.name, |
| }); |
| form.appendChild(Object.assign(document.createElement('input'), { |
| name: 'utf16', |
| value: 'ABC~ยคโขโ
ๆ๐ๆโ
โขยค~XYZ', |
| })); |
| document.body.insertBefore(form, document.body.firstChild); |
| const {iso2022jp, utf16} = await new Promise(resolve => { |
| addEventListener('message', ({data}) => resolve(data)); |
| form.submit(); |
| }); |
| assert_equals(utf16, 'ABC~¤•โ
ๆ🌟ๆโ
•¤~XYZ'); |
| assert_equals( |
| iso2022jp, |
| 'ABC~¤•\x1b$B!z@1\x1b(B🌟\x1b$B@1!z\x1b(B•¤~XYZ'); |
| }, 'Form submission using ISO-2022-JP correctly replaces unencodables'); |
| |
| </script> |