46 lines
1.7 KiB
JavaScript
46 lines
1.7 KiB
JavaScript
// META: title=XMLHttpRequest.send(invalidUnicodeString)
|
|
|
|
const LEFT_SURROGATE = '\ud83d';
|
|
const RIGHT_SURROGATE = '\udc94';
|
|
|
|
// Unmatched surrogates should be replaced with the unicode replacement
|
|
// character, 0xFFFD. '$' in these templates is replaced with one of
|
|
// LEFT_SURROGATE or RIGHT_SURROGATE according to the test.
|
|
const TEMPLATES = {
|
|
'$': [239, 191, 189],
|
|
'$ab': [239, 191, 189, 97, 98],
|
|
'a$b': [97, 239, 191, 189, 98],
|
|
'ab$': [97, 98, 239, 191, 189],
|
|
};
|
|
|
|
for (const surrogate of [LEFT_SURROGATE, RIGHT_SURROGATE]) {
|
|
for (const [template, expected] of Object.entries(TEMPLATES)) {
|
|
const invalidString = template.replace('$', surrogate);
|
|
const printableString = template.replace(
|
|
'$', '\\u{' + surrogate.charCodeAt(0).toString(16) + '}');
|
|
async_test(t => {
|
|
xhrSendStringAndCheckResponseBody(t, invalidString, expected);
|
|
}, `invalid unicode '${printableString}' should be fixed with ` +
|
|
`replacement character`);
|
|
}
|
|
}
|
|
|
|
// For the sake of completeness, verify that matched surrogates work.
|
|
async_test(t => {
|
|
xhrSendStringAndCheckResponseBody(t, LEFT_SURROGATE + RIGHT_SURROGATE,
|
|
[240, 159, 146, 148]);
|
|
}, 'valid unicode should be sent correctly');
|
|
|
|
function xhrSendStringAndCheckResponseBody(t, string, expected) {
|
|
const xhr = new XMLHttpRequest();
|
|
xhr.responseType = 'arraybuffer';
|
|
xhr.onload = t.step_func(() => {
|
|
assert_equals(xhr.status, 200, 'status should be 200');
|
|
const actualBody = new Uint8Array(xhr.response);
|
|
assert_array_equals(actualBody, expected, 'content should match');
|
|
t.done();
|
|
});
|
|
xhr.onerror = t.unreached_func('no error should occur');
|
|
xhr.open('POST', 'resources/content.py', true);
|
|
xhr.send(string);
|
|
}
|