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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
content / test / data / locks / locks.html [blame]
<title>Web Locks</title>
<script>
var unblock = {};
var blocked = {};
var next_request_id = 1;
function AcquireLock(lock_name) {
blocked[lock_name] = new Promise(r => { unblock[lock_name] = r; });
navigator.locks.request(lock_name, {}, async lock => {
await blocked[lock_name];
});
}
function StealLock(lock_name) {
blocked[lock_name] = new Promise(r => { unblock[lock_name] = r; });
navigator.locks.request(lock_name, {steal: true}, async lock => {
await blocked[lock_name];
});
}
function ReleaseLock(lock_name) {
unblock[lock_name]();
}
function AcquireReleaseLockFromDedicatedWorker() {
return new Promise(resolve => {
const worker = new Worker('dedicated_worker.js');
let data = {op: 'acquire_lock', rqid: next_request_id++};
worker.postMessage(data);
const listener = event => {
if (event.data.rqid !== data.rqid)
return;
worker.onmessage = undefined;
resolve(event.data);
};
worker.onmessage = listener;
});
}
function AcquireReleaseLockFromSharedWorker() {
return new Promise(resolve => {
const worker = new SharedWorker('shared_worker.js');
let data = {op: 'acquire_lock', rqid: next_request_id++};
worker.port.postMessage(data);
const listener = event => {
if (event.data.rqid !== data.rqid)
return;
worker.port.onmessage = undefined;
resolve(event.data);
};
worker.port.onmessage = listener;
});
}
function AcquireReleaseLockFromServiceWorker() {
return new Promise(async resolve => {
await navigator.serviceWorker.register('service_worker.js');
registration = await navigator.serviceWorker.ready;
var message_channel = new MessageChannel();
message_channel.port1.onmessage = event => {
if (event.data.rqid !== data.rqid)
return;
message_channel.port1.onmessage = undefined;
resolve(event.data);
}
let data = {op: 'acquire_lock', rqid: next_request_id++};
registration.active.postMessage(
data, [message_channel.port2]);
});
}
</script>