summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/web-locks/resource-names.https.any.js
blob: 1031b3f7ba2e34129870db73088be0bc384ab2f8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// 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 "-"');