// 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); }