// META: title=Web Locks API: steal option
// META: script=resources/helpers.js
// META: global=window,dedicatedworker,sharedworker,serviceworker

'use strict';

const never_settled = new Promise(resolve => { /* never */ });

promise_test(async t => {
  const res = uniqueName(t);
  let callback_called = false;
  await navigator.locks.request(res, {steal: true}, lock => {
    callback_called = true;
    assert_not_equals(lock, null, 'Lock should be granted');
  });
  assert_true(callback_called, 'Callback should be called');
}, 'Lock available');

promise_test(async t => {
  const res = uniqueName(t);
  let callback_called = false;

  // Grab and hold the lock.
  navigator.locks.request(res, lock => never_settled).catch(_ => {});

  // Steal it.
  await navigator.locks.request(res, {steal: true}, lock => {
    callback_called = true;
    assert_not_equals(lock, null, 'Lock should be granted');
  });

  assert_true(callback_called, 'Callback should be called');
}, 'Lock not available');

promise_test(async t => {
  const res = uniqueName(t);

  // Grab and hold the lock.
  const promise = navigator.locks.request(res, lock => never_settled);
  const assertion = promise_rejects(
    t, 'AbortError', promise, `Initial request's promise should reject`);

  // Steal it.
  await navigator.locks.request(res, {steal: true}, lock => {});

  await assertion;

}, `Broken lock's release promise rejects`);

promise_test(async t => {
  const res = uniqueName(t);

  // Grab and hold the lock.
  navigator.locks.request(res, lock => never_settled).catch(_ => {});

  // Make a request for it.
  let request_granted = false;
  const promise = navigator.locks.request(res, lock => {
    request_granted = true;
  });

  // Steal it.
  await navigator.locks.request(res, {steal: true}, lock => {
    assert_false(request_granted, 'Steal should override request');
  });

  await promise;
  assert_true(request_granted, 'Request should eventually be granted');

}, `Requested lock's release promise is deferred`);

promise_test(async t => {
  const res = uniqueName(t);

  // Grab and hold the lock.
  navigator.locks.request(res, lock => never_settled).catch(_ => {});

  // Steal it.
  let saw_abort = false;
  const first_steal = navigator.locks.request(
    res, {steal: true}, lock => never_settled).catch(error => {
      saw_abort = true;
    });

  // Steal it again.
  await navigator.locks.request(res, {steal: true}, lock => {});

  await first_steal;
  assert_true(saw_abort, 'First steal should have aborted');

}, 'Last caller wins');
