| // META: title=Web Locks API: Resources DOMString edge cases | |
| // META: global=window,dedicatedworker,sharedworker,serviceworker | |
| 'use strict'; | |
| function code_points(s) { | |
| return [...s] | |
| .map(c => '0x' + c.charCodeAt(0).toString(16).toUpperCase()) | |
| .join(' '); | |
| } | |
| [ | |
| '', // Empty strings | |
| 'abc\x00def', // Embedded NUL | |
| '\uD800', // Unpaired low surrogage | |
| '\uDC00', // Unpaired high surrogage | |
| '\uDC00\uD800', // Swapped surrogate pair | |
| '\uFFFF' // Non-character | |
| ].forEach(string => { | |
| promise_test(async t => { | |
| await navigator.locks.request(string, lock => { | |
| assert_equals(lock.name, string, | |
| 'Requested name matches granted name'); | |
| }); | |
| }, 'DOMString: ' + code_points(string)); | |
| }); | |
| promise_test(async t => { | |
| // '\uD800' treated as a USVString would become '\uFFFD'. | |
| await navigator.locks.request('\uD800', async lock => { | |
| assert_equals(lock.name, '\uD800'); | |
| // |lock| is held for the duration of this name. It | |
| // Should not block acquiring |lock2| with a distinct | |
| // DOMString. | |
| await navigator.locks.request('\uFFFD', lock2 => { | |
| assert_equals(lock2.name, '\uFFFD'); | |
| }); | |
| // If we did not time out, this passed. | |
| }); | |
| }, 'Resource names that are not valid UTF-16 are not mangled'); | |
| promise_test(async t => { | |
| for (const name of ['-', '-foo']) { | |
| await promise_rejects_dom( | |
| t, 'NotSupportedError', | |
| navigator.locks.request(name, lock => {}), | |
| 'Names starting with "-" should be rejected'); | |
| } | |
| let got_lock = false; | |
| await navigator.locks.request('x-anything', lock => { | |
| got_lock = true; | |
| }); | |
| assert_true(got_lock, 'Names with embedded "-" should be accepted'); | |
| }, 'Names cannot start with "-"'); |